利用带头结点的单链表实现两个集合的并、交、差运算
1.题目…………………………………………………………………………………………3
2.题目功能描述………………………………………………………………………….3
3. 概要设计图……………………………………………………………………………3
4. 程序源代码及注释………………………………………………………………..4
5. 流程图……………………………………………………………………………………4
6. 截图与数据分析…………………………………………………………………….6
7.所采用的存储结构的优缺点及采用理由……………………………….8
8. 实验心得体会………………………………………………………………………..8
9.附录………………………………………………………………………………………....9
1
1. 题目
利用带头结点的单链表实现两个集合的并、交、差运算。
2. 题目功能描述
(1)用带头结点的单链表存储两个集合中的元素和最终的结果。
(2)集合的元素限定为十进制数,程序应对出现重复的数据进行过滤,即使得
链表中没有重复数据。
(3)显示两个集合的内容及其并集、交集和差集的内容。
(4)不改变原来的集合,并集、交集和差集分别另外存放。
3. 概要设计图
#include
#include
#include
#define OK 1
#define ERROR 0
typedef char datatype;
typedef struct node
{
datatype data;
struct node*next;
}LinkList;
LinkList*head,*p;//链表的定义
//实现集合元素的输入
LinkList*CreatListF()
void OutputLinkList_L(LinkList*);//实现集合元素的输出
void ClearList_L(LinkList*);//实现链表的清空
void Union(LinkList*,LinkList*,LinkList*);//实现两个集合的并集
void Intersection(LinkList*,LinkList*,LinkList*);//实现两个集合的交集
void Difference(LinkList*,LinkList*,LinkList*);//实现两个集合的差集
//主函数
void main()
{
LinkList*La,*Lb,*Lc;
int choice=1;
int num;
Lc=(LinkList*)malloc(sizeof(LinkList));
2
Lc->next=NULL;
La=CreatListF();
Lb=CreatListF();
printf("输出 La 集合:\n");
OutputLinkList_L(La);
printf("输出 Lb 集合:\n");
OutputLinkList_L(Lb);
Intersection(La,Lb,Lc);
printf("两个集合的交集:\n");
OutputLinkList_L(Lc);
Union(La,Lb,Lc);
printf("两个集合的并集:\n");
OutputLinkList_L(Lc);
Difference(La,Lb,Lc);
printf("两个集合的差集:\n");
OutputLinkList_L(Lc);
}
4. 程序源代码及注释
见附录
5. 流程图
开始
输入集合 la,lb
清空 lc 链表
Y
指针后移
Lc 中有重复元素
N
插入到 lc 表头
指针后移
Y
指针后移
Lb 中有重复元素
3
指针后移
N
插入到 lc 表头
输出 lc
清空 lc 链表
La,Lb 中有重复元素
Lc 中有重复元素
Y
N
插入 lc 表头
输出 lc
清空 lc 链表
La,Lb 中有重复元素
N
Lc 中有重复元素
N
4
指针后移
指针后移
N
Y
Y
Y
指针后移
指针后移
把 la 元素插入到 lc 表头
输出 lc
结束
6. 截图与数据分析;
(1)set1={3, 8, 5, 8,11},set2={22, 6, 8, 3, 15,11,20 }
数据分析如下:
set1∪set2={3,5,8,11,22,6,15,20}
set1∩set2={3,8,11}
set1-set2={5}
截图如下
(2) 其中一个集合为空集
5
例:set1={3, 8, 5, 8,11},set2=∅
数据分析如下:
set1∪set2={3,8,5,11}
set1∩set2=∅
set1-set2={3,8,5,11}
截图如下
(3)两个集合都是空集
数据分析如下 set1∪set2=∅
set1∩set2=∅
set1-set2=∅
截图如下
6
(4)创建集合时有重复数据的情况
例:set1={1,1,1,1},set2={2,2,2,2 }
数据分析如下:
set1∪set2={1,2 }
set1∩set2=∅
set1-set2={1}
截图如下:
7.对所采用的存储结构的优缺点,以及采用该存储结
构的理由;
7
(1)优点:插入和删除速度快,保留原有的物理顺序,比如:插入或者删除一
个元素时,只需要改变指针指向即可
(2)缺点:查找速度慢,因为查找时,需要循环链表访问
(3)采用该存储结构的理由:便于快速插入和删除元素
8. 实验心得体会
通过利用带头结点的单链表实现两个集合的并、交、差运算算法的实现,加深了
我们对于单链表的理解和应用,使我们简化问题和分析问题的能力得到提升,使
我们对于问题的分析更加全面和深化。
9.附录
#include
#include
#include
#define OK 1
#define ERROR 0
typedef int datatype;
typedef struct node
{
datatype data;
struct node*next;
}LinkList;
LinkList*head,*p;
//实现集合元素的输入
LinkList*CreatListF()
{
LinkList*p,*head;
int x;
head=(LinkList*)malloc(sizeof(LinkList));
head->next=NULL;
scanf("%d",&x);
while(x!=-1)
{
8