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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

王勤为的课程设计报告修改.docx

1、王勤为的课程设计报告修改数据结构课程设计报告封面1.班级:信息安全02班 2.学号:09090917233.姓名:王勤为 4.所选题目:一号题5.完成日期:2011/7/1 课程设计报告目录八附录:源代码一. 需求分析1. 建立顺序表储存结构,演示插入、删除和合并等基本操作。2利用插入运算建立链表;实现链表的查找、删除、计数、输出等功能以及有序链表的合并。3建立串的储存结构,演示串的模式匹配(包括求next和nextval的值),需要包含串的输入输出。4. 要求要有良好的界面,每个系统组织到一个统一的界面中。5.程序能够良好运行,输入合理的数据能够输出正确的结果,且操作可重复实现。二. 概要设

2、计(c语言) 1.概要流程图2.储存类型说明 顺序表:内存动态分布结构 typedef struct List int *base;/地址 int lenth;/表长(元素个数) int listsize;Sqlist;/listsize当前储存容量链表:带头结点的单向链表 typedef struct LNode int date;/数据类型 struct LNode *next;/指向下一节点的指针*link;/结点类型 串:用定长的数组来储存typedef struct char dataMAXSTRING+1;/0号单元储存其长度 SString;/串结构体说明三详细分析 1.顺序表相

3、关分析基本函数 初始化函数:initlist1(Sqlist &L) 插入元素函数:Listinsert1(Sqlist &L,int i,int e) 输入元素函数:Listputin1(Sqlist &L,int n) 删除元素函数:Deletelist1(Sqlist &L,int i) 销毁函数:Clearlist1(Sqlist &L) 合并函数:Mergelist1(Sqlist &L1,Sqlist &L2) 辅助函数: 显示界面函数paint1() 显示顺序表元素的函数Displaylist1(Sqlist &L) 关键函数的算法分析: 初始化函数initlist1(Sqlis

4、t &L):分配空间从键盘获得要输入元素个数调用Listputin1()函数进行元素输入初始化完毕。 int initlist1(Sqlist &L) L.base=(int*)malloc(MAX_SIZE*sizeof(int); if(!L.base) return(0); L.lenth=0;L.listsize=0; printf(请输入要输入元素的个数:); int n; scanf(%d,&n); Listputin1(L,n); printf(初始化成功!); 插入元素函数:Listinsert1(Sqlist &L,int i,int e):重新分配空间用q指向插入位置的前一

5、个q之后的元素右移,空出插入位置插入元素e。 int Listinsert1(Sqlist &L,int i,int e) if(!L.base) return(0); if(iL.lenth+1) return(0);/插入位置不合理退出 int *newbase,*q,*p; if(L.lenthL.listsize) newbase=(int*)realloc(L.base,(L.listsize+SIZE_increase)*(sizeof(int); if(!newbase) return(0); L.base=newbase; L.listsize+=SIZE_increase;

6、q=&(L.basei-1); for(p=&(L.baseL.lenth-1);p=q;p-) *(p+1)=*p; *q=e; L.lenth+; return(1);输入元素函数Listputin1(Sqlist &L,int n):其实质就是不停的调用插入函数,从键盘获得要插入的元素个数n,然后进行n次插入操作 int Listputin1(Sqlist &L,int n) if(!L.base) return(0); int i,e; printf(请一次输入所有元素:); for(i=1;i=n;i+) scanf(%d,&e);Listinsert1(L,i,e);删除元素函数D

7、eletelist1(Sqlist &L,int i):用q指向插入位置i的后一个p之后的元素左移删除完毕。int Deletelist1(Sqlist &L,int i) if(!L.base) return(0); int e; int *q,*p; e=L.basei-1; q=&(L.baseL.lenth-1); for(p=&(L.basei);p=&(L.baseL.lenth-1);p+) *(p-1)=*p; /删除位置之后的元素左移 L.lenth-; return(e); 合并函数Mergelist1(Sqlist &L1,Sqlist &L2): 其实质是把L2中的元素

8、插入到L1中去,通过两重循环检查L2中的元素在L1中是否存在,如果存在就不插入,否则就插入L1中。 int Mergelist1(Sqlist &L1,Sqlist &L2) if(!L1.base)|(!L2.base) exit(0); int i,m; for(i=0;iL2.lenth;i+) /L2中的元素逐个检查 m=0; while(L2.basei!=L1.basem&mnext赋值为空头插法建表获取要插入元素的个数n进行n次插入元素操作进行排序,调用排序函数list_sort2(L,n),使按非递增方式排列。Initlist2(link &L,int n) link p; L

9、=(link)malloc(sizeof(LNode); L-next=NULL; if(!L) exit(-1); printf(初始化链表成功!); printf(请依次输入所有元素!); int i; for(i=n;i0;i-) p=(link)malloc(sizeof(LNode); scanf(%d,&(p-date); p-next=L-next; L-next=p; list_sort2(L,n); /初始化的同时排序 排序函数list_sort2(link &L,int n): 排序思想为冒泡排序 list_sort2(link &L,int n) link p,r;/p指

10、向当前元素,r指向后一元素 int i; for(i=1;inext; r=p-next; while(r&p) if(p-date)(r-date)int q; q=p-date; p-date=r-date; r-date=q; /大的元素往后移,即进行交换操作 if(p-date)=(r-date)p-next=r-next;free(r);i+; p=p-next; if(p)r=p-next; /有相等的元素就删除一个 /while /for/排序函数 插入函数ListInsert2(link &L,int i,int e) 通过循环使p指向插入位置的前一个元素给新节点q分配空间修改

11、指针使q插入到p之后插入完毕! ListInsert2(link &L,int i,int e) int j; link p;link q;p=L;j=0; if(!(p-next)|ji-1) printf(发生错误!);return(0);/插入位置不合理 while(p-next&jnext; +j; /使p指向插入位置的前一个 q=(link)malloc(sizeof(LNode); q-date=e; q-next=p-next; /修改指针 p-next=q; printf(插入成功!);删除函数ListDelete2(link &L,int i) 算法思想同前一函数差不多 Li

12、stDelete2(link &L,int i) link p,q; int j; p=L;j=0; while(p-next&jnext; +j; /p指向要删除元素的前一个 if(!(p-next)|ji-1)exit(-1);printf(发生错误!); q=p-next;p-next=q-next;free(q); printf(已删除元素);计数函数get_num(link L) 用j做为计数器通过循环直到表尾,每次j都加一最终j为表中元素的个数get_num(link L) link p;int j;/j为计数器 p=L;j=0; while(p-next)p=p-next;j+;

13、 return(j);合并函数MergeList2(link La,link Lb) 其实质仍然是把Lb中的元素插入到L1中去把La的空间看做一个新表Lc不断移动两个指针比较两表中元素的大小小的元素插入到L中相同的元素摒弃当一个表中元素到了末尾时,把另一个表中的剩余元素插入Lc中。MergeList2(link La,link Lb) link pa,pb,Lc,pc; pa=La-next; pb=Lb-next; Lc=pc=La; while(pa&pb) if(pa-datedate) pc-next=pa;pc=pa;pa=pa-next; else if(pa-date=pb-da

14、te) pc-next=pa;pc=pa;pa=pa-next;pb=pb-next; /想同的元素摒弃 else pc-next=pb;pc=pb;pb=pb-next; /while pc-next=pa?pa:pb;/插入另一个表中的剩余元素 free(Lb);3串相关分析 基本函数创建串函数Createstr(SString &L)模式匹配函数Indexstr_kmp(SString &L,SString &T,int pos)求模式匹配值函数get_next(SString &T)求模式匹配修正值函数get_nextval(SString &T) 辅助函数 显示界面函数pain3()

15、关键函数的算法分析创建串函数Createstr(SString &L) 利用while 循环从键盘获得输入值字符串用#号结束输入完毕后把输入的字符输出以便检查。Createstr(SString &L) int i,m; char flag; i=1; printf(请依次输入各个字符); while(1) scanf(%c,&flag); if(flag!=#) L.datai=flag;+i; L.data0=i-1; else break; printf(您输入了以下字符!); for(m=1;mi;m+) printf(%c,(L.datam); 模式匹配函数Indexstr_kmp(

16、SString &L,SString &T,int pos) 设立两指针,i指向主串中当前比较字符,j指向模式串中当前比较的字符比较i和j指向的字符如果相等,两指针同事后移如果不相等,j等于nextj中保存的值如此反复,直到匹配成功或者主串用尽。Indexstr_kmp(SString &L,SString &T,int pos) int i,j; i=pos;j=1; while(i=L.data0&jT.data0) return(i-T.data0);/返回其位置 else return(0);求模式匹配值函数get_next(SString &T) 其实质就是检查模式串中是否存在以下相

17、等关系p(1) p(2) p(3).p(k-1) = s(i-k+1)s(i-k+2)s(i-1) 如果存在则nexti的值为k,不存在则为1,其中next1=0get_next(SString &T) int i,j; i=1;next1=0;j=0;next0=T.data0; while(iT.data0) if(j=0|T.datai=T.dataj) +i;+j;nexti=j; else j=nextj; 求模式匹配修正值函数get_nextval(SString &T) get_nextval(SString &T) int i,j; i=1;nextval1=0;j=0;nex

18、tval0=T.data0; while(iT.data0) if(j=0|T.datai=T.dataj) +i;+j; if(T.datai!=T.dataj) nextvali=j; else nextvali=nextvalj; else j=nextj; 四调试分析五 测试结果:上一步中分别对三个模块进行了测试,所有功能都正常实现,说明所用的算法正确无误。六 课程设计总结:1. 实践最重要,书本上的只是总是相对空泛的,只有实践才能真正掌握知识。2. 课程设计中或多或少遇到了一些困难,有些是算法上的,有些是代码上的。须得耐心冷静的进行调试,不要已有错误就去请教他人,自己总要有调试程序的

19、能力。3. 这是第一次完成代码量超过五百行的程序,各方面都获得了长足进步,编程的兴趣亦大大增加。总之感谢学校的与人制度,感谢陈再良教授给予的帮助和培养。七参考文献: 清华大学出版社 严蔚敏数据结构c语言版 清华大学出版社 谭浩强c程序设计八 附录:全部源代码 #include#include#define MAX_SIZE 100#define SIZE_increase 10#define MAXSTRING 255int nextMAXSTRING+1;int nextvalMAXSTRING+1; typedef struct List int *base; int lenth; int

20、 listsize;Sqlist;/顺序表结构体说明typedef struct LNode int date; struct LNode *next;*link;/线性表结构体说明 #define MAXSTRING 255typedef struct char dataMAXSTRING; SString;/串结构体说明 /顺序表的相关函数定义int Listinsert1(Sqlist &L,int i,int e) if(!L.base) return(0); if(iL.lenth+1) return(0); int *newbase,*q,*p; if(L.lenthL.lists

21、ize) newbase=(int*)realloc(L.base,(L.listsize+SIZE_increase)*(sizeof(int); if(!newbase) return(0); L.base=newbase; L.listsize+=SIZE_increase; q=&(L.basei-1); for(p=&(L.baseL.lenth-1);p=q;p-) *(p+1)=*p; *q=e; L.lenth+; return(1);int Listputin1(Sqlist &L,int n) if(!L.base) return(0); int i,e; printf(请

22、一次输入所有元素:); for(i=1;i=n;i+) scanf(%d,&e);Listinsert1(L,i,e); int initlist1(Sqlist &L) L.base=(int*)malloc(MAX_SIZE*sizeof(int); if(!L.base) return(0); L.lenth=0; L.listsize=0; printf(请输入要输入元素的个数:); int n; scanf(%d,&n); Listputin1(L,n); printf(初始化成功!);int Deletelist1(Sqlist &L,int i) if(!L.base) retu

23、rn(0); int e; int *q,*p; e=L.basei-1; q=&(L.baseL.lenth-1); for(p=&(L.basei);p=&(L.baseL.lenth-1);p+) *(p-1)=*p;/删除位置之后的元素左移 L.lenth-; return(e); int Clearlist1(Sqlist &L) if(!L.base) return(0); int i,m; m=L.lenth; for(i=1;i=m;i+) Deletelist1(L,1); free(L.base); return(1); int Displaylist1(Sqlist &L

24、) if(!L.base) printf(顺序表不存在);exit(0); int i; for(i=0;i=L.lenth-1;i+) printf(%d ,L.basei);int Mergelist1(Sqlist &L1,Sqlist &L2) if(!L1.base)|(!L2.base) exit(0); int i,m; for(i=0;iL2.lenth;i+) /L2中的元素逐个检查 m=0; while(L2.basei!=L1.basem&m=L1.lenth) m+; if(L2.basei=L1.basem) continue; Listinsert1(L1,L1.l

25、enth+1,L2.basei); return(1); void paint1() system(cls); putchar(n); putchar(n); putchar(n); printf( 实验一:顺序表相关操作nn); printf( 1.创建顺序表一 2.创建顺序表二nn); printf( 3.插入元素 4.合并两个顺序表nn); printf( 5.显示表中元素 6.销毁顺序表nn); printf( 0.退出n);int main1() int flag; Sqlist H1,H2; loop:paint1(); putchar(n); printf(请输入要操作项目的序号

26、:); scanf(%d,&flag); while(flag) switch(flag) case 1:initlist1(H1);getchar();getchar();break; case 2:initlist1(H2);getchar();getchar();break; case 3:int num1,pos1,e; printf(请输入要操作顺序表的序号,插入元素,插入位置:); scanf(%d%d%d,&num1,&e,&pos1); switch(num1) case 1:if(Listinsert1(H1,pos1,e) printf(插入成功!); getchar();get

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

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