2个集合的交集和并集(单链表)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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");

}

相关文档
最新文档