设有两个无头结点的单链表,头指针分别为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("\n");
}
int main()
{
int n,m;
scanf("%d",&n); ///ha
LinkList ha=CreateLink(n);
scanf("%d",&m); ///hb
LinkList hb=CreateLink(m);
printf("\nBefore MergeList\n");
print(ha);
print(hb);
ha=MergeList(ha,hb);
printf("After MergeList\n");
print(ha);
print(hb);
return 0;
}
/**
6
1 5 7 9 34 75
5
0 4 5 5 76
*/
实验结果,hb插入ha中,并且hb不变,ha仍然递增