程序设计综合实验——集合的表示与实现
目录
( *^▽^* )作者有话说
(〃'▽'〃)代码
(๑*◡*๑)实验报告
实验题目:集合的表示与实现
一、概述
1.应用需求:
2.设计目标:
3.设计方案:
4.实验方案:
二、问题分析
1.实际应用需求
2.设计目标
3.数据分析
4.主要操作
5.性能影响
三、设计和开发
1. ADT设计
2.存储方案
3.关键算法
4.实现总结
四、实验研究
1. 实验目的
2. 实验数据
3. 实验方案及实验结果
(1)实验方案
(2)实验结果
五、总结与优化
1. 方案的不足
2. 优化方案及实现思路
六、心得和体会
( *^▽^* )作者有话说
这是本人大二数据结构程序设计综合实验的实验报告和代码,当时是期中转专业过来的,这门课程已经上了一半,所以本人刚接触这门课的时候一窍不通,平时做实验也是copy。
天有不测风云,疫情封校,后来甚至封了宿舍,停课让我有大量的时间去好好学习一下。这篇实验报告和实验代码,都是自己呕心沥血(没那么夸张哈哈哈哈哈)写的。现在看来,可能很多地方有不足,但是最后这份实验课程的成绩还可以,所以还是想给大家分享一下,希望对也在接触综合实验的朋友们有所帮助。
千万不要照抄实验报告!!自己动手去敲一下代码,或者做一下修改,会更有收获。
愿我们都有很好的未来!
要是有帮助的话就关注点赞一下吧,或者有什么想说的也可以评论留言,我一定都会回复的。以后也会多多分享自己写的实验报告。
(〃'▽'〃)代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <time.h>
clock_t start, stop;//函数开始时的时钟打点,结束时的时钟打点
double duration;//函数运行的时间,以秒为单位
#define true 1
#define error -1
typedef int ElemType;
typedef int Status;typedef struct LNode
{ElemType data;struct LNode *next;} LNode,*LinkList; Status InitList(LinkList &L);//构造一个空的单链表L//
Status ListInsert(LinkList &L);//利用随机数输入集合元素//
Status ListInsertTow(LinkList &L,int n);//利用单链表的插入输入集合元素//
Status GetElem(LinkList L,int i,ElemType &e);//集合元素的查找//
Status ListDetete(LinkList &L,int i);//集合元素的删除//
Status ListOutput(LinkList&L);//利用单链表的取值输出集合的元素//
Status ClearList(LinkList&L);//重置单链表为空表//
void UnionList(LinkList L1,LinkList L2 ,LinkList &L );//求并集//
void InsersectionList(LinkList L1,LinkList L2,LinkList &L);//求交集//
void DiffenceList(LinkList &L1,LinkList L2);//求差集//void menu()
{printf("*********************集合运算操作指南( ̄▽ ̄)/*********************\n");printf("\t\t1.随机数生成集合A元素ヽ( ̄▽ ̄)\n"); printf("\t\t2.随机数生成集合B元素(* ̄︶ ̄)\n"); printf("\t\t3.输入集合A元素ヽ( ̄▽ ̄)\n");printf("\t\t4.输入集合B元素(* ̄︶ ̄)\n");printf("\t\t5.输出集合A元素ヽ(ー_ー)ノ\n");printf("\t\t6.输出集合B元素o( ̄▽ ̄)d \n");printf("\t\t7.求集合AB的并集(ノ ̄▽ ̄)\n");printf("\t\t8.求集合AB的交集(~ ̄▽ ̄)~ \n");printf("\t\t9.求集合AB的差集︿( ̄︶ ̄)︿\n");printf("\t\t0.展示完毕退出系统(^_-)☆\n"); printf("********************************************************************\n");}Status InitList(LinkList &L)//构造一个空的单链表L// {LinkList p;p=(LinkList)malloc(sizeof(LNode));if(!p){return error; } else{L=p;L->next=NULL;return true; }}Status ListInsert(LinkList &L) //利用随机数输入集合元素//
{int i=1;int a,n1,b,min,max;LinkList p=L; printf("请输入生成随机数的个数\n",n1);scanf("%d",&n1);printf("请输入生成随机数的范围min~max\n",min,max);scanf("%d%d",&min,&max);srand((unsigned int)time(0));//修改种子for (size_t i = 0; i<n1; i++) { a = rand();int b = a % (max- min+1) + min;//设置范围 printf("%d ", b);p=(LinkList)malloc(sizeof(LNode)); p->data =b;p->next =L->next;L->next =p; }
}Status ListInsertTow(LinkList &L,int n) //利用单链表的插入输入集合元素//
{LinkList p=L; int i=1;while(i<=n) {printf("输入第%d个数据\n",i);p=(LinkList)malloc(sizeof(LNode));if(p!=NULL){scanf("%d",&(p->data));p->next =L->next;L->next =p;}else{return error;} i++; }return true;
}Status GetElem(LinkList L,int i,ElemType &e)//集合元素的查找// {LinkList p;int j;p=L->next ;j=1;while(p&&j<1){p=p->next;++j;}if(!p||j<i) return error;e=p->data;return true;}Status ListDetete(LinkList &L,int i)//集合元素的删除//
{LinkList p,q;int j;p=L;j=0;while((p->next)&&(j<i-1)){p=p->next ; ++j;}if(!(p->next )||(j>i-1))return error;q=p->next ;p->next =q->next ;free(q);return true;
}Status ListOutput(LinkList&L)//利用单链表的取值输出集合的元素//{ int i=0; LinkList p=L;p=L->next;while(p!=NULL){++i; printf("输出第%d个数据 ",i);printf("%d\n",p->data);p=p->next;}if(i==0){printf("空集(笨蛋!先输入再输出~)\n");}} Status ClearList(LinkList &L)//重置单链表为空表// {LinkList p,q;p=q=L->next;if(!p){return true;} else{q=p->next;free(p);}L->next=NULL;return error;}//求并集,即两个单链表合并去掉重复的元素//void UnionList(LinkList L1,LinkList L2 ,LinkList &L ) //浪费了一点空间,也可以像p53数据结构书上算法设计第2题一样,不过就得要求两个链表是顺序表//
{ LinkList p,q,s;if(L->next !=NULL)//如果L不是空表// {ClearList(L);//重置L为空表// }p=L1->next ;//p指针指向第一个集合单链表L1的第一个元素//while(p!=NULL){q=L->next ;while(q!=NULL&&(q->data!=p->data)){q=q->next;}if(q==NULL){s=(LinkList)malloc(sizeof(LNode));//赋予新结点空间// s->data=p->data;//头插法// s->next=L->next; L->next =s;}p=p->next ;} p=L2->next ;//p指针指向第二个集合单链表L2的第一个元素,其步骤同上//while(p!=NULL){q=L->next ; while(q!=NULL&&(q->data !=p->data )){q=q->next ;}if(q==NULL){s=(LinkList)malloc(sizeof(LNode));s->data =p->data ;s->next =L->next ;L->next =s;}p=p->next ; } } //求交集,即保留两个单链表中元素相同的部分//void InsersectionList(LinkList L1,LinkList L2,LinkList &L)//同并集一样的道理,多用了一些空间,但是简单好理解//{LinkList p,q,s,h;if(L->next !=NULL)//如果L不是空表// {ClearList(L);//重置L为空表// }p=L1->next ;while(p)//A不是空集// { q=L2->next ;while(q)//B不是空集// {if(p->data ==q->data ) break;//找到相同元素就跳出循环// if(p->data !=q->data ) q=q->next ;}if(q)//找到了AB中有相同的元素// {s=L->next ;while(s){if(s->data ==p->data ) break;//表示L中已经存了相同元素,跳出循环// if(s->data !=p->data ) s=s->next ;//没找到就下一个元素对比//}if(!s)//L中一个元素没存或者s指针已经遍历完了却没有找到相同的元素// {h=(LinkList)malloc(sizeof(LNode));//建立新结点把它存下来// h->data =p->data ;h->next =L->next;L->next =h; }} p=p->next ;}
}//求差集,就是求A集合中除去与B集合相同元素剩下的部分//void DiffenceList(LinkList L1,LinkList L2,LinkList L){LinkList p,q,s,h;if(L->next !=NULL)//如果L不是空表// {ClearList(L);//重置L为空表// }p=L1->next ;while(p)//A不是空集// { q=L2->next ;while(q)//B不是空集// {if(p->data ==q->data ) break;//找到相同元素就跳出循环// if(p->data !=q->data ) q=q->next ;}if(!q)//找到A中有而B中没有的元素// {s=L->next ;while(s){if(s->data ==p->data ) break;//表示L中已经存了相同元素,跳出循环// if(s->data !=p->data ) s=s->next ;//没找到就下一个元素对比//}if(!s)//L中一个元素没存或者s指针已经遍历完了却没有找到相同的元素// {h=(LinkList)malloc(sizeof(LNode));//建立新结点把它存下来// h->data =p->data ;h->next =L->next;L->next =h; }} p=p->next ;}
}int main()
{ LinkList L,L1,L2;int c;//选择菜单的意思 //int n;//要插入的元素的个数//InitList(L);InitList(L1);InitList(L2);while(1){menu();printf("输入选择的功能序号");scanf("%d",&c) ;switch(c){case 1:ListInsert(L1);getchar();getchar();system("cls");//回车清屏// break; case 2:ListInsert(L2);getchar();getchar();system("cls");//回车清屏// break; case 3:printf("输入集合A的总个数:\n");scanf("%d",&n);ListInsertTow(L1,n);getchar();getchar();system("cls");//回车清屏// break; case 4:printf("输入集合A的总个数:\n");scanf("%d",&n);ListInsertTow(L2,n);getchar();getchar();system("cls");//回车清屏// break;case 5:printf("输出集合A的元素:\n");ListOutput(L1);getchar();getchar();system("cls");//回车清屏// break; case 6:printf("输出集合B的元素:\n");ListOutput(L2);getchar();getchar();system("cls");//回车清屏// break; case 7: printf("集合A和B的并集:\n");start = clock();UnionList(L1,L2,L );stop = clock();duration = ((double)(stop - start)) / CLK_TCK;printf("并集算法性能%lf\n", duration);ListOutput(L);getchar();getchar();system("cls");//回车清屏// break; case 8:printf("集合A和B的交集:\n");stop = clock();InsersectionList(L1,L2,L);stop = clock();duration = ((double)(stop - start)) / CLK_TCK;printf("交集算法性能%lf\n", duration);ListOutput(L);getchar();getchar();system("cls");//回车清屏// break; case 9:printf("集合A和B的差集:\n");stop = clock();DiffenceList(L1,L2,L);stop = clock();duration = ((double)(stop - start)) / CLK_TCK;printf("差集算法性能%lf\n", duration);ListOutput(L);ListOutput(L);getchar();getchar();system("cls");//回车清屏// case 0:printf("欢迎光临,下次再来!\n");getchar();getchar();system("cls");//回车清屏//exit(0);default:printf("笨蛋!!!请输入0~9!\n");getchar();getchar();system("cls");//回车清屏// }}
}
(๑*◡*๑)实验报告
实验题目:集合的表示与实现
一、概述
1.应用需求:
①通过代码编写生成随机数求集合元素规模较大的运算,例如在汽车电商领域,要实现一辆车型在不同省份关于不同价格行情的分析。
②通过键盘输入的方式求方程的解集、几数之间的公倍数等集合元素规模较小的运算。
2.设计目标:
实验结果能够顺利实验集合的交集、并集、差集等运算。
3.设计方案:
利用单链表的头插法,链表对于删除添加操作更加灵活方便。
4.实验方案:
首先定义链表结点的结构体包含指针域和数据域。其次构造一个空的单链表L。接着利用单链表的插入输入集合元素,利用单链表的取值输出集合的元素。然后需要在编写一个重置单链表为空表的操作。
①求并集:删去A和B集合中重复的元素。L1表存储集合A中元素,L2表存储集合B中元素。先判断L是否为空表,不为空则做清空操作。指针p指向L1->next,指针q指向L->next,在L表中遍历,看其是否有相同的元素,有则进行下一步,没有则添加进L表中。对L2表进行相同操作。
②求交集:求A和B集合中相同的元素。L1表存储集合A中元素,L2表存储集合B中元素。先判断L是否为空表,不为空则做清空操作。p=L1->next,q=L2->next找到相同元素就跳出循环,将新结点赋值并添加到L表中,找不到则进行下步操作q=q->next。
③求差集:求A集合中除去与B集合相同元素剩下的部分。L1表存储集合A中元素,L2表存储集合B中元素。先判断L是否为空表,不为空则做清空操作。p=L1->next,q=L2->next,找到相同元素就跳出循环,没找到则进行q=q->next;再将s=L->next, L中一个元素没存或者s指针已经遍历完了却没有找到相同的元素,则建立新结点把它存下来。
二、问题分析
1.实际应用需求
集合的运算在汽车电商领域的应用。许多买卖车的APP需要给用户提供不同车型在不同省份的不同价格供用户选择。
如果要实现一辆车型在不同省份有不同的价格行情,就需要有一个车价管理的后台管理界面。每辆车对应的详情界面管理各省价格行情,增加该车在某个省份的行情,或者更新某个省份的行情,或者该车暂时去除某个省份的行情等功能,需要服务器端保证正确地数据存储。
2.设计目标
3.数据分析
集合A为客户端传送的数据对象,用键盘输入来实现。集合B为从数据库中获取的对象,用生成的随机数来实现,可以控制随机数的数量和大小范围尽可能真实的模拟车价行情数据库。
4.主要操作
集合元素的插入、集合元素的删除、两集合求并集、两集合求交集、两集合求差集等等。
5.性能影响
实验主要使用的是单链表的头插法,问题规模是n,其中关于单链表元素的插入和删除,其时间性能是O(n)。
三、设计和开发
1. ADT设计
数据对象:D={ai|ai∈Elemset,i=1,2,3,…,n,n≧0}
数据关系:R={<ai-1,ai >|ai-1,ai∈D,i=1,2,3,…,n,n≧0}
Status InitList(LinkList &L);//构造一个空的单链表L//
Status ListInsert(LinkList &L);//利用随机数输入集合元素//
Status ListInsertTow(LinkList &L,int n);//利用单链表的插入输入集合元素//
Status GetElem(LinkList L,int i,ElemType &e);//集合元素的查找//
Status ListDetete(LinkList &L,int i);//集合元素的删除//
Status ListOutput(LinkList&L);//利用单链表的取值输出集合的元素//
Status ClearList(LinkList&L);//重置单链表为空表//
void UnionList(LinkList L1,LinkList L2 ,LinkList &L );//求并集//
void InsersectionList(LinkList L1,LinkList L2,LinkList &L);//求交集//
void DiffenceList(LinkList &L1,LinkList L2);//求差集//
2.存储方案
优点:存储密度大,可以随机访问,查询、修改元素的时间复杂度是O(1)。
缺点:表示关系能力弱,维护关系困难,插入和删除数据的时间复杂度是O(n)。
特点: 占用空间任意,元素任意存放;在存放元素的同时,还存放与其有关系的元素的地址。
优点:空间任意,显式地存储关系。表示关系的能力强。插入、删除元素的时间复杂度是O(1),便于动态管理内存。
缺点:空间开销大,占用空间较多,存储密度小。必须通过指针来访问元素,查找、修改元素的时间复杂度是O(n)。
3.关键算法
Status ListInsert(LinkList &L) //利用随机数输入集合元素//
printf("请输入生成随机数的范围min~max\n",min,max);
srand((unsigned int)time(0));//修改种子//
int b = a % (max- min+1) + min;//设置范围//
p=(LinkList)malloc(sizeof(LNode));
p->next =L->next;//单链表的头插法插入结点//
算法的时间复杂度是O(m+n),m指集合A中的元素,n指集合B中的元素。
p=L1->next ;//p指针指向第一个集合单链表L1的第一个元素//
while(q!=NULL&&(q->data!=p->data))
s=(LinkList)malloc(sizeof(LNode));//赋予新结点空间//
p=L2->next ;//p指针指向第二个集合单链表L2的第一个元素,其步骤同上//
while(q!=NULL&&(q->data !=p->data ))
s=(LinkList)malloc(sizeof(LNode));
算法的时间复杂度是O(m+n),m指集合A中的元素,n指集合B中的元素。
void InsersectionList(LinkList L1,LinkList L2,LinkList &L)//同并集一样的道理,多用了一些空间,但是简单好理解//
if(p->data ==q->data ) break;//找到相同元素就跳出循环//
if(p->data !=q->data ) q=q->next ;
if(s->data ==p->data ) break;//表示L中已经存了相同元素,跳出循环//
if(s->data !=p->data ) s=s->next ;//没找到就下一个元素对比//
if(!s)//L中一个元素没存或者s指针已经遍历完了却没有找到相同的元素//
h=(LinkList)malloc(sizeof(LNode));//建立新结点把它存下来//
算法的时间复杂度是O(m+n),m指集合A中的元素,n指集合B中的元素。
//求差集,就是求A集合中除去与B集合相同元素剩下的部分//
void DiffenceList(LinkList L1,LinkList L2,LinkList L)
if(p->data ==q->data ) break;//找到相同元素就跳出循环//
if(p->data !=q->data ) q=q->next ;
if(s->data ==p->data ) break;//表示L中已经存了相同元素,跳出循环//
if(s->data !=p->data ) s=s->next ;//没找到就下一个元素对比//
if(!s)//L中一个元素没存或者s指针已经遍历完了却没有找到相同的元素//
h=(LinkList)malloc(sizeof(LNode));//建立新结点把它存下来//
Status GetElem(LinkList L,int i,ElemType &e)
Status ListDetete(LinkList &L,int i)
4.实现总结
是想法的错误,q指针只会指向链表的第一个元素,当p指针遍历完之后,q指针指向的元素数据如果没有和p指针指的数据向相同,也不会往下遍历用第二个对比。
四、实验研究
1. 实验目的
分析大规模集合表示和运算所面临的挑战,实现集合元素查找、插入、删除以及集合的交、并、差等运算,并设计恰当的实验验证单链表实现集合运算的时空性能。
2. 实验数据
(1)代码编写过程中先选用小规模范围内的随机数检验代码是否正确。多次经检验结果正确。以下只列出一组。
⑥两集合求交集.A和B共有的元素就是要更新的数据,即求交集。
⑦两集合求差集A中有的元素,而B中没有的元素就是要插入数据库中的数据,即A与B的差集。
3. 实验方案及实验结果
(1)实验方案
(2)实验结果
一个算法测试需要从正确性、可用性、可读性、健壮性四个方面来判断。
正确性:一个好的算法必需能够正确的执行要求的功能和性能要求。进过算法测试,实验代码能够正确运行执行起来。
健壮性:一个好的算法能够处理各种异常和特殊情况。经过算法测试,本实验在这一方面完成度不够,算法的时空复杂度很大,算法结果很简单,逻辑不是十分严谨。
五、总结与优化
实验基本实现了集合运算的插入、查找、删除、并集、差集、补集。但是还有很大提升空间。
1. 方案的不足
2. 优化方案及实现思路
其实可以定义一个汽车的结构体,其中包括汽车种类,省份和车价行情。其中汽车种类、省份都可以用整型代码指代,不一定用char类型。
void ShellInsert(SqList L,int dk){
for(int i=dk+1;i<=L.Length;i++){
六、心得和体会
集合在计算机中的应用甚广,我们仍需要不断探索,不断应用,利用科技的力量解决实际问题。
程序设计综合实验——集合的表示与实现相关推荐
- 计费管理系统开发历程与源码分享(武汉理工大学程序设计综合实验课程设计)
那么,就让我们来谈一谈这个计费管理系统吧!一开始,我就充满了激情和热情,准备写出一份完美无缺的代码.不过,事情往往不是那么容易的,我很快就发现了一些困难. 首先,添加卡的功能是比较简单的,只需要在数据 ...
- 基于微信小程序的教室管理系统_北邮信通院大二下程序设计综合实验
1.项目背景 1.1需求分析 和团委老师交流时得知,目前学校使用的教室管理(预约)系统使用比较繁琐.于是希望制作一款简单易用的教室预约管理系统. 1.2项目要求 1.教室/场地空闲情况的查看. 2.学 ...
- python综合实验报告_Python程序设计实验报告五:综合运用三种基本结构进行程序设计(综合性实验)...
安徽工程大学 Python程序设计 实验报告 班级 物流191 姓名姚彩琴学号3190505129 成绩 日期 2020.4.22 指导老师修宇 [实验名称]综合运用三种基本结构进行程序设计(综合性实 ...
- 《Python程序设计》实验四 Python综合实践实验报告
<Python程序设计>实验四 Python综合实践实验报告 1.实验内容 Python综合应用:爬虫.数据处理.可视化.机器学习.神经网络.游戏.网络安全等. 在华为ECS服务器(Ope ...
- python综合实验报告_Python程序设计 实验报告
安徽工程大学 Python程序设计 实验报告 班级:物流192 姓名:刘马汉卿学号:319005211 成绩: 日期:2020年4月29日 指导老师:修 ...
- 计算机vb实验报告,VB综合实验报告格式
<VB综合实验报告格式>由会员分享,可在线阅读,更多相关<VB综合实验报告格式(5页珍藏版)>请在人人文库网上搜索. 1.华北科技学院计算机系综合性实验实 验 报 告 课程名称 ...
- C语言程序设计蔺德军,C语言程序设计上机实验与习题解答(第2版)
目 录 实验1 操作环境与过程\t1 1.1 实验目的\t1 1.2 实验预习\t1 1.3 使用VC++ 6.0上机实验\t1 1.4 使用Dev-C++上机实验\t4 1.5 使用VC++ 201 ...
- 《Java程序设计》实验报告——Java的多线程机制
浙江理工大学 <Java程序设计> 实验报告 20 19-20 20学年第 1学期 学 院 信息学院 班 级 计算机科学与技术18(3) 姓 名 申屠志刚 学 号 2 ...
- 面对对象课程设计报告java,面向对象编程 JAVA编程综合实验报告.doc
PAGE \* MERGEFORMAT 20 成绩: JAVA编程B综合实验报告 实验名称:面向对象编程 实验时间:2012年 5月 31日星期四 JAVA编程B综合实验报告 一.实验名称 面向对象编 ...
最新文章
- python构建cnn图片匹配_tensorflow搭建cnn人脸识别训练+识别代码(python)
- Go对Python产生的冲击
- 生成大小写字母加数字混合ID与自定义进制转换
- UML应用开发详解--视频
- SQL Server-事务处理(Tansaction)与锁(Lock)
- 刪除github上的一個repository
- Asp.Net Core获取请求信息/获取请求地址
- C# 设计模式,工厂方法
- bzoj 2962: 序列操作
- 单片机 队列 C语言 OLED 示波器 心率波形 显示 MSP430F5529 pulsesensor ADS1292R
- oracle 升级到11204,案例客服数据库RAC升级11201升级11204.docx
- html5改变窗口大小,js怎么改变窗口大小?js改变窗口大小方法
- 百度地图InfoWindow添加点击事件
- 腾讯云docker部署halo个人博客及myql数据库笔记
- OAS ( Open Adoption Software ) 类公司的崛起
- 翻译python代码的软件_科普 | 内外翻,你是不是一直搞反了?
- 第十七届智能视觉组线上赛比赛流程及相关补充说明
- 服务器与磁盘阵列柜有哪些连接方式?
- 电子商务多平台运营与实践课程设计
- 浏览器插件自动点击程序
热门文章
- 14 最小二乘估计原理推导和线性回归的外推等
- 字符串练习11_潜伏者
- 中班音乐活动 机器人_音乐机器人活动教案
- 画春天的景色计算机教案,中班美术教案《画春天》
- 网易实习第11天--制作第一个ios应用
- 大数据安全核心技术分析:数据采集存储安全技术
- python无法运行图像_OpenCV Python不使用imread()打开图像
- Seurat | 强烈建议收藏的单细胞分析标准流程(差异分析与细胞注释)(五)
- 系统命令_$SECONDS
- linux怎么安装gem命令,实战定制yum仓库----gem命令常用的参数