博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于单链表实现集合的交集、并集、差集的运算
阅读量:4955 次
发布时间:2019-06-12

本文共 5015 字,大约阅读时间需要 16 分钟。

解题思路(单链表求交集、并集、差集的思想和顺序表求交集、并集、差集的思想基本相同)

1.先通过CreateListR 函数将集合 a 和 b 中的元素添加到顺序表 ha 和 hb 中 ,添加过程使用的是顺序表原有的Initlist 函数(初始化表) 和 ListInsert 函数 (向表中插入元素)  。

2.因为原集合是无序的, 所以我通过 sort 函数 (选择排序),使得集合变得有序。

3.得到有序集合 ha 和 hb 后, 便可以使用 Union 函数(类似归并的思想写出来的求并集的函数),求出 ha 和 hb 的并集。

4.而求交集的方法则是, 通过将 集合 a 中的元素一个一个取出,并通过 函数LocateElem ,查看集合 hb 中是否存在该元素,如果存在则将 元素放入 hc ,如果不存在,则舍去。 以此求得 两 集合的交集。

5.求两集合的差 则可以反过来,同样通过将 集合 a 中的元素一个一个取出,并通过 函数LocateElem ,查看集合 hb 中是否存在该元素,如果不存在则将 元素放入 hc ,如果存在,则舍去。 以此求得两集合的差集。

#include 
#include
#include
using namespace std;/* 定义单链表数据 */typedef char ElemType;typedef struct LNode{ ElemType data; struct LNode *next;}LinkList;/* 单链表的初始化 */void InitList(LinkList *&L){ L = (LinkList *)malloc(sizeof(LinkList)); L->next=NULL;}/* 向单链表中插入数据元素 */bool ListInsert(LinkList *&L,int x,char e){ int j = 0; LinkList *p = L, *s; while(p!=NULL && j
next; j++; } if(p==NULL) { return false; } else { s = (LinkList *)malloc(sizeof(LinkList)); s->data = e; s->next = p->next; p->next = s; return true; }}/* 输出单链表 */void DispList(LinkList *L){ LinkList *p = L->next; while(p!=NULL) { printf("%c ",p->data); p = p->next; } printf("\n");}/* 求单链表的长度 */int ListLength(LinkList *L){ LinkList *p = L->next; int i = 0; while(p!=NULL) { i++; p = p->next; } return i;}/* 查看单链表是否为空 */bool ListEmpty(LinkList *L){ return L->next==NULL;}/* 求单链表中某个数据元素值 */bool GetElem(LinkList *L,int i, ElemType &e){ LinkList *p = L; int j = 0; while(p!=NULL && j < i) { p=p->next; j++; } if(p==NULL) { return false; } else { e = p->data; return true; }}/* 在单链表中查找元素 */int LocateElem(LinkList *L,ElemType e){ LinkList *p = L; int i = 0; while(p!=NULL && p->data!=e) { p = p->next; i++; } if(p==NULL) { return 0; } else { return i; }}/* 删除单链表中第 i 个元素*/bool ListDelete(LinkList *&L,int i,ElemType &e){ int j = 0; LinkList *p = L, *q; while(p!=NULL && j < i - 1) { p = p->next; j++; } if(p==NULL) return false; else { q = p->next; if(q==NULL) return false; e = q->data; p->next = q->next; free(q); return true; }}/* 删除单链表 */void DestroyList(LinkList *&L){ LinkList *p = L; LinkList *q = p->next; while(q!=NULL) { free(p); p = q; q = p->next; } free(p);}void CreateListR(LinkList *&L,ElemType e[],int n){ InitList(L); int i; for(i = 0;i < n; ++i) { if(!LocateElem(L,e[i])) ListInsert(L,i+1,e[i]); }}void InsterSect(LinkList *a,LinkList *b,LinkList *&c){ DestroyList(c); InitList(c); LinkList *p = a->next; int i = 0; while(p!=NULL) { if(LocateElem(b,p->data)) ListInsert(c,++i,p->data); p = p->next; }}void Subs(LinkList *a,LinkList *b,LinkList *&c){ DestroyList(c); InitList(c); LinkList *p = a->next; int i = 0; while(p!=NULL) { if(!LocateElem(b,p->data)) ListInsert(c,++i,p->data); p = p->next; }}void Union(LinkList *a,LinkList *b,LinkList *&c){ InitList(c); LinkList *p = a->next; LinkList *q = b->next; int k = 0; while(p!=NULL && q!=NULL) { if(p->data < q->data) { ListInsert(c,k+1,p->data); p = p->next; k++; } else if(p->data == q->data) { ListInsert(c,k+1,p->data); p = p->next; q = q->next; k++; } else { ListInsert(c,k+1,q->data); q = q->next; k++; } } while(p!=NULL) { ListInsert(c,k+1,p->data); p = p->next; k++; } while(q!=NULL) { ListInsert(c,k+1,q->data); q = q->next; k++; } ///cout<<"hehe"<
next; c = pre->data; while(pre!=NULL) { if(c>=pre->data) c = pre->data; pre = pre->next; } ListInsert(p,++i,c); int tag = LocateElem(L,c); ListDelete(L,tag,c); } L = p;}int main( ){ LinkList *ha, *hb, *hc; ElemType a[]={
'c','a','e','h'}; ElemType b[]={
'f','h','b','g','d','a'}; printf("集合的运算如下\n"); CreateListR(ha,a,4); CreateListR(hb,b,6); printf("原 集 合 A: "); DispList(ha); printf("原 集 合 B: "); DispList(hb); sort(ha); sort(hb); printf("有序集合A:"); DispList(ha); printf("有序集合B:"); DispList(hb); Union(ha,hb,hc); printf("集合的并C:"); DispList(hc); InsterSect(ha,hb,hc); printf("集合的交C:"); DispList(hc); Subs(ha,hb,hc); printf("集合的差C:"); DispList(hc); DestroyList(ha); DestroyList(hb); DestroyList(hc); return 0;}

 

转载于:https://www.cnblogs.com/mengqimoli/p/8604770.html

你可能感兴趣的文章
小区搜索,小区选择
查看>>
Python的matplotlib库画图不能显示中文问题解决
查看>>
看过的文档地址——个人留存
查看>>
【Bzoj4555】【Luogu P4091】求和(NTT)
查看>>
Mac安装LNMP环境,升级php7
查看>>
BZOJ 3065 带插入区间第K小值
查看>>
NOIP2016模拟赛三 Problem C: 不虚就是要AK
查看>>
把页面的编码与数据的编码统一的两种方法:
查看>>
robotframework基本语法一
查看>>
python 完整项目开发流程
查看>>
Android开发之怎样监听让Service不被杀死
查看>>
单例模式
查看>>
POJ - 3111 K Best(二分)
查看>>
spring cuowu
查看>>
boost:库program_options--第一篇
查看>>
【转载】使用Winrar对压缩文件进行加密,并且给定解压密码
查看>>
Liunx下Intel无线网卡驱动安装
查看>>
cookie
查看>>
C/C++字符串查找函数 <转>
查看>>
值得推荐的C/C++框架和库 <转>
查看>>