ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:28.75KB ,
资源ID:18738289      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18738289.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(《C语言程序设计实验》实验报告样板Word文档下载推荐.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

《C语言程序设计实验》实验报告样板Word文档下载推荐.docx

1、aeort,SetlSet2Inp;二、概要设计为实现上述程序功能,应以有序链表表示集合。为此,需要两个抽象数据类型:有序表和集合。(1)有序表的抽象数据类型定义为:ADT OrderedList 数据对象;D=ai|aiCharSet,i=1,2,n,n0 数据关系:R1=ai-1,ai|ai-1,aiD,ai-1ai,i=1,2,n, 基本操作:InitList(&i) 操作结果;构造=个空的有序表L。DestroyList(&L) 初始条件:有序表L已存在。 操作结果:销毁有序表L。ListLength(L)返回有序表L的长度。ListEmpty(L)若有序表L为空表,则返回True,否

2、则返回False。GetElem(L,pos)若lposLength(),则返回表中第pos个数据元素。LocateElem(L,e,&q)若有序表L中存在元素e,则q指示L中第一个值为e的元素的位置,并返回函数值TRUE;否则e指示第一个大于e的元素的前驱的位置,并返回函数值FALSE。APPend(&L,e)在有序表L的末尾插入元素e。InsertAfter(&L,q,e)有序表L已存在,q指示L中一个元素。在有序表L中q指示的元素之后插入元素e。ListTraverse(q,visit()依次对L中q指示的元素开始的每个元素调用过程visit()。ADT OrderedList (2)集

3、合的抽象数据类型定义为:ADT Set 数据对象:=(ai|ai为小写英文字母且互不相同,i=1,2,n,0n26)R1=Createset(&T,Str)Str为字符串。生成一个由中小写字母构成的集合T。Destroyset(&T)集合T已存在。销毁集合T的结构。Union(t,S1,S2)集合S1和S2存在。生成一个由S1和S2的并集构成的集合T。Intersection(&T,S1,S2)生成一个由a和S2的交集构成的集合T。Difference(&生成一个由S1和S2的差集构成的集合T。Printset(T)按字母次序顺序显示集合T的全部元素。 ADT Set(3)本程序包含4个模块:

4、1)主程序模块:BEGINmain 初始化; REPEAT 接受命令; 处理命令; UNTIL“命令”=“退出”;END2)集合单元模块实现集合的抽象数据类型;3)有序表单元模块实现有序表的抽象数据类型;4)结点结构单元模块定义有序表的结点结构.各模块之间的调用关系如下:三、详细设计(1)元素类型、结点类型和指针类型TYPE ElemTypechar;元素类型 LinkType=NodeType;指针类型 NodeTypeRECORD结点类型 data:ElemType ; next:LlnkType END; ViSitProcPROCEDURE(p:LinkType); 访问结点的过程类型

5、FUNC MakeNode(VAR p:LinkType ; e:ElemType):boolean ;分配由p指向的数据元素为e、后继为“空”的结点,并返回“True”,若分配失败,则返回“False” IF MaxAvailSizeof(p)THEN return(False) MaxAvail是标准无参函数,返回堆中最大自由块的大小 ELSE【new(p);p.data:=e;p.next:=NIL;return(True)】ENDF;PROC FreeNode(VAR p: 释放P所指结点 FUNC Copy(p:LinkType): 复制生成和指针P所指结点有同值元素的新结点并返回,

6、若分配空间 失败,则返回空指针。新结点的指针域为NIL IF MaxAvail Sizeof(p)THEN return(NIL) MaxAvail是标准无参函数,返回堆中最大自由块的大小 ELSE 【 new(s);s.data:=p”.data;s.next:return(s)】ENDF ;FUNC Elem(p: 若指针 P NIL,则返回 P所指结点的数据元素,否则返回 FUNC SuccNode(p:若指针PNIL,则返回指向P所指结点的后继元素的指针。否则返回 NIL(2)根据有序表的基本操作的特点,有序表采用有序链表实现。链表设头、尾两个指针和表长数据域,并附设头结点,头结点的数

7、据域没有实在意义。 TYPE OrderedListRECORD 有序链表类型 head,tail:LinkType; 分别指向线性链表的头结点和尾结点 Size:integer; 指示链表当前的长度有序链表的基本操作设置如下:FUNC InitList(VAR L:OrderedList):构造一个带头结点的空的有序链表L,并返回“true”;若分配空间失败则令L.head为NIL,并返回“False”PROC DestroyList(VAR L:OrderedList);销毁有序链表LFUNC ListEmpty(L:boollean;若 L不存在或为“空表”,则返回“True”,否则返回

8、“False”FUNC ListLength(L:Integer ;返回链表的长度FUNC GetElemPos(L:OrderedList;Pos:integer):若 L存在且 OPosL.Size1,则返回指向第 pos个元素的指针,否则返回 NILFUNC LOCateElem (L:e:ElemType;VAR q: boolean ;若有序链表L存在且表中存在元素e,则q指示L中第一个值为e的结点的位置,并返回 True;否则 q指示第一个大于e的元素的前驱的位置,并返回 FalsePROC Append(VAR L:s:在已存在的有序链表L的末尾插入指针S所指结点PROC Ins

9、ertAfter(VAR L:OrderList;q:linkType);在已存在的有序链表L中q所指示的结点之后插入指针S所指结点PROC TraverseList(p:viS1t:Proc);从p(pNIL)指示的结点开始,依次对每个结点调用过程Visit() 其中部分操作的伪码算法如下:boolean; IF MakeNode(head,)THEN头结点的虚设元素为空格符 【L.tail:=L.head; L.Size:=0; return(True) 】 ELSE【 L.head:NIL; return(False)ENDP;InitList WITH L DO 【p:=head; W

10、HILE pNIL DO 【 q:=P P:=SuCCNode(P); FreeNode(q)】; head:=tail:=NILDestroyListpos:integer): IF(L.head= NIL)OR(pos1)OR(posL.Size)THEN return(NIL) ELSE IF pos= L.Size THEN return(L.tail) p:L.head.next;k:1; WHILE(pNIL)CAND(kPos)DO=SuccNode(p);=k1;】 return(P)GetElemPosFUNC LocateElem(L:OrderedList ;VAR p:

11、 IF L.headNIL THEN【 pre:L.head;p:pre.next; pre指向p的前驱,P指向第一个元素结点 WHILE(pNIL)CAND(p.datae)DO 【 Pre:= SuccNode(p)】 ; IF(pNIL)CAND(p.datae)THEN return(True) ELSE【p:=pre;return(False)】 ELSE return(False)LocateElem IF(L.headNIL)CAND(sNIL)THEN【 IF tailhead THEN【tail.next:=s;tail:=s】 ELSE【head.next:=s】; Inc

12、(L.Size)】AppendOrderListt; IF(L.headNIL)AND(qNIL)CAND(sNIL)THEN 【s.next:=q.next;q.next: IF L.tailq THEN L.tail:s; Inc(L.Size)InsertAfterPROC ListTraverse(p:LinkType viS1t: 【visit(p);=SuccNOde(p)】ListTraverse(3)集合Set利用有序链表类型 OrderedLList来实现,定义为有序集 Orderedset: TYPE OrderedsetOrderedList;集合类型的基本操作的类Pas

13、cal伪码描述如下: PROC Createset(VAR T:Orderedset; s:string); 生成由串 s中小写字母构成的集合 T,IsLower是小写字母判别函数 IF InitList(T)构造空集TTHEN FOR i:=1 TO length(s)DO IF IsLower(si)CAND NOT LocateElem(T,si,p)THEN 过滤重复元素并按字母次序大小插入 IF MakeNode(q,si)THEN InsertAfter(T,p,q) ENDP;Createset PROC Destroyset(VAR T:Orderedset); 销毁集合T的结

14、构 DestroyList(T) PROC Union(VAR T:Orderedset ; S1,S2: 求已建成的集合S1和S2的并集T,即 S1.headNIL 且 S2.headNIL IF InitList(T)THEN【 pl:=GetElemPos(s1,1);p2:=GetElemPos(S2,1); WHILE(plNIL)AND(p2NIL)DO 【c1:=Elem(pl);c2=Elem(p2); IF C1=C2 THEN 【Append(T,Copy(pl);pl:=SuCCNOde(pl); IF C1=c2 THEN p2:=SUCCNOde(p2); 】 ELS

15、E【Append(T,Copy(p2);=SuccNode(p2); WHILE plNIL DO=SuccNode(pl);】; WHILE p2NIL DO 【Append(T,Copy(p2);Union PROCEDURE Intersection(VAR T: 求集合S1和S2的交集T IF NOT InitList(T)THEN T.headNIL ELSE 【=GetElemPOs(S1,1);c2:=Elem(p2); IF C1C2 THEN pl:=SuccNode(pl) ELSE IF C1C2 THEN p2:=SuccNode(p2) ELSEc1=c2 p2:=S

16、uccNOde(p2) 】Intersection PROC Difference(VAR T:S1,S2: 求集合S1和S2的差集T IF NOT InitList(T)THEN T.head:=GetElemPos(S1,1); WHILE(p1NIL)AND(p2NIL)DO=Elem(p1); IF c1c2 THEN=SuccNode(pl)】 ELSEc1=C2 【pl:=SuccNode(p2)】 】; WHILE p1NIL DOSuccNode(pl)】Difference PROC WritesetElem(p:LlnkType); 显示集合的一个元素 write(,);W

17、riteElem(Elem(p);WritesetElem PROC Printset(T: 按Pascal格式显示集合的全部元素GetElemPos(T,1); IF pNIL THEN 【writeSetElem(p);=SuccNode(p)】 ListTraverse(p,WrltesetElem); wrietelnn(Printset (4)主程序和其他过程的伪码算法 BEGIN 主程序 Initialization;(初始化) REPEAT ReadCommand(cmd);读入一个操作命令符 InterPret(cmd)解释执行操作命令符 UNTIL cmd INq,Q END

18、.main PROC Initialization;系统初始化 Clrscr;清屏 在屏幕上方显示操作命令清单: Makesetl-1 Makeset2-2 Union-u Intersaction-i Difference-d Quit-q; 在屏幕下方显示操作命令提示框; Createset(Setl,Printset(Setl); 构造并显示空集Setl Createset(Set2,Printset(Setl) 构造并显示空集Set2Initializatlon PROC ReadCommand(VAR cmd: char); 读入操作命令符 显示键入操作命令符的提示信息; cmd:R

19、eadKey12uUiIdD; 回显cmd PROC Interpret(cmd:Char); 解释执行操作命令 cmd CASE cmd OF :【显示以串的形式键人集合元素的提示信息; readh(v);读入集合元素到串变量v Createset(Setl,v);构造并显示有序集Setl【显示以串的形式键入集合元素的提示信息; rcaredln(v);读入集合元素到串变量v Createset(Set2,v);Printset(Set2);构造并显示有序集 Set2【Union(Set3,Setl,Set2); 求有序集Setl和Set2的并集Set3 Printset(Set3);显示并

20、集 Set3 DestroyList(Set3)销毁并集 Set3【 Intersaction(Set3,Setl,Set2); 求有序集Setl和 Set2的交集Set3 DestroyList(Set3)d,【 Difference(Set3,Setl,Set2);求集合 Setl和 Set2的差集 Set3 ENDC;(Interpret)(5)过程和函数的调用关系图反映了演示程序的层次结构:四、调试分析(1)由于对集合的3种运算的算法推敲不足,在有序链表类型的早期版本未设置尾指针和APPend操作,导致算法低效。(2)初时曾忽略了一些变量参数的标识“VAR”,使调试程序时费时不少。今后

21、应重视确定参数的变量和赋值属性的区分和标识。(3)本程序的模块划分比较合理,且尽可能将指针的操作封装在结点和链表的两个模块中,致使集合模块的调试比较顺利。反之,如此划分的模块并非完全合理,因为在实现集合操作的编码中仍然需要判别指针是否为空,按理,两个链表的并、交和差的操作也应封装在链表的模块中,而在集合的模块中,只要进行相应的应用即可。(4)算法的时空分析1)由于有序表采用带头结点的有序单链表,并增设尾指针和表的长度两个标识,各种操作的算法时间复杂度比较合理。InitList、ListEmpty、Listlength、Append和InsertAfter以及确定链表中第一个结点和之后一个结点的

22、位置都是O(1)的,DestroyList、LocateElem和TraverseList及确定链表中间结点的位置等则是O(n)的,n为链表长度。2)基于有序链表实现的有序集的各种运算和操作的时间复杂度分析如下:构造有序集算法Createset读入n个元素,逐个用LocateElem判定不在当前集合中及确定插入位置后,才用InsertAfter插入到有序集中,所以时间复杂度是O(n)。求并集算法Union利用集合的“有序性”将两个集合的mn个元素不重复地依次利用Append插入到当前并集的末尾,故可在O(mn)时间内完成。可对求交集算法Intersection和求差集算法Difference作类似地分析,它们也是O(mn)的。销毁集合算法Destroyset和显示集合算法Printset都是对每个元素调用一个O(1)的过程,因此都是O(n)的。除了构造有序集算法Createset用一个串变量读入n个元素,需要O(n)的辅助空间外,其余算法使用的辅助空间与元素个数无关,即是O(1)的。(5)本实习作业采用数据抽象的程序设计方法,将程序划分为四个层次结构:元素结点、有序链表、有序集和主控模块,使得设计时思路清晰,实现时调试顺利,各模块具有较好的可重用性,确实得到了一次良好的程序设计训练。五、用户手册(1)本程序的运行环境为DOS操作系统,执行文件为:SetDemos.exe。(2)进

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1