设有两个无头结点的单链表,头指针分别为ha。hb,链中有数据域data。链域next。两链表的数据都按递增序存放,现要求将hb表归到ha表中,且归并后ha仍递增序,归并中ha表中已有的数据若hb中也有,则hb中的数据不归并到ha中,hb的链表在算法中不同意破坏。
#include<stdio.h> /// no have dead node ha and hb >>ha #include<stdlib.h> typedef int ElemType; typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList; LinkList CreateLink(int n) /// 创建表 { LinkList h=(LinkList)malloc(sizeof(LNode)),q; scanf("%d",&h->data); h->next=NULL; q=h; for(int i=1;i<n;i++){ LinkList p=(LinkList)malloc(sizeof(LNode)); scanf("%d",&p->data); p->next=NULL; q->next=p; q=p; } return h; /// 返回头指针 } void print(LinkList h); LinkList MergeList(LinkList ha,LinkList hb) { LinkList p,hc,pc; p=(LinkList)malloc(sizeof(LNode)); p->next=NULL; hc=pc=p; while(ha&&hb) { if(ha->data < hb->data){ p=(LinkList)malloc(sizeof(LNode)); p->next=NULL; p->data=ha->data; pc->next=p;pc=p;ha=ha->next; } else if(ha->data > hb->data){ p=(LinkList)malloc(sizeof(LNode)); p->next=NULL; p->data=hb->data; pc->next=p;pc=p;hb=hb->next; } else{ /** p=(LinkList)malloc(sizeof(LNode)); p->next=NULL; p->data=ha->data; pc->next=p; pc=p; ha=ha->next; */ hb=hb->next; /// ha中有hb的元素,hb直接指向下一结点 } } pc->next=ha?ha:hb; /// 指向剩余的链表 return hc->next; /// 返回无头结点的指针 } void print(LinkList h) { while(h!=NULL){ printf("%d ",h->data); h=h->next; } printf(" "); } int main() { int n,m; scanf("%d",&n); ///ha LinkList ha=CreateLink(n); scanf("%d",&m); ///hb LinkList hb=CreateLink(m); printf(" Before MergeList "); print(ha); print(hb); ha=MergeList(ha,hb); printf("After MergeList "); print(ha); print(hb); return 0; } /** 6 1 5 7 9 34 75 5 0 4 5 5 76 */
实验结果,hb插入ha中,而且hb不变,ha仍然递增