单链表
1、链表的创建
由于需要改变主函数头指针的值,所以将头指针的地址传给一个二级指针
int create_list(pnode *head)
{
if((*head = (pnode)malloc(sizeof(node))) == NULL)
{
return -1; //失败返回-1
}
(*head)->data = -1; //-1表示头指针不存储内容
(*head)->next = NULL;
return 0; //成功返回0
}
2、头插法
申请空间创建一个新的节点,让该节点的next指向头指针的下一个节点,然后让头指针的next指向该节点
void head_insert_list(pnode head,int d)
{
pnode p = (pnode)malloc(sizeof(node));
if(p == NULL)
{
return;
}
p->data = d; //申请新的空间并存值
p->next = head->next; //让p的next指针指向head的next所指向的空间
head->next = p; //让head的next指向p
return;
}
3、尾插法
申请空间创建一个新的节点,然后找到该链表的最后一个节点,让最后一个节点的next指向新的节点
void tail_insert_list(pnode head,int d)
{
pnode p = (pnode)malloc(sizeof(node));
if(p == NULL)
{
return;
}
p->data = d; //申请新的空间并存值
p->next = NULL;
while(head->next != NULL)
{
head = head->next; //找到链表的尾部
}
head->next = p; //让链表的尾部指向p
return;
}
4、链表的遍历
void print_list(pnode head)
{
head = head->next;
while(head != NULL)
{
printf("%d ",head->data);
head = head->next;
}
printf("\n");
return;
}
5、链表的排序
这里采用冒泡排序法
void bubble_sort_list(pnode head)
{
if(head == NULL || head->next == NULL || head->next->next == NULL)
{
return; //当头结点没有空间、链表没有或者只有一个元素的时候不需要排序
}
pnode end = NULL,p = NULL,front = NULL;
//end表示未排序部分的终点
while(head->next != end)
{
front = head;
p = head->next;
while(p->next != end)
{
if(p->data > p->next->data)
{
front->next = p->next;
p->next = p->next->next;
front->next->next = p;
//对节点进行交换
p = front->next;
//使p重新指向front的下一个节点
}
front = front->next;
p = p->next;
}
end = p;
}
return;
}
6、链表的查找
pnode find_list(pnode head,int d)
{
head = head->next;
while(head != NULL)
{
if(head->data == d)
{
return head; //找到返回地址
}
head = head->next;
}
return NULL; //未找到返回空
}
7、链表节点的删除
首先找到存储要删除数据的节点,然后该节点的上一个节点指向该节点的下一个节点,释放该节点
void delete_list(pnode head,int d)
{
pnode front = head;
head = head->next;
while(head != NULL)
{
if(head->data == d)
{
break;
}
front = head;
head = head->next;
}
if(head != NULL)
{
front->next = head->next; //找到节点后将上一节点指向下一节点然后删除该节点
free(head);
}
return;
}
8、链表的释放
void destroy_list(pnode head)
{
pnode p;
while(head != NULL)
{
p = head->next;
free(head);
head = p;
}
}
9、顺序插入
申请空间创建一个新的节点,找到第一个存储的数据大于新的节点存储的数据的节点,然后让该节点的上一个节点的next指向新的节点,让新的指点的next指向该节点。该方法只适用于链表本身是有序的。
void order_insert_list(pnode head,int d)
{
pnode front = head;
head = head->next;
pnode p = (pnode)malloc(sizeof(node));
if(p == NULL)
{
return;
}
p->data = d;
p->next = NULL;
while(head != NULL)
{
if(head->data > d)
{
break;
}
front = head;
head = head->next;
}
front->next = p;
p->next = head;
}