vlambda博客
学习文章列表

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;}