logo资料库

利用带头结点的单链表实现两个集合的并、交、差运算.docx

第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
资料共13页,剩余部分请下载后查看
利用带头结点的单链表实现两个集合的并、交、差运算 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
分享到:
收藏