1、数据结构课程设计报告的书写规范及示例数据结构课程设计报告的书写规范对于每一个应用程序所解决的问题,都应有规范说明的文档。书写合格的文档和编程调试同等重要,是合格软件必不可少的文献。本课程设计采用的规范说明格式如下:题目:一、问题描述1、题目内容2、基本要求3、测试数据二、需求分析1、(程序所能达到的基本功能)2、(输入的形式和输入值的范围)3、(输出的形式)4、(测试数据要求)三、概要设计1、(所需的ADT,它们的作用)2、(主程序流程及模块调用关系)3、(核心的粗线条伪码算法)四、详细设计1、(实现概要设计的数据类型,重点语句加注释)2、(每个操作的伪码算法,重点语句加注释)3、(主程序和其
2、他模块的伪码算法,重点语句加注释)4、(函数调用关系图)五、调试分析1、(设计与调试过程中遇到的问题及分析、体会)2、(主要和典型算法的时空复杂度的分析)六、使用说明(简要说明程序运行操作步骤)七、测试结果 (包括输入输出,输入集应多于需求分析的数据)八、附录(带注释的源程序) 其中,问题描述旨在建立问题提出的背景环境,指明问题的求解的要求。需求分析以无歧义的方式陈述说明程序设计的任务和功能。概要设计说明程序中用到的所有抽象数据类型的定义、主程序流程和模块之间的层次关系。详细设计实现概要设计中定义所有数据类型,对每个操作和核心模块写出伪码算法,画出函数的调用关系图。调试分析主要记载调试过程、经
3、验体会,并进行算法的时空分析。使用说明讲述操作步骤和运行环境。测试结果应包括运行的各种数据集和所有的输入输出情况。附录主要指源程序代码和下达任务的其他原始文件。 数据结构课程设计报告示例数据结构课程设计报告题 目:编制完成集合的交、并、差运算的程序专业年级: 姓 名: 学号: 12345 指导老师: 杨先凤、游书涛 完成日期:2012年1月6日 成绩: 一、问题描述1、题目内容:利用有序链表表示正整数集合,实现集合的交、并和差运算。2、基本要求:由用户输入两组整数分别作为两个集合的元素,由程序计算它们的交、并、差集,并将运算结果输出。3、测试数据:S1=3,5,6,9,12,27,35S2=5
4、,8,10,12,27,31,42,51,55,63运行结果应为:S1S2=3,5,6,8,9,10,12,27,31,35,42,51,55,63S1S2=5,12,27S1-S2=3,6,9,35二、需求分析:由于集合的操作主要限于求并、交和差,因此在本课程设计中以有序表表示集合,但进一步将集合本身设计成抽象数据类型,以便以后可以在集合类型的操作基础上,构造高一层次的算法,以便完成更复杂的应用。1、 本程序用以求出任意两个同类型数据的集合的交、并和差集。2、 程序运行后显现提示信息,由用户输入两组同类型的数。程序将自动滤去输入的重复整数及负数。3、 用户输入数据完毕,程序将输出运算结果。4
5、、 测试数据应为两组正整数,范围最好在035000之间。三、概要设计为实现程序功能,以有序链表表示集合。为此建立有序表和集合两个抽象数据类型。1、 有序表的抽象数据类型定义为: ADT OrderList 数据对象:D=ai|aiElemSet,i=1,2,n,n0 数据关系:R1=|ai-1,aiD,i=2,n 基本操作:InitList(&L) 操作结果:构造一个空的有序表L。 DestroyList(&L) 初始条件:有序表L已存在。 操作结果:销毁有序表L。ListEmpty(L) 初始条件:有序表L已存在。 操作结果:若L为空表,则返回TRUE,否则返回FALSE。 ListLeng
6、th(L) 初始条件:有序表L已存在。 操作结果:返回L中数据元素个数。 GetElem(L,i) 初始条件:有序表L已存在,并且1iListLength(L)。 操作结果:返回L中第i数据个元素的值。LocatePos(L,e) 初始条件: 有序表L已存在,e为和有序中元素同类型的值。 操作结果: 若有序表L中已存在和值e相同的元素,则返回它在有序表中的序号;否则返回0; InsertElem(&L,e) 初始条件:有序表L已存在。 操作结果:在L中按有序关系插入值和e相同的数据元素。DeleteElem(&L,i,) 初始条件:有序表L已存在。 操作结果:删除有序表L中第i个数据元素。 L
7、istTraverse(L,visit() 初始条件:有序表L已存在。 操作结果:依次对L的每个数据元素调用函数visit()。一旦visit()失败,则操作失败。ADT OrderedList 2、集合的抽象数据类型定义为: ADT Set 数据对象:D=ai|aiElemSet且ai互不相同,i=1,2,n,n0 数据关系:R1= 基本操作:CrtNullSet(&T) 操作结果:构造一个空集T。 DestroySet(&T) 初始条件:集合T已存在。 操作结果:销毁集合T。 AddElem(&T,e) 初始条件:集合T已存在。 操作结果:若集合T中不含和e相同的元素,则添加元素e,否则空
8、操作。 DelElem(&T,e) 初始条件:集合T已存在。 操作结果:若集合T中存在元素e,则从T中删除该元素,否则空操作。Union(&T,S1,S2) 初始条件:集合S1和S2已存在。操作结果:生成一个由S1和S2的并集构成的集合T。Intersection(&T,S1,S2) 初始条件:集合S1和S2已存在。操作结果:生成一个由S1和S2的交集构成的集合T。Difference(&T,S1,S2) 初始条件:集合S1和S2已存在。操作结果:生成一个由S1和S2的差集构成的集合T。PrintSet(T) 初始条件:集合T已存在。 操作结果:输出集合T中全部元素。ADT Set3、本程序由
9、三个模块完成,1、 主程序模块:用以接受命令和处理命令,完成集合的交、并和差运算。2、 集合单元模块;实现集合的抽象数据类型。3、 有序表单元模块:实现有序表的抽象数据类型。各模块单元之间的调用关系如下: 四、详细设计1、 元素类型、结点类型和指针类型。typedef int ElemType; /元素类型typedef struct NodeTypeElemType data;NodeType *next;NodeType, *LinkType; / 结点类型和指针类型2、 有序表类型。typedef structLinkType head,tail; / 分别指向有序链表的头结点和尾结点i
10、nt size; / 链表当前的长度int curpos; / 当前被操作的元素在有序表中的位置LinkType current; / 当前指针,指向链表中第 curpos 个元素OrderedList; / 有序链表类型3、公用的常量和类型声明:(CommonH源程序清单如下)#include#include#include#include#include#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define MAXINT 30000type
11、def int status; 4、有序链表实现单元(OrderdList.H源程序清单如下)typedef int ElemType;typedef struct NodeTypeElemType data;NodeType *next;NodeType, *LinkType; / 结点类型和指针类型typedef structLinkType head,tail; / 分别指向有序链表的头结点和尾结点int size; / 链表当前的长度int curpos; / 当前被操作的元素在有序表中的位置LinkType current; / 当前指针,指向链表中第 curpos 个元素Order
12、edList; / 有序链表类型status InitList(OrderedList &L)/ 构造一个带头结点的空的有序链表L,并返回TRUE/ 若分配空间失败,则令L.head为NULL,并返回FALSE L.head = new NodeType; if(!L.head) return FALSE; L.head-data = 0; / 头结点的数据域暂虚设元素为0 L.head-next = NULL; L.current = L.tail = L.head; L.curpos = L.size = 0; return TRUE; /InitListvoid DestroyList(
13、OrderedList &L)/ 销毁链表 LinkType p; while (L.head-next) p = L.head-next; L.head-next = p-next; delete p; /while delete L.head;/DestroyListElemType GetElem(OrderedList L, int i )/ 若1iListLength(L),则返回L中第 i 个元素,否则返回MAXINT/ MAXINT为予设常量,其值大于有序表中所有元素 if (iL.size) return MAXINT; if (i = L.curpos) return L.c
14、urrent-data; if (i next; while ( L.curpos next; return L.current-data;/GetElemint LocatePos(OrderedList &L, ElemType e) / 若有序表L中已存在值和e相同的元素,则返回它在有序表中的序号;/ 否则返回 0,此时 L.current 指示插入位置,即插在它之后 if (!L.head) return 0; / 有序表不存在 if ( e=L.current-data ) return L.curpos; if ( edata) L.current = L.head; L.curp
15、os = 0; if (L.head-next&e=L.head-next-data) return 1; while ( L.current-next &(eL.current-next-data) L.current = L.current-next; L.curpos+; if ( (!L.current-next) | ( e next-data ) ) return 0; else return L.curpos;/LocatePosvoid InsertElem(OrderedList &L, ElemType e ) / 若有序表L中不存在其值和 e 相同的元素,则按有序关系插入
16、之,/ 否则空操作。插入之后,当前指针指向新插入的结点 LinkType s; if (!LocatePos (L, e) s = new NodeType; s-data = e; s-next = L.current-next; L.current-next = s; if ( L.tail = L.current ) L.tail = s; L.current = s; L.curpos+; L.size+; /if/InsertElemvoid DeleteElem(OrderedList &L, int i ) / 若1iListLength(L),则删除有序表L中第 i 个数据元素
17、,否则空操作 int pre; LinkType q; if (i=1) & (inext; L.current-next = q-next; / 删除第 i 个元素 if ( L.tail = q ) L.tail = L.current; delete q; / 释放结点空间 L.size-; /if/DeleteElemvoid output(LinkType p) / 作为被visit导入的指针函数 coutdatanext; while(p) visit(p); p = p-next; /ListTraverse5、有序集实现单元:(OrderedSetH源程序清单如下)typede
18、f OrderedList OrderedSet;status CrtNullSet(OrderedSet &T)/ 构造一个空集Tif (InitList(T) / 构造空集T return TRUE;else return FALSE; /CrtNullSetvoid DestroySet(OrderedSet &T) / 销毁集合 T 的结构 DestroyList(T);/DestroyListvoid AddElem(OrderedSet &T, ElemType e) / 若集合T中不含和e相同的元素,则添加元素e,否则空操作 if ( e 0 ) InsertElem(T,e);
19、/AddElemvoid DelElem(OrderedSet &T, ElemType e) / 若集合T中含和e相同的元素,则删除之,否则空操作 ElemType k; if ( k = LocatePos(T, e) DeleteElem(T, k);/DelElemint SetLength(OrderedSet T) / 求集合元素的个数 return T.size;void Union(OrderedSet &T, OrderedSet S1, OrderedSet S2)/ 求集合S1和S2的并集T int ia,ib; ElemType a,b; if (InitList(T)
20、 / 构造空的结果集T并开始求并集 ia = 1; ib = 1; / ia和ib分别指示S1和S2中元素序号while ( (ia = SetLength (S1) | (ib = SetLength (S2) ) / S1或S2尚有元素 a = GetElem(S1, ia ); b = GetElem(S2, ib); / a和b为两集合中进行比较的当前元素 if (a=b) / 处理a=b的情况 InsertElem(T, a); / 在 T 中插入一个其值和a相同的元素 ia +; if (a = b) ib +; /if else / 处理ba的情况 InsertElem(T, b
21、); / 在 T 中插入一个其值和b相同的元素 ib +; /else /while /if /Unionvoid Intersection(OrderedSet &T, OrderedSet S1, OrderedSet S2)/ 求集合S1和S2的交集T int ia,ib; ElemType a,b;if (InitList(T) / 构造空的结果集T并开始求交集 ia = 1; ib = 1; / ia和ib分别指示S1和S2中元素序号 while ( (ia = SetLength (S1) & (ib = SetLength (S2) ) a = GetElem(S1, ia );
22、 b = GetElem(S2, ib);/ a和b为两集合中进行比较的当前元素 if ( a b ) ib +; else / 处理 a = b的情况 InsertElem(T, a); / 在 T 中插入一个其值和a相同的元素 ia +; ib +; /else /while /if /Intersectionvoid Difference(OrderedSet &T, OrderedSet S1, OrderedSet S2)/ 求集合S1和S2的差集T int ia,ib; ElemType a,b; if (InitList(T) /构造空的结果集T并开始求差集 ia = 1; ib
23、 = 1; / ia和ib分别指示La和Lb中元素序号 while ( (ia = SetLength (S1) | (ib = SetLength (S2) ) / S1或S2尚有元素 a = GetElem(S1, ia ); b = GetElem(S2, ib);/ a和b为两集合中进行比较的当前元素 if ( b = a ) / 处理b=a的情况 ib +; if (a = b) ia +; /if else / 处理a elem; while ( elem != -1 ) AddElem(ST,elem); cin elem; /while/CreateSetvoid PrintS
24、et(OrderedSet T)/ 输出集合的全部元素coutendl;ListTraverse(T,output);cout; /PrintSet6、主程序模块(SetCpp源程序清单如下)#includecommon.h#includeorderlist.h#includeorderset.hvoid main( ) OrderedSet S1,S2,T1,T2,T3; coutendlInput S1: ; /构造集合S1 CreateSet(S1); coutendlInput S2: ; /构造集合S2 CreateSet(S2); PrintSet(S1); PrintSet(S2
25、); /显示集合S1及S2 Union(T1,S1,S2); /对集合作并、交、差运算,显示结果 coutendlUnion: ; PrintSet(T1); Intersection(T2,S1,S2); coutendlIntersection: ; PrintSet(T2); Difference(T3,S1,S2); coutendlDifference: ; PrintSet(T3); DestroySet(T1); /销毁各集合 DestroySet(T2); DestroySet(T3); DestroySet(S1); DestroySet(S2); coutendlTHE E
26、NDendl;五、调试分析1、 程序中将指针的操作封装在链表的类型中,在集合的类型模块中,只须引用链表的操作实现相应的集合运算即可,从而使集合模块的调试比较方便。2、 算法的时空分析:(1) 由于有序表采用带头结点的有序单链表,并增设尾指针和表的长度两个标识,各种操作的算法时间复杂度比较合理,LocatePos,GetElem及DestroyList等操作的时间复杂度均为O(n),其中n为链表长度。(2) 构造有序集算法CreateSet读入n个元素,逐个用LocatePos判定输入元素不在当前集合确定插入位置后,采用InsertElem插入到当前并集中,从表面上看,其时间复杂度为O(m*n)
27、,但由于“插入”是按元素值由小到大的次序进行,m+n次LocatePos操作的时间复杂度为O(m+n),这充分体现了在链表的定义中设置当前指针current 和当前位置curpos的优越性。因此,算法Union的时间复杂度为O(m+n)。可作类似分析,求交集算法Intersection和求差集算法Difference的时间复杂度也是O(m+n)。销毁集合算法DestroySet和输出集合运算的算法PrintSet都是对每个元素调用一个O(1)的函数,因此都是O(n)d .除了构造有序集算法CreateSet用一个ElemType类型变量elem读入元素,需要O(1)的辅助空间外,其余算法使用的辅助空间也与元素个数
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1