数据结构形成性考核作业2讲评

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构形成性考核作业2讲评

第二次作业

第三章稀疏矩阵和广义表

一、单选题

1. 在稀疏矩阵的带行指针向量的链接存储中,每个行单链表中的结点都具有相同的________。A

A 行号

B 列号

C 元素值

D 地址

2. 设一个具有t个非零元素的m*n大小的稀疏矩阵采用顺序存储,求其转置矩阵的普通转置算法的时间复杂度为________。D

A O(m)

B O(n)

C O(n+t)

D O(n*t)

3. 设一个广义表中结点的个数为n,则求广义表深度算法的时间复杂度为_______。B

A O(1)

B O(n)

C O(n2)

D O(log2n)

二、填空题

1. 在一个稀疏矩阵中,每个非零元素所对应的三元组包括该元素的________、________和________三项。行号列号元素值

2. 在稀疏矩阵所对应的三元组线性表中,每个三元组元素按________为主序、________为辅序的次序排列。行号列号

3. 在初始化一个稀疏矩阵的函数定义中,矩阵形参应说明为________参数。引用

4. 在稀疏矩阵的顺序存储中,利用一个数组来存储非零元素,该数组的长度应________对应三元组线性表的长度。大于等于

5.在稀疏矩阵的带行指针向量的链接存储中,每个结点包含有________个域,在相应的十字链接存储中,每个结点包含有________个域。4 5

6.在稀疏矩阵的十字链接存储中,每个结点的down指针域指向________相同的下一个结点,right指针域指向________相同的下一个结点。行号列号

7.一个广义表中的元素分为________元素和________元素两类。单表

8.一个广义表的深度等于________嵌套的最大层数。括号

9.在广义表的存储结构中,每个结点均包含有________个域。3

10.在广义表的存储结构中,单元素结点与表元素结点有一个域对应不同,各自分别为________域和________域。值子表指针

11.若把整个广义表也看为一个表结点,则该结点的tag域的值为________,next域的值为________。true或1 NULL或0

三、应用题

1.

已知一个稀疏矩阵如图3-11所示:

0 4 0 0 0 0 0 0 0 0 -3 0 0 1 8 0 0 0 0 0 0 0 0 0 5 0 0 0 0 -7 0 0 0 2 0 0 0 0 6 0 0 0

图3-11 具有6行×7列的一个稀疏矩阵

(1)写出它的三元组线性表;

(2)给出它的顺序存储表示; (3) 给出它的转置矩阵的三元组线性表和顺序存储表示;

解:

(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) 答案从略

(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)

(3) C=(a,(b,(c)))

(4) D=((a,b),(c,d))

(5) E=(a,(b,(c,d)),(e))

(6) F=((a,(b,(),c),((d),e)))

解:

第四章栈和队列

一、设用第二章定义的类型为ALinkList的一维数组MS[MaxSize]建立三个链接堆栈,其中前三个元素的next域用来存储三个栈顶指针,从下标为3的元素起作为空闲元素提供给三个栈共同使用,试编写一个算法把从键盘上输入的n个整数按照下列条件分别进入不同的栈:

(1) 若输入的整数x小于60,则进第一个栈;

(2) 若输入的整数x大于等于60同时小于等于100,则进第二个栈;

(3) 若输入的整数x大于100,则进第三个栈。

解:

void MoreStack(ALinkList MS, int n)

//把从键盘上输入的n个整数按不同条件分别进入

{ //到三个不同的链接栈中

if(n>MaxSize-3) {

cerr<<"存储空间不足!";

exit(1);

}

int i,x,av;

for(i=0; i<3; i++)

MS[i].next=0; //置空栈,即给三个栈顶指针赋0

av=3; //av指向可利用元素的下标,赋初值为3

cout<<"输入"<

for(i=0; i

//从键盘读入一个整数并把它赋给av元素的值域

cin>>x;

MS[av].data=x;

//按条件把av元素压入不同的栈,即链接到相应栈的栈顶 if(x<60) {

MS[av].next=MS[0].next;

MS[0].next=av;

}

else if(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

#include

const int MaxSize=50; //要至少定义为比输入的整数个数大3

typedef int ElemType;

struct ALNode {

ElemType data;

int next;

};

typedef ALNode ALinkList[MaxSize];

void MoreStack(ALinkList MS, int n)

{ //函数体在此省略

}

void main()

{

ALinkList a;

int n;

cout<<"从键盘上输入的整数个数(1-47):";

cin>>n;

MoreStack(a,n);

for(int i=0; i<3; i++)

{ //依次将每个栈中的元素全部出栈并打印出来

int j=a[i].next;

while(j!=0) {

cout<

j=a[j].next;

}

cout<

}

}

3. 已知一个中缀算术表达式为:

3+4/(25-(6+15))*8@

(1) 写出对应的后缀算术表达式;

(2) 画出在转换成后缀表达式的过程中运算符栈的变化。解:

(1) 对应的后缀算术表达式为

3 4 25 6 15 + - / 8 * + @

(2) 答案从略

4. 已知一个后缀算术表达式为:

24 8 + 3 * 4 10 7 - * / @

(1) 写出对应的中缀算术表达式;

(2) 画出在进行后缀算术表达式求值的过程中数值栈的变化。解:

(1) 对应的中缀算术表达式为

(24+8)*3/(4*(10-7))

(2) 答案从略

5. 编写把十进制正整数转换为十六进制数输出的算法。

解:

void Transform(long num)

//把一个正整数num转换为一个十六进制数输出 {

Stack a;

InitStack(a);

while(num!=0) {

int k=num % 16;

Push(a,k);

num/=16;

}

while(!StackEmpty(a))

{

int x=Pop(a);

if(x<10)

cout<

else {

switch (x)

相关文档
最新文档