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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构习题答案文档格式.docx

1、1/6*n*(n+1)*( n+2)(6) i=1;j=0;While (i+jj) j+; else i+;n(7) x= n; y= o;while (x=(y+1) * (y + 1) y +; n (8) x= 91; y= 100;while (y0) if (x100)x-=10; y - -; else x + ;11001.2.3 综合题20、void print_descending(int x,int y,int z)/按从大到小顺序输出三个数 scanf(%d,%d,%d,&x,&y,&z); if(xy) xy; /为表示交换的双目运算符,以下同 if(yz) yarr

2、size 或对某个k(1kn)使 k!. 2k maxint 时,应按出错处理,注意选择你认为较好的出错处理方法。解:Status algo119(int aARRSIZE)/求i!*2i序列的值且不超过maxintlast=1;for(i=1;=ARRSIZE;i+) ai-1=last*2*i; if(ai-1/last)!=(2*i) reurn OVERFLOW; last=ai-1; return OK;/algo119分析:当某一项的结果超过了maxint时,它除以前面一项的商会发生异常.第二章 线性表作业:2.2.2 综合题3、编写一个函数将一个向量 A(有 n 个元素且任何元素

3、均不为 0)分拆成两个向量,使 A 中大于 0 的元素存放在 B 中,小于 0 的元素存放在 C 中。本题的算法思想是:依次遍历 A 的元素,比较当前的元素值,大于 0 者赋给 B(假设有 p 个元素),小于 0 者赋给 C(假设有 q 个元素)。实现本题功能的函数如下: void ret(vector A,int n,vector B,int *p,vector C,int *q) int i; *p=0;*q=0; for (i=0;=n-1;i+) if (Ai0) (*p)+; B*p=Ai;if (Ai (*q)+; C*q=Ai;2.2.2 综合题5、编写一个函数从一给定的向量 A

4、 中删除元素值在 x 到 y(xy)之间的所有元素,要求以较高的效率来实现。从 0 开始扫描向量 A,以 k 记录下元素值在 x 到 y 之间的元素个数,对于不满足该条件的元素,前移 k 个位置。 最后返回向量的新长度,这种算法比每删除一个元素后立即移动其后元素效率要高一些。实现本题功能的过程如下: int del(A,n,x,y) vector A;int n;ElemType x,y; int i=0,k=0; while (in)=x & Ai=y) k+; else Ai-k = Ai; /* 前移 k 个位置 */ i+; return(n-k);2.2.2 综合题8、有两个向量 A

5、(有 m 个元素)和 B(有 n 个元素),其元素均以从小到大的升序排列,编写一个函数将它们合并成一个向量 C,要求 C 的元素也是以从小到大的升序排列。依次扫描通过 A 和 B 的元素,比较当前的元素的值,将较小值的元素赋给 C,如此直到一个向量扫描完毕,然后将未完的一个向量的余下所有元素赋给 C 即可。 int link(vector a,int m,vector b,int n,vector c) int i=0,j=0,l,k=0; while(im & jn) /* 扫描通过 a 和 b,将当前较小者赋给 c */ if(aibj) ck+=bj+; else /* 相等者只保存一个

6、 */ ck+=bj+; if(i=m) /* b 未完时,当余下的元素赋给 c*/ for(l=j;ldata=x) n+;p=p-next; return(n);2.2.2 综合题11、有一个单链表 L(至少有 1 个结点),其头结点指针为 head,编写一个函数将 L逆置,即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。本题采用的算法是:从头到尾扫描单链表 L,将第一个结点的 next 域置为 NULL,将第二个结点的 next 域指向第一个结点,将第三个结点的 next 域指向第二个结点,如此等等,直到最后一个结点,便用 head 指向它,这样达到了本题的要求

7、。void invert(head) node *p,*q,*r;q=p-while (q!=NULL) /*当 L 没有后续结点时终止*/ r=q-q-next=p;p=q;q=r; head-next=NULL;head=p; /*p 指向 L 的最后一个结点,现改为头结点*/ 2.2.2 综合题16、有一个有序单链表(从小到大排列),表头指针为 head,编写一个函数向该单链表中插入一个元素为 x 的结点,使插入后该链表仍然有序。本题算法的思想是先建立一个待插入的结点,然后依次与链表中的各结点的数据域比较大小,找到插入该结点的位置,最后插入该结点。 node *insertorder(h

8、ead,x) node *head; ElemType x;node *s,*p,*q;s=(node *)malloc(sizeof(node); /*建立一个待插入的结点*/ s-data=x;if (head=NULL | xdata) /*若单链表为空或 x 小于第一个结点的 date 域*/ next=head; /*则把 s 结点插入到表头后面*/ head=s;else q=head; /*为 s 结点寻找插入位置,p 指向待比较的结点,q 指向 p 的前驱结点*/ p=q-=NULL & xp-data) /*若 x 小于 p 所指结点的 data 域值*/ if (xdata

9、) /*则退出 while 循环*/ q=p; /*将 s 结点插入到 q 和 p 之间*/ next=s;return(head);2.2.2 综合题23、假设在长度大于 1 的循环单链表中,既无头结点也无头指针,p 为指向该链表中某个结点的指针,编写一个函数删除该结点的前驱结点。本题利用循环单链表的特点,通过 p 指针可循环找到其前驱结点 q 及 q 的前驱结点 r,然后将其删除。node *del(p)node *q,*r; /*查找 p 结点的前驱结点,用 q 指针指向 */ while (q-next!=p) q=q-r=q; /*查找 q 结点的前驱结点,用 r 指针指向 */ w

10、hile (r-=q) r=r-r- /*删除 q 所指的结点 */ free(q);return(p);2.2.2 综合题41试写一算法在带头结点的单链表结构上的实现线性表操作LOCATE(L,X)。LNode* Locate(LinkList L,int x)/链表上的元素查找,返回指针for(p=l-p&data!=x;next);return p;/Locate第三章 栈和队列3.2.2 综合习题13、如果用一个循环数组 qu0,m0-1表示队列时,该队列只有一个头指针 front,不设队尾指针 rear,而改置计数器 count 用以记录队列中结点的个数。(1)编写实现队列的五个基本

11、运算;(2)队列中能容纳元素的最多个数还是 m0-1 吗? (1)依题意,有如下条件:队列为空:count=0,front=1 队列为满:count=m0 队列尾的第一个元素位置=(front+count) % m0 队列首的第一个元素位置=(front+1) % m0 队列类型定义如下:typedef int qum0;由此得到如下对应上述基本运算的 5 个函数如下: /* m0 定义为全局变量 */ void makenull(front,count) /*使队列 q 为空*/ int front,count; front=1; count=0; int empty(count) /*判定

12、队列 q 是否为空*/ int count; if (count=0) return(1); else return(0);void pop(q,front,count,x) /*取队列头元素给 x*/ qu q;ElemType *x;if (count=0) printf(队列下溢出n); front=(front+1) % m0; *x=qfront;void enqueue(q,x,front,count) /*将元素 x 入队列*/ int place;if (count=m0) printf(队列上溢出n count+; e=(front+count) % m0; qplace=x

13、; void dequeue(q,front,count) /*删除队列头元素*/ count-;(2)队列中可容纳的最多元素个数为 m0 个。3.2.2 综合习题31假设称正读和反读都相同的字符序列为“回文”,例如,abba和abcba是回文,bcde和ababa则不是回文,试写一个算法判别读入的一个以为结束符的字符序列是否是“回文”。int Palindrome_Test()/判别输入的字符串是否回文序列,是则返回1,否则返回0InitStack(S);InitQueue(Q);while(c=getchar()!=)Push(S,c);EnQueue(Q,c); /同时使用栈和队列两种结

14、构while(!StackEmpty(S)Pop(S,a);DeQueue(Q,b);if(a!=b) return ERROR;return OK;/Palindrome_Test第三章 串4.2.3 综合习题 2、若 x 和 y 是两个采用顺序结构存储的串,编写一个比较两个串是否相等的函数。两个串相等表示对应的字符必须都相同,所以扫描两串,逐一比较相应位置的字符,若相同继续比较直到全部比较完毕,如果都相同则表示两串相等,否则表示两串不相等,由此得到如下函数: int same(x,y) orderstring *x,*y;int i=0,tag=1;if (x-len!=y-len) re

15、turn(0);while (ilen & tag) veci!veci) tag=0;i+;return(tag);4.2.3 综合习题4、采用顺序结构存储串 s,编写一个函数删除 s 中第 i 个字符开始的 j 个字符。先判定 s 串中要删除的内容是否存在,若存在则将第 i+j-1 之后的字符前移 j 个位置。其函数如下:orderstring *delij(s,i,j) orderstring *s;int i,j;int h;if (i+jfor (h=i;hvech+j;len-=j;return(s);else printf(无法进行删除操作n);4.2.3 综合习题24、编写算法

16、,求串s所含不同字符的总数和每种字符的个数。typedef struct char ch; int num; mytype;void StrAnalyze(Stringtype S)/统计串S中字符的种类和个数mytype TMAXSIZE; /用结构数组T存储统计结果=S0;c=Si;while(Tj.ch&Tj.ch!=c) j+; /查找当前字符c是否已记录过if(Tj.ch) Tj.num+;else Tj=c,1;/forfor(j=0;Tj.ch;j+)printf(%c:%dn,Tj.ch,Tj.num);/StrAnalyze4.2.3 综合习题30试写一算法,在串的堆存储结构

17、上实现基本操作Concat(&T,s1.s2).void HString_Concat(HString s1,HString s2,HString &t)/将堆结构表示的串s1和s2连接为新串tif(t.ch) free(t.ch);t.ch=malloc(s1.length+s2.length)*sizeof(char);=s1.length;i+) t.chi-1=s1.chi-1;for(j=1;=s2.length;j+,i+) t.chi-1=s2.chj-1;t.length=s1.length+s2.length;/HString_Concat第五章 数组与广义表5.2.3 综合

18、习题9、假设稀疏矩阵 A 和 B(具有相同的大小 mn)都采用三元组表示,编写一个函数计算 C=A+B,要求 C 也采用三元组表示。本题采用的算法思想是:依次扫描 A 和 B 的行号和列号,若 A 的当前项的行号等于 B 的当前项的行号,则比较其列号,将较小列的项存入 C 中,如果列号也相等,则将对应的元素值相加后存入 C 中;若 A 的当前项的行号小于 B 的当前项的行号,则将 A 的项存入 C 中;若 A 的当前项的行号大于 B 的当前项的行号,则将 B 的项存入 C 中。这样产生了 C,因此,实现本题功能的函数如下:void matadd(A,B,C) smatrik A,B,C; int i=1,j=1,k=1;=A02 &=B02) /*若 A 的当前项的行号等于 B 的当前项的行号,则比较其列号,将较小列的项*/ /*存入 C 中,如果列号也相等,则将对应的元素值相加后存入 C 中*/if (Ai0=Bj0) if (Ai1Ck0=Bj0;Ck1=Bj1;Ck2=Bj2;j+;Ck2=Ai2+Bj2;if (Ck2!=0) k+;else if (Ai0A6,A6-A12,A12-A3,A3-A9,A9-A0.第二条链:A1-A7,A7-A13,A13-A4,A4-A10,A10-A1.第三条链:A2-A8,A8-A14,A14-A5,A5-A11,A11-

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

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