数据结构:求集合并集

用带头结点的单链表表示整数集合,完成以下算法并分析时间复杂度:

(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");
	 
}









  • 13
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值