用c类实现链表初始化,头插、尾插、中间插、删除结点、删除链表、初始化链表获取链表长度,拷贝构造函数,析构函数
时间: 2023-08-17 15:05:24 浏览: 38
好的,下面是用C语言实现链表的相关函数:
```c
#include <stdio.h>
#include <stdlib.h>
//定义链表节点结构体
typedef struct Node{
int data;
struct Node *next;
}Node;
//链表初始化
void initList(Node **head){
*head = NULL;
}
//头插
void insertHead(Node **head, int value){
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = value;
newNode->next = *head;
*head = newNode;
}
//尾插
void insertTail(Node **head, int value){
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = value;
newNode->next = NULL;
if(*head == NULL){
*head = newNode;
}else{
Node *p = *head;
while(p->next != NULL){
p = p->next;
}
p->next = newNode;
}
}
//中间插
void insertMid(Node **head, int value, int pos){
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = value;
newNode->next = NULL;
if(pos == 1){
newNode->next = *head;
*head = newNode;
return;
}
Node *p = *head;
for(int i=1; i<pos-1 && p!=NULL; i++){
p = p->next;
}
if(p == NULL){
printf("插入位置无效!\n");
return;
}
newNode->next = p->next;
p->next = newNode;
}
//删除节点
void deleteNode(Node **head, int value){
Node *p = *head;
Node *pre = NULL;
while(p != NULL && p->data != value){
pre = p;
p = p->next;
}
if(p == NULL){
printf("链表中不存在该节点!\n");
return;
}
if(pre == NULL){
*head = p->next;
}else{
pre->next = p->next;
}
free(p);
}
//删除链表
void deleteList(Node **head){
Node *p = *head;
while(p != NULL){
Node *temp = p;
p = p->next;
free(temp);
}
*head = NULL;
}
//获取链表长度
int getListLength(Node *head){
int count = 0;
Node *p = head;
while(p != NULL){
count++;
p = p->next;
}
return count;
}
//拷贝构造函数
void copyList(Node **newHead, Node *oldHead){
Node *p = oldHead;
while(p != NULL){
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = p->data;
newNode->next = NULL;
if(*newHead == NULL){
*newHead = newNode;
}else{
Node *q = *newHead;
while(q->next != NULL){
q = q->next;
}
q->next = newNode;
}
p = p->next;
}
}
//析构函数
void destroyList(Node **head){
deleteList(head);
}
//测试
int main(){
Node *head;
initList(&head);
insertHead(&head, 3);
insertHead(&head, 2);
insertHead(&head, 1);
insertTail(&head, 4);
insertTail(&head, 5);
insertMid(&head, 6, 4);
deleteNode(&head, 3);
printf("链表长度为:%d\n", getListLength(head));
Node *newHead = NULL;
copyList(&newHead, head);
printf("拷贝后的链表长度为:%d\n", getListLength(newHead));
destroyList(&head);
printf("链表已销毁!\n");
return 0;
}
```