无表头单链表的总结----两个链表合并
Posted 新爱代
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无表头单链表的总结----两个链表合并相关的知识,希望对你有一定的参考价值。
#include"head.h" struct Student* insert(struct Student*ahead, struct Student*bhead) { struct Student *pa1, *pa2, *pb1, *pb2; pa1 = pa2 = ahead; pb1 = pb2 = bhead; if ((ahead != NULL)&&(bhead != NULL)) { do { while ((pb1->num > pa1->num) && (pa1->next != NULL)) //先找到要插入的位置 { pa2 = pa1; pa1 = pa1->next; //pa1在前,pa2在后 } if (pb1->num <= pa1->num) { if (pa1 == ahead) ahead = pb1; //pb1往上要么把插入的链表链接到头指针 else pa2->next = pb1;//pb1往上要么把插入的链表链接到pa2->nex pb1 = pb1->next; //先把pb1往下一个要插的节点移,释放pb1 pb2->next = pa1;//往下把插入的节点连接到原列表pa1处 pa2 = pb2;//把pa2指向刚插入的链表pb2,与pa1挨着,回归原始状态 pb2 = pb1;//再把pb2移到pb1处,回归原始状态 } } while ((pa1->next != NULL) || (pb1 != NULL&&pa1 == NULL)); //循环条件,还没有指向原链表最后一个元素或者pb还有元素且原列表不空 if ((pb1 != NULL) && (pb1->num > pa1->num) && (pa1->next == NULL)) pa1->next = pb1; //原列表已经插到最后了 } else if ((ahead == NULL) && (bhead != NULL)) ahead = bhead; return ahead; } //分四种情况,{alist=null,blist=null},{ alist!=null,blist=null },{ //alist=null,blist=!null }, //{ alist=!null,blist=!null },第四种最复杂。
以上是关于无表头单链表的总结----两个链表合并的主要内容,如果未能解决你的问题,请参考以下文章