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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(西电电院软件技术基础上机大作业答案.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

西电电院软件技术基础上机大作业答案.docx

1、西电电院软件技术基础上机大作业答案说明 每个实验题目含有一个main函数和一些函数,与实验题目相关的基本运算的函数定义和main函数定义的代码在附录以及对应的文件夹中给出,供上机实验参考使用。对于每个题目,只需要根据题目要求设计算法,补充函数定义,然后对程序进行编译、调试。实验一 线性表一、实验目的1熟悉线性表的顺序和链式存储结构2掌握线性表的基本运算3能够利用线性表的基本运算完成线性表应用的运算二、实验内容1设有一个线性表E=e1, e2, , en-1, en,设计一个算法,将线性表逆置,即使元素排列次序颠倒过来,成为逆线性表E= en , en-1 , , e2 , e1 ,要求逆线性表

2、占用原线性表空间,并且用顺序表和单链表两种方法表示,分别用两个程序来完成。(文件夹:顺序表逆置、单链表逆置)思路1:对于顺序表,使用一个结构体,结构体中包含一个数组,来储存顺序表里的信息,同时还有一个表示位置的变量来储存该顺序表的当前位置,便于循环遍历,在交换的时候,其本质上只是使得该顺序表上的DATA实现逆序,在顺序表中等于对于数组的内容实现交换逆序。思路2:对于线性表,使用结构体,包含data,用来储存线性表里该节点的信息,同时还有一个nest指针用于指向下一个节点,在计算机内部根据地址指向实现一个链表结构,当实现该线性表逆序的时候,我们先对该线性表进行循环遍历得到该线性表中节点的个数,然

3、后从头开始遍历把线性表中每个节点的data都存储在一个数组里面,对于数组中的元素实现逆序交换,得到一个逆序后的数组然后循环遍历线性表对于线性表的每一个元素逐个重新赋值,实现线性表的逆置。2已知由不具有头结点的单链表表示的线性表中,含有三类字符的数据元素(字母、数字和其他字符),试编写算法构造三个以循环链表表示的线性表,使每个表中只含有同一类的字符,且利用原表中的结点空间,头结点可另辟空间。(文件夹:分解单链表)思路3:根据每个对应的字符的值进行判断,如果该字符的值在“a”-“z”或者在“A”-“Z”之间的话,那么就插入字符循环链表中,如果在“0”-“9”之间,就插入到数字循环链表中,如果都不是

4、,就插入到other循环链表中,对于单链表中的每一个节点逐个判断。实验二 栈和队列一、实验目的1熟悉栈和队列的顺序和链式存储结构2掌握栈和队列的基本运算3能够利用栈和队列的基本运算完成栈和队列应用的运算二、实验内容1设单链表中存放有n个字符,试编写算法,判断该字符串是否有中心对称的关系,例如xyzzyx是中心对称的字符串。(提示:将单链表中的一半字符先依次进栈,然后依次出栈与单链表中的另一半字符进行比较。)(文件夹:判字符串中心对称)思路4:设置一个栈结果,将单链表中的元素逐个添加到栈中,入栈操作,栈有先进后出的特点,因此栈底元素对应链表的第一个元素,栈顶元素对应链表的最后一个元素,刚好是链表

5、的逆置,不断的出栈得到当前的栈顶元素与链表对应的元素进行比较,如果有一俩个值不相等的话,那么就可以判断该字符串是否具有中心对称关系。2假设以数组sequm存放循环队列的元素,同时设变量rear和quelen 分别指示循环队列中队尾元素的位置和内含元素的个数。编写实现该循环队列的入队和出队操作的算法。提示:队空的条件:sq-quelen=0;队满的条件:sq-quelen=m。(文件夹:循环队列)思路5:队列的入操作是从尾部,出操作仕从头部,当入队列时,用数组存放循环队列的元素,需要判断当对尾越过数组上界时,需要变成数组的下界,当出队列时,从队列头部开始,根据队尾部和队列长度得到队列的头部,同时

6、考虑越过数组下界的问题,从而改变成数组的上界。实验三 串一、实验目的1熟悉串的顺序存储结构2掌握串的基本运算及应用二、实验内容1串采用顺序存储结构,编写朴素模式匹配算法,查找在串中是否存在给定的子串。(文件夹:模式匹配)思路6:朴素模式匹配对于字串和子串逐个字符进行匹配,在某一位置如果该字符与子串中的字符不相等时,那么进行回溯,子串到开始位置,字串到下一位置重新开始遍历,直到遍历结束,判断在该字串中是否存在给定的子串。2若S是一个采用顺序结构存储的串,利用C的库函数strlen和strcpy(或strncpy)编写一算法void SteDelete(char*S,int I,int m),要求

7、从S中删除从第i个字符开始的连续m个字符。若istrlen(S),则没有字符被删除;若i+mstrlen(S),则将S中从位置i开始直至末尾的字符均删除。(文件夹:删除子串)思路7:调用字符串函数在第i个字符删除,定义一个临时变量temp,先将S中的0至i-1字符全部复制到temp中,然后衔接i+m-1之后的字符串全部复制到temp中,最后将temp的值重新复制到S中。实验四 数组一、实验目的1熟悉数组的结构2掌握矩阵的压缩存储3能够对数组和矩阵的压缩存储进行运算二、实验内容1.若在矩阵Amn中存在一个元素Aij,其满足Aij是第i行元素中最小值,且又是第j列元素中最大值,则称此元素为该矩阵的

8、一个马鞍点。用二维数组存储矩阵Amn ,设计算法求出矩阵中所有马鞍点。(文件夹:找马鞍点)2.A和B是两个nn阶的对称矩阵,以行为主序输入对称矩阵的下三角元素,压缩存储存入一维数组A和B,编写一个算法计算对称矩阵A和B的乘积,结果存入二维数组C。(文件夹:对称矩阵相乘)实验五 树一、实验目的1熟悉二叉树的链式存储结构2掌握二叉树的建立、深度优先递归遍历等算法3能够利用遍历算法实现一些应用二、实验内容1已知二叉树采用二叉链表存储结构,如果左、右子树非空,且左子树根结点大于右子树根结点,则交换根结点的左、右子树。即按要求交换二叉树及子树的左、右子树。(文件夹:交换左右子树)2采用二叉链表结构存储一

9、棵二叉树,编写一个算法统计该二叉树中结点总数及叶子结点总数。(文件夹:统计二叉树结点)实验六 图一、实验目的1熟悉图的邻接矩阵和邻接表的存储结构2熟悉图的邻接矩阵和邻接表的建立算法3掌握图的遍历算法二、实验内容1 无向图采用邻接矩阵存储,编写深度优先搜索遍历算法,从不同的顶点出发对无向图进行遍历。(文件夹:无向图邻接矩阵)实验七 排序一、实验目的1熟悉各种内部排序算法2能够编写程序显示排序过程中各趟排序的结果3能够编写一些排序的算法二、实验内容1采用希尔排序方法对顺序表中的证型数据进行排序,设计希尔排序算法并显示每趟排序的结果。(文件夹:希尔排序)2编写一个双向起泡的排序算法,即在排序过程中交

10、替改变扫描方向,同时显示各趟排序的结果。(文件夹:双向起泡排序)实验八 查找一、实验目的1熟悉线性表、二叉排序树和散列表的查找2能够编写一些查找的算法二、实验内容118个记录的关键字为22、12、13、8、9、20、33、42、44、38、24、48、60、58、74、49、86、53,编写分块查找的算法进行查找。(文件夹:分块查找)2编写一个判别给定的二叉树是否为二叉排序树的算法,设二叉树以二叉链表存储表示,结点的数据域只存放正整数。(文件夹:判断二叉排序树)附录:原代码实验一:第1题(1)/顺序表逆置的程序代码#include#include/顺序表结构类型定义typedef char d

11、atatype;const int maxsize=1024;typedef struct datatype datamaxsize; int last;sequenlist;void create(sequenlist*&);void print(sequenlist*);void invert(sequenlist*);void main() sequenlist*L; create(L);/建立顺序表 print(L);/输出顺序表 invert(L);/调用顺序表逆值的函数 print(L);/输出顺序表/建立顺序表void create(sequenlist*&L) L=(seque

12、nlist*)malloc(sizeof(sequenlist); L-last=0; char ch; while(ch=getchar()!=*) L-last+; L-dataL-last=ch; /输出顺序表void print(sequenlist*L) for(int i=1;ilast;i+) printf(%2c,L-datai); printf(n);/顺序表逆置void invert(sequenlist*L) int n=L-last/2; for(int i=1;idatai; L-datai=L-dataL-last-i+1; L-dataL-last-i+1=tem

13、p; 实验一:第1题(2)/单链表逆置的程序代码#include#include/单链表结构类型定义typedef char datatype;typedef struct node datatype data; struct node *next;linklist;void create(linklist*&);void print(linklist *);void invert(linklist*);void main() linklist*head; create(head); print(head); invert(head);/调用单链表逆置的函数 print(head);/采用尾插

14、法建立具有头结点的单链表void create(linklist*&head) char ch; linklist *s,*r; head=(linklist*)malloc(sizeof(linklist); r=head; while(ch=getchar()!=*) s=(linklist*)malloc(sizeof(linklist); s-data=ch; r-next=s; r=s; r-next=NULL;/输出单链表void print(linklist *head) linklist*p=head-next; while(p!=NULL) printf(%2c,p-data

15、); p=p-next; printf(n);/单链表逆置void invert(linklist*head) linklist*p,*q,*r; p=head-next; q=p-next; while(q!=NULL) r=q-next; q-next=p; p=q; q=r; head-next-next=NULL; head-next=p;实验一:第2题/分解单链表的程序代码#include#include/链表结构类型定义typedef char datatype;typedef struct node datatype data; struct node *next;linklis

16、t;void create(linklist*&);void resolve(linklist*,linklist*,linklist*,linklist*);void insert(linklist*,linklist*);void print1(linklist*);void print2(linklist*);void main() linklist *head,*letter,*digit,*other; create(head); print1(head); letter=(linklist*)malloc(sizeof(linklist);/建立3个空循环链表 letter-nex

17、t=letter; digit=(linklist*)malloc(sizeof(linklist); digit-next=digit; other=(linklist*)malloc(sizeof(linklist); other-next=other; resolve(head,letter,digit,other);/调用分解单链表的函数 print2(letter);/输出循环链表 print2(digit); print2(other);/建立单链表void create(linklist*&head) datatype x; linklist *s,*r; head=new li

18、nklist; r=head; while(x=getchar()!=$) s=(linklist*)malloc(sizeof(linklist); s-data=x; r-next=s; r=s; r-next=NULL;/在循环链表中插入void insert(linklist*h,linklist*p) linklist *q=h; while(q-next!=h) q=q-next; q-next=p; p-next=h;/输出单链表void print1(linklist*head) linklist *p=head-next; while(p!=NULL) printf(%c,p

19、-data); p=p-next; printf(n);/输出循环链表void print2(linklist*head) linklist *p=head-next; while(p!=head) printf(%c,p-data); p=p-next; printf(n);/按字母、数字、其它字符分解单链表void resolve(linklist*head,linklist*letter,linklist*digit,linklist*other) linklist *p; while(head-next!=NULL) p=head-next; head-next=head-next-n

20、ext; if(p-data=A&p-datadata=a&p-datadata=0&p-datanext; while(p!=NULL) if(p-data=a&p-datadata=A&p-datadata=0&p-datanext; 实验二:第1题/判字符串中心对称的程序代码#include#include#include/定义单链表结构类型typedef char datatype;typedef struct node datatype data; struct node *next;linklist;/定义顺序栈结构类型const int maxsize=40;typedef st

21、ruct datatype elementsmaxsize; int top;stack;void setnull(stack *&);int length(linklist*);void printlink(linklist*);void create(linklist *&,datatype*);void push(stack*,datatype);datatype pop(stack*);int symmetry(linklist*,stack*);/判字符串是否中心对称的函数声明void main() linklist *head;stack *s; datatype str80; g

22、ets(str); create(head,str); printlink(head); setnull(s); if(symmetry(head,s) printf(字符串%s中心对称n,str); else printf(字符串%s不是中心对称n,str);/栈初始化void setnull(stack *&s) s=(stack*)malloc(sizeof(stack); s-top=-1;/求单链表长度int length(linklist*head) linklist *p=head-next; int n=0; while(p!=NULL) n+; p=p-next; retur

23、n n;/输出单链表void printlink(linklist*head) linklist *p=head-next; while(p!=NULL) printf(%c,p-data); p=p-next; printf(n);/建立具有头结点的单链表void create(linklist *&head,datatype*str) datatype *p=str; linklist *s,*r; head=(linklist*)malloc(sizeof(linklist); r=head; while(*p!=0) s=(linklist*)malloc(sizeof(linklis

24、t); s-data=*p; r-next=s; r=s; p+; r-next=NULL;/顺序栈入栈void push(stack*s,datatype e) s-top+; s-elementss-top=e;/顺序栈出栈datatype pop(stack*s) datatype temp; s-top-; temp=s-elementss-top+1; return temp;/判字符串是否中心对称int symmetry(linklist*head,stack*s) int n=length(head)/2; linklist*p=head-next; datatype x; fo

25、r(int i=0;idata); p=p-next; if(length(head)%2=1) p=p-next; while(p!=NULL) x=pop(s); if(x=p-data) p=p-next; else return 0; return 1;实验二:第2题/循环队列入队出队的程序代码#include#include#include/循环队列的结构类型定义const int m=5;typedef int datatype;typedef struct datatype sequm; int rear, quelen;qu;void setnull(qu*);void enq

26、ueue(qu*, datatype);datatype *dequeue(qu*);void main() qu *sq; datatype x, *p; int key; sq=(qu*)malloc(sizeof(qu); setnull(sq); do printf(1.Enter Queue 2.Delete Queue -1.Quit:); scanf(%d,&key); switch(key) case 1: printf(Enter the Data:); scanf(%d,&x); enqueue(sq,x); break; case 2: p=dequeue(sq); if

27、(p!=NULL) printf(%dn,*p); break; case -1: exit(0); while(1);/置空队void setnull(qu *sq) sq-rear=m-1; sq-quelen=0;/入队void enqueue(qu *sq, datatype x) if(sq-quelen=m) printf(queue is fulln); else sq-quelen+; sq-rear=(sq-rear+1)%m; sq-sequsq-rear=x; /出队datatype *dequeue(qu *sq) datatype *temp; if(sq-quelen=0) printf(queue is emptyn); return NULL; else temp=(datatype*)malloc(s

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

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