c语言实现单链表的合并 归并算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
typedef struct Node
{
int data;
struct Node *next;
}Node, *LinkList;
LinkList LA,LB,LC;
void InitList(LinkList *L) //初始化单链表
{
*L=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL;
}
void EnterList(LinkList &L) //尾插法创建单链表。{
Node *s,*r;
int flag=1,integer;
r=L;
while(flag)
{
scanf("%d",&integer);
if(integer != -1)
{
s=(Node*)malloc(sizeof(Node));
s->data=integer;
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL;
}
}
}
void UnionList(LinkList &LA,LinkList &LB,LinkList &LC) {
Node *p,*q,*r,*y;
p=LA->next;
q=LB->next;
r=LC;
while (p)
{
y=(Node*)malloc(sizeof(Node));
y->data=p->data;
r->next=y;
r=y;
p=p->next;
}
while (q)
{
y=(Node*)malloc(sizeof(Node));
y->data=q->data;
r->next=y;
r=y;
q=q->next;
}
r->next=NULL;
}
void DeSameList(LinkList *LC)//删除c表的相同元素。{
Node *p,*q,*r;
for(p=(*LC)->next;p!=NULL;p=p->next)
for(q=p->next,r=p;q!=NULL;q=q->next)
if(q->data==p->data)
{
r->next=q->next;
free(q);
q=r;
}
else
r=r->next;
}
void MergeList(LinkList *LA,LinkList *LB,LinkList *LC) { /*归并算法*/
Node *p,*q,*r;
p=(*LA)->next;
q=(*LB)->next;
*LC=*LA;
(*LC)->next=NULL;
r=*LC;
while(p != NULL && q !=NULL)
{
if(p->data <= q->data)
{
r->next=p;
r=p;
p=p->next;
}
else
{
r->next=q;
r=q;
q=q->next;
}
r->next=p?p:q;
}
free(*LB);
}
void printList(LinkList *L) {
Node *p=(*L)->next;
while(p!=NULL)
{
printf("%3d",p->data);
p=p->next;
}
printf("\n");
}
void DestroyList(LinkList *L) //清空链表
{ Node *p,*r; p=*L;
while(!p->next)
{ r=p;
p=p->next;
free(r); }
printf("删除成功!"); }
void first()
{
printf("请输入顺序表LA(当输入-1时结束):\n");
InitList(&LA);
EnterList(LA);
printf("请输入顺序表LB(当输入-1时结束):\n");
InitList(&LB);
EnterList(LB);
printf("表LA和表LB合并后表LC为:");
InitList(&LC);
UnionList(LA,LB,LC);
DeSameList(&LC);
printList(&LC);
printf("表LA和表LB归并后表LC为:");
MergeList(&LA,&LB,&LC);
printList(&LC);
}
void decide()
{int s;printf("1重新开始\n2退出\n");
scanf("%d",&s);
if(s==1){system("cls");
first();}
else if(s==2)exit(0);
else printf("Error!!! try again,!");
decide();
}