数据结构课程设计报告(集合交集并集运算).doc_第1页
数据结构课程设计报告(集合交集并集运算).doc_第2页
数据结构课程设计报告(集合交集并集运算).doc_第3页
数据结构课程设计报告(集合交集并集运算).doc_第4页
数据结构课程设计报告(集合交集并集运算).doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据结构课程设计报告陕西师范大学计算机科学学院计算机科学与技术专业课程设计报告课程名称:数据结构课程设计课程设计题目:集合的交集并集运算设计姓 名:刘金杰, 杨冰,李啟梅,孙玉婷,王皓靖,王婷,尹淑韵,李玉婷,刘卓院 系:计算机科学学院专 业:计算机科学与技术年级班级:10级02班指导教师:雷秀娟日期:2012年3月16日 3月21日目 录一 课程设计的目的4二 课程设计的要求4三 课程设计的报告内容41系统说明42设计目标和主要功能53. 设计原则54. 系统头文件及流程图55. 程序运行6. 系统的优点和缺点四 收获与体会五 遇到的问题六 源代码七 参考资料集合的交集并集运算一. 课程设计的目的1.掌握在visual c+集成开发环境下编辑、编译、链接和运行一个c+程序的基本方法; 2.利用最近所学的知识并结合c和c+编写程序,实现集合的简单运算; 3.培养同学与同学之间团结协作互帮互助的精神,使团队精神发挥的淋漓尽致;4. 同时培养同学们的积极动脑动手能力,培养兴趣;二. 课程设计的要求 要求同学能够结合所学过的知识和内容有目的编写程序,能够不断的尝试和查阅资料,对所学的知识有更深刻的理解,并在理解的基础上加以运用.根据自己对线性表的概念、原理和机制的理解,结合数学知识编写程序,并求解运行出集合的交集并集运算.三. 课程设计的报告内容1.系统说明:系统名称是集合的交集并集运算;2.设计目标和主要功能:给出集合的元素个数及元素,可以分别做出集合的交集和并集运算; 3.设计原则:(1)系统运行安全可靠,稳定性好 ;(2)系统输入界面友好,操作简便易行,尽量减少用户的输入工作量; 4.系统头文件及流程图(1)系统的头文件#include#include#include /malloc()等 #include / int_max等 #include / eof(=z或f6),null #include / atoi() #include / eof() #include / floor(),ceil(),abs() #include / exit() #include(2)流程图5.程序运行: (1)输入部分演示:(2)求交集部分演示:(3)求并集部分演示:(4)退出部分演示:6.系统优点和缺点(1) 优点:程序简洁明了,可以明确的实现集合的简单的运算,并加以处理,可以加强理解力,并用了所学过的知识实现操作.除此之外,不但可以实现数字与数字之间的运算,还可以实现带字母集合的运算,使得程序多样化,拓展知识.(2) 缺点:只能实现集合的简单操作,运算量小,很多方面设计的不够全面细致,集合的另外许多功能不能加以体现.除此之外,有些步骤重复化,但是又找不到简洁明了的解决办法. 四. 收获与体会通过小组成员的共同努力,我们联系以前学过的知识,并结合新学的有关线性表的内容,除此之外,还查阅了不少资料,并利用所学的数学知识,运用逻辑的投保编写出这个程序.这是我们小组人共同努力的成果,在此过程中,我们体会到了团结协作的力量,每个人都有个人的任务,我们分工明确,各尽其责,并利用课余时间互相帮助讨论,才有今天的成果.除此之外,我们还共同回忆了有关于c和c+的部分知识,熟悉操作,对线性表的知识也得到的深刻的 理解和体会。五. 遇到的问题1. 在讨论用何种算法实现的过程中,大家的意见和想法不一,但是大家并没有固执己见,而是耐心听从他人意见和建议,求同存异,不断改进算法,使程序达到最完美的标准.2. 在使用线性表的问题上,不知道使用几个更简洁,更易懂,在上网查阅资料后才得出答案. 六. 源代码/头文件#include#include#include /malloc()等 #include / int_max等 #include / eof(=z或f6),null #include / atoi() #include / eof() #include / floor(),ceil(),abs() #include / exit() #include/函数结果状态代码#define true 1#define false 0#define ok 1#define error 0#define infeasible -1/#define overflow -2 因为在math.h中已定义overflow的值为3,故去掉此行 typedef intstatus; /status是函数的类型,其值是函数结果状态代码,如ok等 typedef int boolean; /boolean是布尔类型,其值是true或false typedef int elemtype; / 线性表的动态分配顺序存储结构 #define list_init_size 10 / 线性表存储空间的初始分配量 #define listincrement 2 / 线性表存储空间的分配增量 typedef structelemtype *elem; / 存储空间基址 int length; / 当前长度 int listsize; / 当前分配的存储容量(以sizeof(elemtype)为单位) sqlist;/ 顺序表示的线性表的基本操作(12个) status initlist(sqlist *l) / 算法2.3 /操作结果:构造一个空的顺序线性表 (*l).elem = (elemtype*)malloc(list_init_size*sizeof(elemtype);if(!(*l).elem)exit(overflow); / 存储分配失败 (*l).length = 0; / 空表长度为0 (*l).listsize = list_init_size; / 初始存储容量 return ok;status destroylist(sqlist *l) / 初始条件:顺序线性表l已存在。操作结果:销毁顺序线性表l free(*l).elem);(*l).elem = null;(*l).length = 0;(*l).listsize = 0;return ok;status clearlist(sqlist *l) / 初始条件:顺序线性表l已存在。操作结果:将l重置为空表 (*l).length = 0;return ok;status listempty(sqlist l) / 初始条件:顺序线性表l已存在。操作结果:若l为空表,则返回true,否则返回false if(l.length = 0)return true;elsereturn false;int listlength(sqlist l) / 初始条件:顺序线性表l已存在。操作结果:返回l中数据元素个数 return l.length;status getelem(sqlist l, int i, elemtype *e) / 初始条件:顺序线性表l已存在,1ilistlength(l) / 操作结果:用e返回l中第i个数据元素的值 if(i l.length)exit(error);*e = *(l.elem+i-1);return ok;int locateelem(sqlist l, elemtype e, status(*compare)(elemtype, elemtype) / 初始条件:顺序线性表l已存在,compare()是数据元素判定函数(满足为1,否则为0) / 操作结果:返回l中第1个与e满足关系compare()的数据元素的位序。 / 若这样的数据元素不存在,则返回值为0。算法2.6 elemtype *p;int i = 1; / i的初值为第1个元素的位序 p = l.elem; / p的初值为第1个元素的存储位置 while(i = l.length & !compare(*p+, e)+i;if(i=l.length)return i;elsereturn 0;status priorelem(sqlist l, elemtype cur_e, elemtype *pre_e) / 初始条件:顺序线性表l已存在 / 操作结果:若cur_e是l的数据元素,且不是第一个,则用pre_e返回它的前驱, / 否则操作失败,pre_e无定义 int i = 2;elemtype *p = l.elem + 1;while(i l.length)return infeasible;else*pre_e = *-p;return ok;status nextelem(sqlist l, elemtype cur_e, elemtype *next_e) / 初始条件:顺序线性表l已存在 / 操作结果:若cur_e是l的数据元素,且不是最后一个,则用next_e返回它的后继, / 否则操作失败,next_e无定义 int i = 1;elemtype *p = l.elem;while(i l.length & *p != cur_e)i+;p+;if(i = l.length)return infeasible;else*next_e = *+p;return ok;status listinsert(sqlist *l, int i, elemtype e) / 算法2.4 / 初始条件:顺序线性表l已存在,1ilistlength(l)+1 / 操作结果:在l中第i个位置之前插入新的数据元素e,l的长度加1 elemtype *newbase,*q,*p;if(i (*l).length + 1) / i值不合法 return error;if(*l).length = (*l).listsize) / 当前存储空间已满,增加分配 newbase = (elemtype *)realloc(*l).elem, (*l).listsize + listincrement)*sizeof(elemtype);if(!newbase)exit(overflow); / 存储分配失败 (*l).elem = newbase; / 新基址 (*l).listsize += listincrement; / 增加存储容量 q = (*l).elem + i - 1; / q为插入位置 for (p = (*l).elem + (*l).length - 1;p = q; -p) / 插入位置及之后的元素右移 *(p+1) = *p;*q = e; / 插入e +(*l).length; / 表长增1 return ok;status listdelete(sqlist *l, int i, elemtype *e) / 算法2.5 / 初始条件:顺序线性表l已存在,1ilistlength(l) / 操作结果:删除l的第i个数据元素,并用e返回其值,l的长度减1 elemtype *p, *q;if(i (*l).length) / i值不合法return error;p = (*l).elem + i - 1; / p为被删除元素的位置 *e = *p; / 被删除元素的值赋给e q = (*l).elem + (*l).length - 1; / 表尾元素的位置 for (+p; p = q; +p) / 被删除元素之后的元素左移 *(p-1) = *p;(*l).length-; / 表长减1 return ok;status listtraverse(sqlist *l, void (*vi)(elemtype*) / 初始条件:顺序线性表l已存在 / 操作结果:依次对l的每个数据元素调用函数vi()。一旦vi()失败,则操作失败 / vi()的形参加&,表明可通过调用vi()改变元素的值 elemtype *p;int i;p = (*l).elem;for(i = 1; i = (*l).length; i+) vi(p+);/printf(n);return ok;/vivoid print(elemtype *a)printf(%d ,*a);/冒泡排序void sort(sqlist *l)int i, j, sign, tmp;for(i = 0; i length - 1; i+)sign = 0;for(j = l-length - 1; j i; j-)if(l-elemj elemj-1)tmp = l-elemj;l-elemj = l-elemj-1;l-elemj-1 = tmp;sign = 1; /判断当前元素与其它元素是否相等int duplicatetest(sqlist l, elemtype e)int i;elemtype f;for (i = 1; i = listlength(l); i+)getelem(l, i, &f);if (e = f)return true;return false;/intersectionvoid intersection(sqlist la,sqlist lb,sqlist *lc)int la_length,lb_length;elemtype a,b; int i=1, j=1, k=1; la_length=la.length;lb_length=lb.length;for(i = 1;i = la_length; i+)getelem(la, i, &a); for(j=1; j = lb_length; j+)getelem(lb,j,&b); if(a = b)listinsert(lc, k+, a);/unionstatus union(sqlist la, sqlist lb, sqlist *lc)elemtype e;inti = 1;clearlist(lc);while(i = listlength(la)getelem(la, i, &e);listinsert(lc, 1, e);i+;i = 1;while(i = listlength(lb)getelem(lb, i, &e);/get elem from lbif(duplicatetest(la, e) = 0)/if all elems are not equal with lalistinsert(lc, 1, e);i+;return ok;/output输出函数void output(sqlist *l)if (listempty(*l)printf( 该集合为空集!n);elseprintf( );sort(l);listtraverse(l, print);printf(n);/input 输入函数int input(sqlist &l)int n;int flag;doflag = scanf(%d, &n);if (flag = 0)printf( 请输入整数!t);while ( getchar() != n ); /* clear the input buffer */while (flag != 1);if (n = 0)printf( 该集合为空集!n);elseinput:printf( 请输入该集合的元素:);int i, j, e, f, flag;for(i = 1; i 1)for (i = 1; i = n; i+)getelem(l, i, &e);for (j =i + 1; j key;switch (key)case a:case a:in

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论