1、五、评分标准1. 根据平时上机考勤、表现和进度,教师将每天点名和检查2. 根据课程设计完成情况,必须有可运行的软件。3. 根据课程设计报告的质量,如有雷同,则所有雷同的所有人均判为不及格。4. 根据答辩的情况,应能够以清晰的思路和准确、简练的语言叙述自己的设计和回答教师的提问六、建议参考资料1数据结构 (C语言版)严蔚敏、吴伟民 主编 清华大学出版社 2004.112数据结构课程设计案例精编(用C/C+描述),李建学 等 编著,清华大学出版社 2007.23.数据结构:用面向对象方法与C+语言描述,殷人昆 主编,清华大学出版社 2007第1章 需求分析1、 本演示程序中,集合的元素限定为小写字
2、母字符“a”z”。集合输入的形式为一个以“0“为结束标志的字符串,串中字符顺序不限。2、 演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息“之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算结果显示在其后。3、 程序执行的命令包括:1)构造集合A;2)构造在集合B;3)删除集合A内的元素;4)删除集合B内的元素;5) 在集合A中插入元素;6)在集合B中插入元素;7)求AB集合的并集;8)求AB集合的交集;9)求AB及BA的差集第2章 总体设计 总体设计框架图,如图2.1所示:图2.1 总体设计框架第3章 抽象数据类型定义定义格式如下:3.1 LinkLi
3、st抽象数据类型的设计 ADT LinkList 基本操作: InitList(LinkList *L) 构造一个空的线性表L DestroyList(LinkList *L) 初始条件:线性表L已存在 ListEmpty(LinkList L)线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE Status ListInsert(LinkList L,int i,ElemType e) 在带头结点的单链线性表L中第i个位置之前插入元素e ListPrint(LinkList L) 依次输出链表中的元素3.2 集合抽象数据类型的设计 typedef struct LNod
4、e char data; struct LNode *next; LNode, *LinkList;第4章 详细设计4.1 工程视图 图4.1 工程视图4.2 类图视图 图4.2 类图视图4.3 主要算法的详细设计4.3.1 插入算法的详细设计 void ListSort(LinkList L)LinkList first; /*为原链表剩下用于直接插入排序的节点头指针*/LinkList t; /*临时指针变量:插入节点*/LinkList p; /*临时指针变量*/LinkList q;first = L-next; /*原链表剩下用于直接插入排序的节点链表*/L-next = NULL;
5、 /*只含有一个节点的链表的有序链表。*/while (first != NULL) /*遍历剩下无序的链表*/*插入排序*/for (t = first, q = L; (q!=NULL) & (q-data data); p=q, q=q-next); /*无序节点在有序链表中找插入的位置*/*退出for循环,就是找到了插入的位置*/first = first- /*无序链表中的节点离开,以便它插入到有序链表中。if (q = L) L = t; /*插在第一个节点之前*/else p-next = t; /*p是q的前驱*/t-next = q; /*完成插入动作*/4.3.2 清除算法
6、的详细设计void qingchu(LinkList La)/*清除链表中相同的元素*/char i,j;LinkList p,q;La-p=La;q=p-while(q)i=p-data; j=q- if(i=j) q=p- /* 删除并释放结点 */ p-next=q- free(q); p=p- q=p-4.3.3 求交集算法的详细设计void Jiaoji(LinkList La,LinkList Lb,LinkList Lc) /*求两集合的交集,将结果存入另一个链表中*/ char i,j; LinkList p ,q; La- Lb- p=La; q=Lb; while(p&q)
7、 i=p- if(i if(i q=q- ListSort(Lc); printf(AB=);ListPrint(Lc);4.3.4 求并集算法的详细设计void bingji(LinkList La,LinkList Lb,LinkList Lc) char i,j;/*求两集合的并集*/Lb-q=Lb;while(p&p=p- ListInsert(Lc,1,j); while(p)i=p-ListInsert(Lc,1,i); while(q)j=q-ListInsert(Lc,1,j);AB= ListPrint(Lc); 4.3.5 求差集算法的详细设计void chaji(Link
8、List La,LinkList Lb,LinkList Lc)char i,j; i=p-if(iwhile(p)i=p-ListSort(Lc);第5章 测试图5.1 输入输出AB集合图5.2 对AB集合进行删除操作图5.3 对AB集合进行插入操作图5.4 对AB集合进行并交差操作第6章 总结在本次数据结构课程设计的过程中,深刻的意识到对程序代码设计的难度,不过这更让我在这过程中受益匪浅,体味到计算机系的高大上。这个课程具有很高的挑战性和耐性。进行程序设计的时候注意模块的划分,从各个小模块开始进行设计。设计的过程中,出现了很多错误,但是通过查找资料,反复对比内容的真伪性,找出了问题的所在,
9、并最终解决了问题,这过程中结果并不显的那么重要,因为有艰辛的过程,所以才显出了结果的完美,它让我更加坚定了在这条路上的努力发展。附录:程序代码 #includectype.hmalloc.h / malloc()等limits.h / INT_MAX等stdio.h / EOF(=Z或F6),NULLstdlib.h / atoi()io.h / eof()math.h / floor(),ceil(),abs()process.h / exit()iostream / cout,cin / 函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK
10、1 #define ERROR 0 #define INFEASIBLE -1 / #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 typedef int Status; / Status是函数的类型,其值是函数结果状态代码,如OK等 typedef int Boolean; / Boolean是布尔类型,其值是TRUE或FALSE typedef int ElemType;/*线性表的单链表存储结构*/typedef struct LNodechar data;struct LNode *next;LNode, *LinkList;Li
11、nkList h;/*带有头结点的单链表的基本操作*/void InitList(LinkList *L) /* 操作结果:构造一个空的线性表L */*L=(LinkList)malloc(sizeof( LNode); /* 产生头结点,并使L指向此头结点 */if(!*L) /* 存储分配失败 */exit(OVERFLOW);(*L)-next=NULL; /* 指针域为空 */void DestroyList(LinkList *L) /* 初始条件:销毁线性表L */while(*L)q=(*L)-free(*L);*L=q;void ClearList(LinkList L) /*
12、 不改变L */将L重置为空表 */p=L- /* p指向第一个结点 */while(p) /* 没到表尾 */free(p);p=q;printf(删除成功n /* 头结点指针域为空 */Status ListEmpty(LinkList L)若L为空表,则返回TRUE,否则返回FALSE */if(L-next) /* 非空 */return FALSE;elsereturn TRUE;Status ListInsert(LinkList L,int i,ElemType e) /* 不改变L */ /* 在带头结点的单链线性表L中第i个位置之前插入元素e */int j=0;LinkLi
13、st p=L,s;j i-1) /* i小于1或者大于表长 */return ERROR;s=(LinkList)malloc(sizeof(struct LNode); /* 生成新结点 */s-data=e; /* 插入L中 */next=p-p-next=s;return OK;Status ListDelete(LinkList L,int i,ElemType *e) /* 不改变L */ /* 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 */LinkList p=L,q;while(p-next&ji-1) /* 删除位置不合理 */*e=q-free(q);voi
14、d ListPrint(LinkList L) /*依次输出链表中的元素*/LinkList p=L-p)空集nwhile(p)%c, p-data);p = p-nvoid ListSort(LinkList L)void zengtian(LinkList La)/*向集合中添加元素*/char a;请输入要增添的元素,加0结束nscanf(,&a);while(a!=0)if(aaaAZ)ListInsert(La,1,a);getchar();/*消除空格*/ListSort(La);ListPrint(La); void Jiaoji(LinkList La,LinkList Lb,
15、LinkList Lc)int main()char b;char c;LinkList L1,L2,L3,L4,L5,L6;InitList(&L1);L2);L3); /*构建需要的链表*/L4);L5);L6);*n 欢迎使用集合交并差运算程序n请输入A集合的元素,加0结束nListInsert(L1,1,a);getchar();ListSort(L1);qingchu(L1);ListPrint(L1);请输入B集合的元素,加0结束nb);while(b!if(bbListInsert(L2,1,b);ListSort(L2);qingchu(L2);ListPrint(L2);请选择你要的操作n1.删除A集合内元素n2.删除B集合内元素n3.添加元素至A集合n4.添加元素至B集合n5.ABn6.ABn7.A-Bn8.B-An0.结束ndo scanf(c); getchar(); switch(c)case 1:ClearList(L1);break;2ClearList(L2);3zengtian(L1);4zengtian(L2);5Jiaoji(L1,L2,L4);6bingji(L1,L2,L3);7chaji(L1,L2,L5);8chaji(L2,L1,L6);default:欢迎使用nwhile(c!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1