合并有序表( 二 )

length){LC->data[k] = LA->data[i];k++;i++; //相应的LA指针向后移动}//经过第一轮循环插入,,LA已经扫描插入完了, LB尚未扫描插入完 , 将LB其余元素插入到 Lc中while(jdata[k] = LB->data[j];j++; //相应的LB指针向后移动k++; //元素加一,位序后移}}
采用单链表存放有序表时的归并算法:
和上面那个问题一样 , 同样的思路 ,不多赘述了 ,区别就是 遍历两个链表的指针不一样 ,插入的赋值操作不一样 , 其他的算法思路都是一样的, 下面直接上代码:
//传入单链表LA,LB,和创建的链表LCvoid UnionList1(LinkList *LA, LinkList*LB , LinkList *&LC){//定义指向LA和LB的指针 LinkList *pa = LA ->next, *pb = LB->next;//构建链表C的头结点 , 我们把LA和LB的新元素插入到LC 需要利用尾插法,//尾插法需要尾指针定位到LC的最后一个节点LinkList *r; //指向LC的尾结点的指针LinkList *s; //向LC的新节点的指针LC = (LinkList *)malloc(sizeof(LinkList));//刚开始,尾指针指向LC的头结点,LC的尾指针置空 r=Lc;LC->next = NULL;//下面开始插入://LA 和 LB 均未到达末尾时,泽其小优先尾插while(pa!=NULL && pb !=NULL){//为了不破坏LA和LB,要另起灶炉,构建新节点s = (LinkList *)malloc(sizeof(LinkList));//如果指向LA的指针的数据小于LB的指针数据, 就把La的指针pa 数据赋值给新节点数据if(pa->data < pb -> data){s->data = http://www.kingceram.com/post/pla ->data;//LA指针后移pa = pa ->next;//对LC进行尾插法r ->next=s;r=s;}else //同理:{s->data = http://www.kingceram.com/post/pb->data;//LB指针后移pb = pb->next;//对LC进行尾插法r ->next=s;r=s;}}//经过上一步的交替插入,要么两个表交替插入完了,要么是下面两者之一//LB已经扫描插入完了, LA尚未扫描插入完 , 将其余元素插入到 Lc中while(pa!=NULL){s = (LinkList *)malloc(sizeof(LinkList));//LA指针送给的数据指向新节点s->data = http://www.kingceram.com/post/pa->data;//下面开始头插法r->next = s;r = s;//LA指针后移pa = pa ->next;}//LA已经扫描插入完了, LB尚未扫描插入完 , 将其余元素插入到 Lc中while(pb!=NULL){s = (LinkList *)malloc(sizeof(LinkList));//LA指针送给的数据指向新节点s->data = http://www.kingceram.com/post/pb->data;//下面开始头插法r->next = s;r = s;//LB指针后移pb = pb ->next;}}