c语言数据结构单链表的交并差集运算实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;