c语言数据结构单链表的交并差集运算实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构上机实验

课后练习报告

姓名:***

学号:

班级:通信141

2015年9月28日星期一

实验五:

实现A 、B两个单链表表示的集合的交集、并集和差集

实验代码:

#include

#include

#define OK 0

#define ERROR -1

#define OVERFLOW -2

typedef int ElemType;

typedef struct LNode

{

ElemType data; //定义数据域

LNode *next; //定义指针域

}LNode,*LinkList;

void InitList(LinkList *L) //创建链表头

{

*L = ( LinkList )malloc( sizeof(LNode) );

if(!L) exit(OVERFLOW); //头结点内存申请失败

(*L)->next = NULL;

}

void DerstorList(LinkList &L) //清空链表

{

LinkList p;

while(L->next)

{

p = L->next;

L->next = p->next;

free(p);

}

}

void ClearList(LinkList *L,int n) //初始化链表

{

LinkList p ;

int i;

for(i = 0;i

{

p = (LinkList )malloc(sizeof(LNode)); //生成新节点

scanf("%d",&(p)->data);

p->next = (*L)->next; //头插法

( *L)->next = p;

}

}

void InserList(LinkList *L,ElemType e) //头插法插入数据{

LinkList p;

p = (LinkList )malloc(sizeof( LNode ));

p->data = e;

p->next = (*L)->next; //头插法

( *L)->next = p;

}

void DisplaList(LinkList L) //输出链表

{

LinkList head;

head = L->next;

if(head==NULL)printf("集合为空!\n");

while(head) //遍历链表

{

printf("%4d",head->data); //输出节点信息

head = head->next;

}

printf("\n");

}

int isPresent(LinkList L,ElemType data) //判断链表中是否已经存在data该元素{

LinkList p = L->next;

while(p) //遍历链表,查找是否存在data值{

if( p->data == data )

return 1;

p = p->next;

}

return 0;

}

/*************求两个链表的交集**************/

int Intersection(LinkList L1,LinkList L2,LinkList L3)

{

LinkList p,q;

p = L1->next;

q = L2->next;

while( p )

{

while( q )

{

//判断两链表的元素是否相当,并且存入的链表中不存在该元素即可存入

if(p->data == q->data && !isPresent(L3,p->data))

{

InserList(&L3,p->data);

}

q = q->next;

}

q = L2->next; //复位

p = p->next;

}

return OK;

}

/************求链表的并集************/

void Union(LinkList L1,LinkList L2,LinkList L3)

{

LinkList p,q;

p = L1->next;

q = L2->next;

DerstorList(L3); //清空链表,重新存入数据

while( p )

{

//如果p中的元素不在并集链L3中,防止L1中有重复元素

if(!isPresent(L3,p->data))

InserList(&L3,p->data); //插入元素

p = p->next;

}

p = L1->next;

while(q)

{

if(!(isPresent(L3,q->data))) //q->data元素不存在并集表中,则插入

{

InserList(&L3,q->data); //把L2表中的元素插入

}

q = q->next;

}

}

/************求链表的差集************/

void Subtraction(LinkList L1,LinkList L2,LinkList L3)

{

LinkList p,q;

p = L1->next;

q = L2->next;

DerstorList(L3);

while(p)

{

if(!(isPresent(L2,p->data))) //如果L2中不存在data值,即为L1-L2差集InserList(&L3,p->data);

p = p->next;

}

}

void main()

{

LinkList L1,L2,L3;

相关文档
最新文档