链表的节点类型定义
typedef struct LinkNode{
int value;
struct LinkNode *next;
}LNode, *LinkList;
头插法创建链表
LinkList headInsert(LNode *head){
//创建头结点
head = (LinkList)malloc(sizeof(LNode));
head->value = 0;
head->next = NULL;
//头插法建立链表
int num = 0;
scanf("%d", &num);
while(num != 9999){
LinkList temp = malloc(sizeof(LNode));
temp->value = num;
temp->next = head->next;
head->next = temp;
scanf("%d", &num);
}
return head;
}
尾插法建立链表
LinkList tailInsert(LinkList head){
//创建头结点
head = (LinkList)malloc(sizeof(LNode));
head->value = 0;
head->next = NULL;
//尾插法建立链表
LinkList p = head;
int num = 0;
scanf("%d", &num);
while(num != 9999){
LinkList temp = (LinkList)malloc(sizeof(LNode));
temp->value = num;
temp->next = NULL;
p->next = temp;
p = temp;
scanf("%d", &num);
}
return head;
}
计算链表的长度
int LinkListLength(LinkList head){
int count = 1;
head = head->next;
while(head != NULL){
count++;
head = head->next;
}
return count;
}
遍历链表
void display(LinkList head){
if(head->next == NULL){
//printf("1111");
return;
}
head = head->next;
while(head != NULL){
printf("%d ", head->value);
head = head->next;
}
}
在链表中根据位置插入链表
LinkList insertLinkList(LinkList head, int pos, int val){
if(head == NULL){
return NULL;
}
int length = LinkListLength(head);
if(pos < 0 | pos > length){
printf("插入位置不合法!");
return NULL;
}
LinkList p = head;
while(pos != 0){
p = p->next;
pos--;
}
LinkList temp = (LinkList)malloc(sizeof(LNode));
temp->value = val;
temp->next = p->next;
p->next = temp;
return head;
}
根据节点的值删除链表
LinkList deleteLNode(LinkList head, int val){
LinkList p =head;
while(p->next != NULL){
if(p->next->value != val){
p = p->next;
} else{
LinkList temp = p->next;
p->next = p->next->next;
if(temp != NULL){
free(temp);
temp = NULL;
}
}
}
return head;
}
根据值来查找链表节点,返回该节点在链表中的位置
int findLNode(LinkList head, int val){
int count = 0;
LinkList p = head->next;
while(p != NULL){
if(p->value != val){
count++;
p = p->next;
} else{
break;
}
}
return count + 1;
}
清空链表(只剩下头结点)
LinkList clearLinkList(LinkList head){
while(head->next != NULL){
LinkList temp = head->next;
head->next = head->next->next;
if(temp != NULL){
free(temp);
temp = NULL;
}
}
return head;
}
销毁链表
void destroyLinkList(LinkList head){
//首先将除头结点外的其他节点free掉
head = clearLinkList(head);
if(head != NULL){
free(head);
head = NULL;
}
}
链表翻转
LinkList LinkListReverse(LinkList head){
LinkList p = head->next;
LinkList cur = p;
LinkList pre = NULL;
while(cur != NULL){
p = cur;
cur = cur->next;
p->next = pre;
pre = p;
}
head->next = p;
return head;
}