#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define OK 1
#define error 0
#define overflow -2
typedef int elemtype;
typedef int status;
//单链表的存储结构
typedef struct LNode
{
elemtype data;//结点的数据域
struct LNode *next;//结点的指针域
}LNode,*linklist;//linklist为指向结构体LNode的指针类型
//单链表的初始化
status initlist(linklist &l)//构造一个空的单链表
{
l=new LNode;//生成新结点为头结点
l->next=NULL;//头结点的指针域为空
return OK;
}
//后插法创建单链表
status createlist(linklist &l,int n)
{
l=new LNode;
l->next=NULL;//先建立带头结点的空链表
linklist r=l;//尾指针r指向头结点
for(int i=0;i<n;i++)
{
linklist p=new LNode;//生成新结点
printf("请输入第%d个数字\n",i+1);
scanf("%d",&p->data);//课本上这两行语句表示成 cin>>next=NULL(输入元素值赋给新结点*p的数据域)
p->next=NULL; r->next=p;//将新结点*p插入尾结点*r之后
r=p;//r指向新的尾结点*p
}
}
status mergelist(linklist &la,linklist &lb,linklist &lc)
{
linklist pa=la->next;linklist pb=lb->next;//pa和pb的初值分别指向两个表的第一个结点(首元结点)
linklist pc;linklist r;
lc=la;//用la的头结点作为lc的头结点
pc=lc;//pc的初值指向lc的头结点
while(pa&&pb)
{
if(pa->data < pb->data)
{
pc->next=pa;//摘取pa所指结点
pc=pa;//pc指向pa
pa=pa->next;//pa指向下一结点
}
else if (pa->data==pb->data)
{
pc->next=pa;//摘取pa所指结点
pc=pa;//pc指向pa
pa=pa->next;//pa指向下一结点
r=pb;//将pb赋值给r
pb=pb->next;//pb指向下一结点
delete r;//删除原来的pb
}
else
{
pc->next=pb;//摘取pb所指结点
pc=pa;//pc指向pb
pa=pa->next;//pb指向下一结点
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;//将非空表的剩余段插入到pc所指结点之后
delete lb;//释放lb的头结点
}
status output(linklist &lc)
{
linklist pc=lc;//pc的初值指向lc的头结点
pc=lc->next;
while(pc)
{
printf("%2d",pc->data);
pc=pc->next;
}
}
int main()
{
linklist la,lb,lc;
initlist(la);
initlist(lb);
int n1,n2;
printf("请输入每条链表的个数\n");
scanf("%d %d",&n1,&n2);
printf("请输入第一个链表的数据\n");
createlist(la,n1);
printf("请输入第二个链表的数据\n");
createlist(lb,n2);
mergelist(la,lb,lc);
output(lc);
}
两非递减单链表合并为无重复的非递减单链表
最新推荐文章于 2024-09-15 11:59:30 发布