2个集合的交集和并集(单链表)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/********************************************************
function: 使用单链表作为数据结构求2个集合的交集和并集
programmer: LiCuixia@安师数计学院12软件
helper:LiuMenglu@安师数计学院12软件
data: 2014.2.26
idea:主要是使用while循环语句
******************************************************/
#include
#include
#include
typedef struct LNode
{
char data;
struct LNode *next;
}LNode,*LinkList;
void InitList_L(LinkList &L)//初始化单链表
{
//memset(L->data,'/0',sizeof(LNode));//memset(L->data,'/0',sizeof(LNode))为什么不能用?
L=(LinkList)malloc(sizeof(LNode)); //创建头结点
L->next=NULL;
}
void OutputList_L(LinkList &L)//输出单链表
{
LinkList q;
q=L;
printf("{");
if(q->next!=NULL)
putchar(q->next->data);
q=q->next;
while(q->next!=NULL)
{
printf(",");
putchar(q->next->data);
q=q->next;
}
printf("}");
}
void addList_L(LinkList &L1,LinkList &L2)//求L1和L2两个集合的并集,并连接到L2上(即最终L2未集合的并集)
{
LinkList p,q,s;//p,q是分别指向L1,L2结点的指针
p=L1;
q=L2;
while(p->next!=NULL)
{
while(q->next!=NULL)
{
if(p->next->data==q->next->data)
break;
// else
q=q->next;
}
if(q->next==NULL)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=p->next->data;
s->next=NULL;
q->next=s;
//p->next=p->next->next;
}
p=p->next;
q=L2;//q回到L2的头结点
}
}
void minusList_L(LinkList L1, LinkList L2,LinkList &L3)//求L1,L2两集合的交集L3。{
LinkList p,q,k,r;// p,q,k是分别指向L1,L2,L3的结点的指针
InitList_L( L3);
k=L3;
p=L1;
while(p->next!=NULL)
{
q=L2;
while(q->next!=NULL)
{
if(p->next->data==q->next->data)
{
r=(LinkList)malloc(sizeof(LNode));
r->data=p->next->data;//将两集合中相同的元素写到L3中
k->next=r;
r->next=NULL;
k=k->next;
}
q=q->next;
}
p=p->next;
}
}
/*主函数,实现A,B两集合的交集,并集*/
void main()
{
LinkList A,B,C;//C为A,B的交集
LinkList g,h,p;//g是指向A链表的指针,h是指向B链表的指针char a,b;
InitList_L(A);
InitList_L(B);
InitList_L(C);
g=A; h=B;
printf("请分别输入两个集合的字符元素: \n\n");
printf("注意同一个集合中不能输入相同的字符:\n\n");
printf("A: ");//输入A链表
scanf("%c",&a);
while(a!='$')
{
p=(LinkList)malloc(sizeof(LNode));
p->data=a;
g->next=p;
p->next=NULL;
g=g->next;
//g->data=a;
//A->next=g;
scanf("%c",&a);
}
printf("输入的A集合为:");
OutputList_L(A);
printf("\n");
printf("\nB: ");//输入B链表
scanf("%c",&b);
while(b!='$')
{
p=(LinkList)malloc(sizeof(LNode));
p->data=b;
h->next=p;
p->next=NULL;
h=h->next;
scanf("%c",&b);
}
printf("输入的B集合为:");
OutputList_L(B);
printf("\n\n\n\n");
minusList_L(A,B,C);
printf("A和B两个集合的交集为:");
OutputList_L(C);//输出交集
printf("\n\n");
addList_L(A,B);
printf("A和B两个集合的并集为:");
OutputList_L(B);//输出并集
printf("\n");
}