1. 程式人生 > >帶頭結點的兩個連結串列La,Lb,將兩個連結串列合併到La中,並且不破壞Lb的結構

帶頭結點的兩個連結串列La,Lb,將兩個連結串列合併到La中,並且不破壞Lb的結構

#include<stdio.h>
#include<malloc.h>

typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;

void CreateList(LinkList &L,int n)
{
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
LinkList r=L;
LinkList p;
int i;
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
r->next=p;
r=p;
}
r->next=NULL;
}

void Visit(LinkList L)
{
LinkList p;
p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}

void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc)
{
LinkList pa=La->next;
LinkList pb=Lb->next;
LinkList pc=La;
Lc=La;
int a[100];
int i=0;
int j;
LinkList f=Lb->next;
while(f)
{
a[i]=f->data;
f=f->next;
i++;
}
while(pa && pb)
{
if(pa->data < pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else if(pa->data > pb->data)
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
else
{
pc->next=pa;
pc=pa;
pa=pa->next;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
free(Lb);
Lb=(LinkList)malloc(sizeof(LNode));
Lb->next=NULL;
LinkList r=Lb;
LinkList p;
for(j=0;j<i;j++)
{
p=(LinkList)malloc(sizeof(LNode));
p->data=a[j];
r->next=p;
r=p;
}
r->next=NULL;
}

int main()
{
LinkList a;
LinkList p;

CreateList(p,3);
// Visit(p);
// printf("\n");

LinkList q;
CreateList(q,3);
// Visit(q);
// printf("\n");

MergeList(p,q,a);
Visit(p);
printf("\n");
Visit(q);
printf("\n");
// Visit(a);
// printf("\n");
return 0;
}

執行結果