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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构C语言版习题解答.docx

1、数据结构C语言版习题解答1.3 设n是正整数。试写出下列程序段中用记号“”标注的语句的频度: (2) i=1; k=0; do k+=10*i; i+; while(i=2时,执行n-1次;(3) i=1; k=0; do k+ = 10*i; i+; while(i=n);当n=2时,执行2次;当n!=2时,执行1次;(4) i=1; j=0; while(i+jn) if(i=(y+1)*(y+1) y+; 执行向下取整)(6) x=91; y=100; while ( y0 ) if(x100) x-=10; y-; else x+ ; If语句执行100次(7) for( i=0; i

2、n; i+) for( j=i; jn; j+) for( k=j; kx&i=0;i-)La.elemi+1=La.elemi;La.elemi+1=x;La.length+;return OK;/Insert_SqList2.5 试写一个算法,实现顺序表的就地逆置,即在原表的存储空间将线性表(a1,a2, ., an-1,an)逆置为(an,an-1, ., a2,a1)/思路就是两个指示变量i,j同时分别从顺序表的开始和结尾处相向改变void reverse(SqList &A)/顺序表的就地逆置ElemType p;for(i=1,j=A.length;ij;i+,j-) /A.ele

3、miA.elemj; p=A.elemi; A.elemi=A.elemj; A.elemj=p; /reverse2.7 已知线性表L采用顺序存储结构存放,对两种不同情况分别写出算法,删除L中多余的元素,使得L中没有重复元素:(1)L中数据元素无序排列;(2)L中数据元素非递减有序排列。void Delete_SameElem(SqLink &L, int L.length) /内层循环移动参数,中层循环寻找相同元,外层循环遍历整个表 int i=0; int j=i+1; int length=L.length; while(ilength) for(j=i+1;jlength; j+)

4、if(L.Elemj=L.Elemi)/ for(k=j; kL.Elemi) break;/第二小问添加此句 /end for /end while/end functoion2.8 已知线性表L采用链式结构存放。对两种不同情况分别写出算法,删除L中值相同的多余元素,使得L中没有重复元素:(1)L中数据元素无序排列;(2)L中数据元素非递减有序排列。(1)L中数据元素无序排列;思路:由于是无序排列,需要线性表中每个元素都要相互进行比较。Status ListDelete(Linklist &L)/L是带头结点的线性表 ElemType *p,*q; p=L-next;q=p-next; /设

5、定p变化较慢,q变化较快while(p-next) while(q) if(p-data!=q-data) q=q-next;else q=q-next; p-next=q; /else/whilep=p-next;q=p-next;/开始后一结点的寻找return OK;/ListDelete(2)L中数据元素非递减有序排列。思路:由于是有序的,遍历一次线性表就行了Status ListDelete (LinkList &L) ElemType *p,*q; p=L-next;q=p-next; while(p-next) if (p-data!=q-data) p=p-next; /和第一

6、问不同地方 q=p-next; /if else while(p-data=q-data) q=q-next;/多个连续的重复值 /else p-next=q;p=q;q=p-next;/删除值重复的结点,并修改相应的指针return OK;/ListDelete2.9 设有两个非递减有序的单链表A,B。请写出算法,将A和B就地归并成一个按元素值非递增有序的单链表。/ 将合并逆置后的结果放在C表中,并删除B表Status ListMergeOppose_L(LinkList &A,LinkList &B,LinkList &C) LinkList pa,pb,qa,qb; pa=A; pb=B

7、; qa=pa; / 保存pa的前驱指针 qb=pb; / 保存pb的前驱指针 pa=pa-next; pb=pb-next; A-next=NULL; C=A; while(pa&pb) if(pa-datadata) qa=pa; pa=pa-next; qa-next=A-next; /将当前最小结点插入A表表头 A-next=qa; else qb=pb; pb=pb-next; qb-next=A-next; /将当前最小结点插入A表表头 A-next=qb; while(pa) qa=pa; pa=pa-next; qa-next=A-next; A-next=qa; while(

8、pb) qb=pb; pb=pb-next; qb-next=A-next; A-next=qb; pb=B; free(pb); return OK;2.13 设以带头结点的双向循环链表表示的线性表L=(a1,a2,a3,.,an)。试写一时间复杂度为O(n)的算法,将L改造为L=(a1,a3,.,an,.,a4,a2)。void Reform(DuLinkedList &L)/按1,3,5,.4,2 的顺序重排双向循环链表L 中的所有结点p=L.next;while(p-next!=L&p-next-next!=L)p-next=p-next-next;p=p-next; /p指向最后一个

9、奇数结点if(p-next=L) /结点个数是奇数,使最后一个奇数结点next指向最后一个偶数结点 p-next=L-pre-pre;else/结点个数是偶数,使最后一个奇数结点next指向最后一个偶数结点 p-next=L-pre;p=p-next; /此时p 指向最后一个偶数结点while(p-pre-pre!=L) p-next=p-pre-pre; p=p-next;p-next=L;/最后一个结点next指向头结点 /调整了next 链的结构,此时pre 链仍为原状/调整pre 链的结构for(p=L;p-next!=L;p=p-next) p-next-pre=p;L-pre=p;

10、 /头结点的pre指向a2结点/Reform第三章 栈和队列3.6 试写一个算法,识别依次读入的一个以为结束符的字符序列是否为形如“序列1&序列2”模式的字符序列。其中,序列1和序列2中都不包含字符&,且序列2是序列1的逆序。例如,“a+b&b+a”是属于该模式的字符序列,而“13&31”则不是。算法:int SeqReverse()/判断输入的字符串中&前和&后部分是否为逆串,是则返回1,否则返回0InitStack(s);while(e=getchar()!=&)if(e=) return 0;/不允许在&之前出现push(s,e);/序列1输入完毕while( (e=getchar()!

11、=)if(StackEmpty(s) return 0;pop(s,c);if(e!=c) return 0;if(!StackEmpty(s) return 0;/序列1元素还有剩余return 1;/IsReverse3.7 假设一个算术表达式中可以包含三种符号:圆括号“(”和“)”、方括号“”和“”、花括号“”和“”,且这三种括号可按任意次序嵌套使用。编写判别给定表达式中所含的括号是否正确配对的算法(已知表达式已存入数据元素为字符的顺序表中)。算法:Status BracketTest(char *str)/判别表达式中三种括号是否匹配InitStack(s);for(p=str;*p;

12、p+)if(*p=( | *p= | *p= ) push(s,*p);else if(*p= ) | *p= | *p= ) if(StackEmpty(s) return ERROR;pop(s,c);if(*p=)&c!=() return ERROR;if(*p=&c!=) return ERROR;if(*p=&c!=) return ERROR; /必须与当前栈顶括号匹配/if/forif(!StackEmpty(s) return ERROR;/进栈的符号还有剩余,Errorreturn OK;/BracketTest3.8 设表达式由单字母变量、双目运算符和圆括号组成(如:“(

13、a*(b+c)-d)/e)”。试写一个算法,将一个书写正确的表达式转换为逆波兰式。思路:1.遇到数字直接发送 2.遇到(直接入栈 3.遇到)则将栈内元素发送直至遇到( 4.栈空则直接入栈 5.栈非空时若优先级大于栈内则入栈,否则栈内元素出栈int RankOfOperator(char c) switch(c) case #: return -1; case (: return 0; case +: case -: return 1; case *: case /: case ):return 2; int Precede(char c, char ch) return RankOfOpera

14、tor(c)RankOfOperator(ch);void ExpressionTOPolandStyle(char suffix,char *exp) Stack s; InitStack(s,100); int i=0; char c; while(*exp) if(isdigital(*exp) suffixi+=*exp; else switch(*exp) case (: push(s,(); case ): while(c=pops(s)!=() suffixi+=c; break; default: if(IsEmpty(s) push(s,*exp); else suffixi

15、+=pop(s); exp-; /与后面的exp+相抵消,使得栈内优先级大于等于栈外的都出栈 /end switch /end else exp+; /end while while(!IsEmpty(s) suffixi+=pop(s); suffixi=0;3.10 假设以带头结点的单循环链表表示队列,只设一个尾指针指向队尾元素,不设头指针。试编写相应的队列初始化、入队和出队算法(在出队算法中要传回队头元素的值)要点:定义好数据类型,带头结点的单循环链表,只有尾指针,注意删除元素时只有一个元素的特殊性typedef int DataTypestruct Node DataType data

16、; Node * next;struct CycleListQueue Node * tail;void InitCycleListQueue(CycleListQueue&L) L.tail = new Node; L.tail-next = L.tail;void EnterQueue(CycleListQueue&L,DataType value) Node* p = new Node; p-data = value; p-next = L.tail-next; L.tail-next = p; L.tail = p;void DeparQueue(CycleListQueue&L,Da

17、taType &d) if(L.tail-next != L.tail-next-next) Node *p = L.tail-next-next; L.tail-next-next = p-next; d = p-data; if(p=L.tail) L.tail=p-next; delete p; return d; 3.11 假设将循环队列定义为:以rear和length分别指示队尾元素和队列长度。试给出此循环队列的队满条件,并写出相应的入队和出队算法(在出队算法中要传递回队头元素的值)。此循环队列的队满条件:Q.length=MAXQSIZE;入队算法:Status EnCyQueue

18、(CyQueue &Q,int x)/带length 域的循环队列入队算法if(Q.length=MAXSIZE) return OVERFLOW;Q.rear=(Q.rear+1)%MAXSIZE; Q.baseQ.rear=x; /rear指向队尾元素Q.length+;return OK;/EnCyQueue出队算法:Status DeCyQueue(CyQueue &Q,int &x)/带length 域的循环队列出队算法,用x返回队头元素的值if(Q.length=0) return Error;/空队列,错误head=(Q.rear-Q.length+1)%MAXSIZE; /he

19、ad指向队头x=Q.basehead;Q.length-;return OK;/DeCyQueue3.12 试写一个算法:判别读入的一个以为结束符的字符序列是否是“回文”(所谓“回文”是指正读和反读都相同的字符序列,如“xxyzyxx”是回文,而“abcab”则不是回文)。Status Test()/判别输入的字符串是否回文序列,是则返回1,否则返回0 InitStack(S); InitQueue(Q); while(c=getchar()!=) Push(S,c); EnQueue(Q,c); /同时使用栈和队列两种结构 while(!StackEmpty(S) Pop(S,a); DeQ

20、ueue(Q,b); if(a!=b) return ERROR; return OK;/ Test第五章 多维数组5.4 设有一个准对角矩阵按以下方式存于一维数组B4m中:0123456k4m-24m-1a11a12a21a22a33a34a43.aij.a2m-1,2ma2m,2m写出由一对下标(i,j)求k的转换公式。因为i行前有2(i-1)个元素。现考虑i行情况,当j是奇数,i行有1个元素,k=2(i-1)+1-1=2(i-1);否则i行有2个元素,k=2(i-1)+2-1=2i-1。故:k=或若i为奇数,k=2(i-1)+j-i=i+j-2;当i为偶数时,k=2i-(i-j)-1=i

21、+j-1k=5.5 已知稀疏矩阵A45如下:(1)用三元组表作为存储结构,绘出相应的三元组表示意图;(2)用十字链表作为存储结构,绘出相应的十字链表示意图。(1)三元组表:ijv121155212223246424457(2)十字链表第六章 数和二叉树6.5 已知一棵度为k的树中有n1个度为1的结点,n2个度为2的结点,.,nk个度为k的结点,问该树中有多少个叶子结点?设叶子结点有x个,则树的结点总数为n1+n2+nk+x;同时除了根结点外,每个结点都指向一个结点,所有从这个角度考虑树的结点总数为:n1+2?n2+k?nk+1;n1+n2+nk+x= n1+2?n2+k?nk+1,可得x=6.

22、8已知一棵树如图6-1所示,画出与该树对应的二叉树,并写出该树的先根遍历序列和后根遍历序列。先根遍历:ABCEIJFGKHD后根遍历:BIJEFKGHCDA对应的二叉树:6.9 将如图6-2所示的森林转化为对应的二叉树。树对应的二叉树 森林对应的二叉树:6.11已知某二叉树的中序序列为DCBGEAHFIJK,后序序列为DCEGBFHKJIA。请画出该二叉树。6.14 假设某个电文由(a,b,c,d,e,f,g,h)8个字母组成,每个字母在电文中出现的次数分别为(7,19,2,6,32,3,21,10),试解答下列问题: (1) 画出出huffman树; (2) 写出每个字母的huffman编码

23、; a:1010 b:00 c:10000 d:1001 e:11 f:10001 g:01 h:1011 (3) 在对该电文进行最优二进制编码处理后,电文的二进制位数。 4*7+2*19+5*2+4*6+2*32+5*3+2*21+4*10=2616.17 写出按层次遍历二叉树的算法。思路:用队列存储结构,并用递归方法Status LevelOrderTraverse(BitTree T,Status (*Visit)(TElemType e)/层序遍历二叉树InitQueue(Q); /初始化队列if(!T) return Error;/空树,直接返回EnQueue(Q,T);/根结点入队

24、BiTNode *p;while(!QueueEmpty(Q)DeQueue(Q,p);Visit(p-data);if(p-lchild) EnQueue(Q,p-lchild);if(p-rchild) EnQueue(Q,p-rchild);/whilereturn Ok;/LevelOrderTraverse6.19 写出判断两棵给定二叉树是否相似的算法。(注:两棵二叉树B1和B2相似是指:B1和B2皆空,或者皆不空且B1的左、右子树和B2的左、右子树分别相似。)思路:采用递归进行比较判断bool BiTreeSimilar (BiTree T1,BiTree T2) if(T1=Nu

25、ll&T2=Null) return 1;else if(T1=Null | T2=Null) return 0; else return (BiTreeSilimar(T1-lchild,T2-lchild)&BiTreeSimilar(T1-rchild,T2-rchild);6.21 写出统计树中叶子结点个数的算法,树用孩子兄弟链表表示。思路:在孩子兄弟链表中,若结点的firstchild为Null,则为叶子结点;采用递归方法。 int CountLeaves(Tree T,int &num)/num传递的初值为0 if(T-nextsibling!=Null) num+=CountLe

26、aves (T-nextsibling); if(T-firstchild!=Null) num+=CountLeaves(T- firstchild); else num+=1;/firstchild域为空,则为叶子结点return num;第七章 图7.1 已知有向图如图7-1所示,请给出该图的 (1)邻接矩阵示意图 (2)邻接表示意图 (3)逆邻接表 (4)所有强连通分量(1) 邻接矩阵(2)邻接表(3)逆邻接表 (4)强连通分量7.2 已知图G的邻接矩阵如图7-2所示。写出该图从顶点1出发的深度优先搜索序列和广度优先搜索序列,并画出相应的深度优先生成树和广度优先生成树。12345678910100000

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

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