C语言从结构体到链表(二)
上一篇说了结构体到链表的一部部产生过程,并介绍了链表节点的增添与删减。接下来我们继续对链表操作:链表插入,节点的删除,链表的排序,链表的释放,链表的逆序。
链表的插入:
链表的插入和上一篇增加很相似,从操作上来说插入就是多一种链表中间添加的操作。这个操作的前提是链表之前已按一定的排序方式排好顺序了,我们插入操作不会破坏原来顺序。而我们想要达到相同的效果也可以先随意添加再进行依次排序。
基本原理如图
STU* link_insert(STU *head,STU tem)
{
STU *pb=NULL;
STU *pf=NULL;
STU *pi = (STU *)malloc(sizeof(STU));
if( pi = NULL)
{
printf("申请失败!");
return head;
}else{
printf("申请成功!\n");
*pi = tem;
pi->next = NULL;
}
//寻找插入点
pb = head;
pf = head;
while(pb->ID < pi->ID&&pb->next != NULL)
{
pf = pb;
pb = pb->next;
}
//插入
if(pb = head)
{
pi->next = head;
head = pi;
}else if(pb->next = NULL)//这里和图中不一样 这里是把两边排除后得到中间
{
pb->next = pi;
pi->next = NULL;
}else{
pf->next = pi;
pi->next = pb;
}
return head;
}
节点的删除:
节点的删除基本思想是:把要删除节点前面的节点的指向指向要删除节点的指向的下一个,然后释放该要删除的节点。
STU* point_delete(STU *head,char *Name)
{
STU *pb=head;
STU *pf=head;
//寻找删除点
while(strcmp(pb->Name,*Name)!=0&&pb->next!=NULL)
{
pf = pb;
pb = pb->next;
}
//删除操作
if(pb == head)
{
head = pb->next;
free(pb);
}else
{
pf->next = pb->next;
free(pb);
}
return head;
}
链表的排序:
STU* link_sort(STU* head)
{
STU *p_min;//存放最小值的
STU *p_i,*p_j;//循环里的 i,j
p_i = p_min =head;//初始化
while(p_i->next!=NULL)//外层循环
{
p_j = p_i->next;
while(p_j != NULL)//内层循环
{
if(p_min->ID>p_j->ID)
{
p_min = p_j;
p_j = p_j->next;
}
}
//数据交换
if(p_i != p_min)
{
//交换数据+指向地址
STU *temp;
temp = p_i;
p_i = p_min;
p_min = temp;
//换地址
temp->next = p_i->next;
p_i->next = p_min->next;//这儿一定要理清
p_min->next = temp->next;
}
p_i = p_i->next;//i++
}
return head;
}
链表释放:
链表的释放就是把每个节点都释放掉,基本思想就是把链表遍历一遍,边遍历边释放。
STU* link_delete(STU* head)
{
STU* pb = head;
if(head == NULL)
{
printf("链表为空,不用释放\n");
return head;
}
while(pb != NULL)
{
head = pb->next;
free(pb);
pb = head;
}
printf("链表已释放!");
return head;
}
链表的逆序:
逆序有两种形式:一种是采用一个存放指针的指针变量+一个指向变量,来不断往前插入增添。
第二种形式就是我们想的,将链表中的指针指向逆序。实现这个的大致思路:从前往后用两个中间变量加head过一个变一个方向。
STU *link_reverse(STU* head)
{
STU *pt=NULL;//设置两个变量为下面准备
STU *pr=NULL;
pt = head->next;
head->next = NULL;
while(pt!=NULL)
{
pr = pt;//pr跟着pt往后走
pt = pt->next;
pr->next = head;
head = pr;//head跟着pr往后走
}
return NULL;
}