用带头结点的单链表表示整数集合,完成以下算法并分析时间复杂度:
(1)设计一个算法求两个集合A和B的并集运算,要求不破坏原有的单链表A和B.
(2)假设集合中的元素递增排列,设计一个高效算法求两个集合A和B的并集运算,要求不破坏原有的单链表A和B。
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode* next;
} LinkNode;
void CreatList(LinkNode*&L,int a[],int n)
{
LinkNode*p,*q;
L=(LinkNode* )malloc(sizeof(LinkNode));
q=L;
for(int i=0;i<n;i++)
{
p=(LinkNode * )malloc(sizeof(LinkNode));
p->data=a[i];
q->next=p;
q=p;
}
q->next=NULL;
}
void DispList(LinkNode* L)
{
LinkNode* p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
void UnionList2(LinkNode* A,LinkNode* B,LinkNode* &C) //第二问
{
LinkNode* pa, *pb,*p,*q;
pa=A->next;
pb=B->next;
C=(LinkNode * )malloc(sizeof(LinkNode));
q=C;
while(pa!=NULL && pb!=NULL)
{
p=(LinkNode * )malloc(sizeof(LinkNode));
if(pa->data < pb->data)
{
p->data=pa->data;
pa=pa->next;
}
else if(pa->data > pb->data)
{
p->data=pb->data;
pb=pb->next;
}
else
{
p->data=pa->data;
pa=pa->next;
pb=pb->next;
}
q->next=p;
q=p;
}
while(pa!=NULL)
{
p=(LinkNode * )malloc(sizeof(LinkNode));
p->data=pa->data;
q->next=p;
q=p;
pa=pa->next;
}
while(pb!=NULL)
{
p=(LinkNode * )malloc(sizeof(LinkNode));
p->data=pb->data;
q->next=p;
q=p;
pb=pb->next;
}
q->next=NULL;
}
void UnionList1(LinkNode* A,LinkNode* B,LinkNode* &C) //第一问
{
LinkNode*pa, *pb,*pc1,*pc2;
pa=A->next;
C=(LinkNode * )malloc(sizeof(LinkNode));
pc2=C;
int T; //辅助变量T
while(pa!=NULL)
{
for(pb=B->next;pb!=NULL;pb=pb->next)
{
T=1;
if(pa->data==pb->data) //若有重复数字
{ //则跳过a中的此数字
pa=pa->next;
T=0;
break;
}
}
if(T) //若T等于0说明这个数(pa->data)未判断是否与pb中的数重复
{
pc1=(LinkNode * )malloc(sizeof(LinkNode));
pc1->data=pa->data;
pc2->next=pc1;
pc2=pc1;
pa=pa->next;
}
}
pb=B->next;
while(pb!=NULL)
{
pc1=(LinkNode * )malloc(sizeof(LinkNode));
pc1->data=pb->data;
pc2->next=pc1;
pc2=pc1;
pb=pb->next;
}
pc2->next=NULL;
}
void main ()
{ //a1中只有7与b1不重复
int a1[7]={5,6,3,2,4,7,8}, b1[8]={1,3,5,6,12,2,4,8}; //a1,b1本身无重复,a1,b1之间有重复,无序
int a2[9]={0,2,4,5,6,7,8,9,11}, b2[7]={1,3,5,7,8,9,12}; //同上a1,b1,这里a2,b2为有序数列
LinkNode*LA,*LB,*LC,*A,*B,*C;
CreatList(LA,a1,7);
CreatList(LB,b1,8);
UnionList1(LA,LB,LC);
printf("第一问输出结果为:\n");
DispList(LC);
printf("\n");
CreatList(A,a2,9);
CreatList(B,b2,7);
UnionList2(A,B,C);
printf("第二问输出结果为:\n");
DispList(C);
}
第二种实现:
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode* next;
} LinkNode;
void CreatList(LinkNode*&L,int a[],int n)
{
LinkNode*p,*q;
L=(LinkNode* )malloc(sizeof(LinkNode));
q=L;
for(int i=0;i<n;i++)
{
p=(LinkNode * )malloc(sizeof(LinkNode));
p->data=a[i];
q->next=p;
q=p;
}
q->next=NULL;
}
void DispList(LinkNode* L)
{
LinkNode* p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
void bingji2(LinkNode* A,LinkNode* B,LinkNode* &C)
{
LinkNode* pa, *pb,*r,*s;
pa=A->next;
pb=B->next;
C=(LinkNode * )malloc(sizeof(LinkNode));
r=C;
while(pa!=NULL && pb!=NULL)
{
if(pa->data < pb->data)
{
s=(LinkNode * )malloc(sizeof(LinkNode));
s->data=pa->data;
r->next=s;
r=s;
pa=pa->next;
}
else if(pa->data > pb->data)
{
s=(LinkNode * )malloc(sizeof(LinkNode));
s->data=pb->data;
r->next=s;
r=s;
pb=pb->next;
}
else //pa->data == pb->data
{
s=(LinkNode * )malloc(sizeof(LinkNode));
s->data=pa->data;
r->next=s;
r=s;
pa=pa->next;
pb=pb->next;
}
}
while(pa!=NULL)
{
s=(LinkNode * )malloc(sizeof(LinkNode));
s->data=pa->data;
r->next=s;
r=s;
pa=pa->next;
}
while(pb!=NULL)
{
s=(LinkNode * )malloc(sizeof(LinkNode));
s->data=pb->data;
r->next=s;
r=s;
pb=pb->next;
}
r->next=NULL;
}
void bingji1(LinkNode* A,LinkNode* B,LinkNode* &C)
{
LinkNode* pa, *pb,*p,*q,*prior,*Delete;
pa=A->next;
pb=B->next;
C=(LinkNode * )malloc(sizeof(LinkNode));
q=C;
while(pa!=NULL)
{
p=(LinkNode * )malloc(sizeof(LinkNode));
p->data=pa->data;
q->next=p;
q=p;
pa=pa->next;
}
while(pb!=NULL)
{
p=(LinkNode * )malloc(sizeof(LinkNode));
p->data=pb->data;
q->next=p;
q=p;
pb=pb->next;
}
q->next=NULL;
q=C;
for(q=C;q!=NULL;q=q->next)
{
prior=q;
for(p=q->next;p!=NULL;p=p->next)
{
if(p->data==q->data)
{
prior->next=p->next;
free(p);
p=prior->next;
continue;
}
prior=p;
}
}
}
int main()
{
int a[9]={1,2,4,5,6,7,8,9,11};
int b[7]={1,3,5,7,8,9,12};
LinkNode*LA,*LB,*LC;
CreatList(LA,a,9);
CreatList(LB,b,7);
bingji1(LA,LB,LC);
DispList(LC);
printf("\n");
bingji2(LA,LB,LC);
DispList(LC);
printf("\n");
}