数据结构作业二解答文档格式.docx
- 文档编号:18354627
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:9
- 大小:33.45KB
数据结构作业二解答文档格式.docx
《数据结构作业二解答文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构作业二解答文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
6.在稀疏矩阵的十字链接存储中,每个结点的down指针域指向列号相同的
下一个结点,right指针域指向行号相同的下一个结点。
7•—个广义表中的元素分为单元素和表元素两类。
&
一个广义表的深度等于括号嵌套的最大层数。
9•在广义表的存储结构中,每个结点均包含有3个域。
10.在广义表的存储结构中,单元素结点与表元素结点有一个域对应不同,各自分别为
值域和表头指针域。
,next
11•若把整个广义表也看为一个表结点,则该结点的tag域的值为1
域的值为NULL或0。
三、应用题
1.已知一个稀疏矩阵如图所示:
(1)写出它的三元组线性表;
解:
((1,2,4),(2,4,-3),(2,7,1),(3,1,8),(4,4,5),(5,,2,-7),(5,6,2),(6,4,6))
(2)给出它的顺序存储表示;
解:
7
5
6
2
8
4
9
MaxTerms
rowcolval
(3)给出它的转置矩阵的三元组线性表和顺序存储表示;
((1,3,8),(2,1,4),(2,5,-7),(4,2,-3),(4,4,5),(4,6,6),(6,5,2),(7,2,1))
2.画出下列每个广义表的带表头附加结点的链接存储结构图并分别计算出它们的长度和深度。
(1)A=(())
(2)B=(a,b,c)
⑶C=(a,(b,(c)))
⑷D=((a,b),(c,d))
⑸E=(a,(b,(c,d)),(e))
⑹F=((a,(b,(),c),((d),e)))
每小题的长度和深度如下表示。
题号
1
3
长度
深度
第四章栈和队列
1、设用第二章定义的类型为ALinkList的一维数组MS[MaxSize]建立三个链接堆栈,其中
前三个元素的next域用来存储三个栈顶指针,从下标为3的元素起作为空闲元素提供给三
个栈共同使用,试编写一个算法把从键盘上输入的n个整数按照下列条件分别进入不同的
栈:
(2)若输入的整数
x大于等于60同时小于等于
100,则进第二个栈;
(3)若输入的整数
x大于100,则进第三个栈。
voidMoreStack(ALinkListMS,intn)
//把从键盘上输入的n个整数按不同条件分别进入到三个不同的链接栈中{
if(n>
MaxSize-3){
cerr<
<
"
存储空间不足!
;
exit
(1);
}
inti,x,av;
for(i=0;
i<
3;
i++)
MS[i].next=0//置空栈,即给三个栈顶指针赋0
av=3;
//av指向可利用元素的下标,赋初值为3
cout<
输入"
n<
个整数:
"
end1;
n;
i++){
//从键盘读入一个整数并把它赋给av元素的值域cin>
>
x;
MS[av].data=x;
//按条件把av元素压入不同的栈,即链接到相应栈的栈顶if(x<
60){
Ms[av].next=MS[0].next;
MS[0].next=av;
elseif(x>
=60&
x<
=100){
MS[av].next=MS[1].next;
MS[1].next=av;
else{
MS[av].next=MS[2].next;
MS[2].next=av;
//使av指向下一个可利用元素av++;
2、编写一个程序,首先调用上题算法,然后分别打印出每个栈中的内容。
解:
#include<
iostream.h>
stdlib.h>
constintMaxSize=50;
//要至少定义为比输入的整数个数大3
typedefintElemType;
structALNode{
ElemTypedata;
intnext;
};
typedefALNodeALinkList[MaxSize];
{//函数体在此省略
voidmain()
ALinkLista;
intn;
从键盘输入的整数个数(1〜47):
cin>
MoreStack(a,n);
for(inti=0;
{//依次将每个栈中的元素全部出栈并打印出来intj=a[i].next;
while(j!
=0){
a[j].data<
j=a[j].next;
一次输入和运行结果如下:
从键盘上输入的整数个数为(1〜47):
12
输入12个整数:
386497120783345214882514360
25453338
6088789764
143214120
3、已知一个中缀算术表达式为:
3+4/(25-(6+15))*8@
(1)写出对应的后缀算术表达式;
3425615+-/8*+@
(2)画出在转换成后缀表达式的过程中运算符栈的变化。
略
4、已知一个后缀算术表达式为:
248+3*4107-*/@
(1)写出对应的中缀算术表达式;
(24+8)*3/(4*(10-7))
(2)画出在进行后缀算术表达式求值的过程中数值栈的变化。
5、编写把十进制正整数转换为十六进制数输出的算法。
voidTransform(longnum)
//把一个正整数num转为一个十六进制数输出
{
Stacka;
InitStack(a);
while(num!
=0){intk=num%16;
Push(a,k);
num/=16;
while(!
StackEmpty(a))
intX=Pop(a);
if(x<
10)
switch(x)
case10:
'
A'
break;
case11:
B'
case12:
C'
case13:
D'
case14:
E'
case15:
F'
425转换为
6、编写把十进制正整数转换为S进制(2<
SW)数输出的递归算法,然后若把
六进制数,画出每次递归调用前和返回后系统栈的状态。
只给出递归算法,画图从略。
voidTransform(longnum,ints)
//把十进制正整数转换为S进制数的递归算法
intk;
if(num!
k=num%S;
Transfrom(num/S,S);
k;
7、裴波那契(Fibonacci)数列的定义为:
它的第1项和第2项均为1,以后各项为其前两项之和。
若裴波那契数列中的第n项用Fib(n)表示,则计算公式为:
试编写出计算Fib(n)的递归算法和非递归算法,并分析它们的时间复杂度和空间复杂度。
1)递归算法为:
longFib(intn)
if(n==1||n==2)//终止递归条件
return1;
else
returnFib(n-1)+Fib(n-2);
2)非递归算法为
longFib1(intn)
inta,b,c;
〃c代表当前项,a和b分别代表当前项前面的第2项和第1项
a=b=1;
//给a和b赋初值1
if(n==1||n==2)
for(inti=3;
=n;
c=a+b;
//求出当前项
a=b;
〃把前面第1项赋给前面第2项
returnc;
//返回所求的第n项
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 作业 解答
![提示](https://static.bdocx.com/images/bang_tan.gif)