浙大远程数据结构与算法离线答案-最完整版

更新时间:2024-06-30 13:57:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

浙江大学远程教育学院 《数据结构与算法》课程离线作业

一、填空题:(【序号,章,节】。。。。。。)

【1,1,2】线性结构中元素之间存在一对一关系,树形结构中元素之间存在 一对多 关系,图形结构中元素之间存在 多对多 关系。

【2,1,2】为了最快地存取数据元素,物理结构宜采用 序存储 结构。 3,1,2】数据结构的三要素是 逻辑结构, 物理结构 , 操作 。 【3,1,2】存储结构可根据数据元素在机器中的位置是否一定连续分为顺序存储结构,链式存储结构。

【4,1,3】度量算法效率可通过 时间复杂度和空间复杂度__来进行。

【5,1,3】设n 为正整数,下面程序段中前置以记号@的语句的频度是 n(n+1)/2 。

for (i=0; i

@ a[i][j]=0; }

【6,1,3】设n 为正整数,试确定下列各程序段中前置以记号@的语句的频度: (1) i=1; k=0;

while (i<=n-1){ i++;

@ k+=10 * i; // 语句的频度是_____ n-1_______________。 } (2) k=0;

for (i=1; i<=n; i++){ for (j=i; j<=n; j++)

1

@ k++; // 语句的频度是_____ n(n+1)/2________________。 }

【7,3,2】线性表(a1,a2,…,an)有两种存储结构: 顺序存储结构和链式存储结构,请就这两种存储结构完成下列填充: _顺序存储结构__ 存储密度较大;_顺序存储结构___存储利用率较高;_顺序存储结构___可以随机存取;_链式存储结构____不可以随机存取;__链式存储结构__插入和删除操作比较方便。

【8,3,2】从一个长度为n的顺序表中删除第i个元素(1≤i≤n)时,需向前移动 n-i 个元素。

【9,3,2】带头结点的单链表Head为空的条件是____ Head->next==null _____

【10,3,2】在一个单链表中p所指结点(p所指不是最后结点)之后插入一个由指针s所指结点,应执行s->next=__ p->next ___;和p->next=___s _____的操作。

【11,3,2】在一个单链表中删除p所指结点时,应执行以下操作: q= p->next;

p->data= p->next->data;

p->next= p->next->next _ ; free(q);

【12,3,2】带头结点的单循环链表Head的判空条件是_ Head->next==null ____; 不带头结点的单循环链表的判空条件是__ Head==null___。

【13,3,2】已知L是带表头结点的非空单链表, 且P结点既然不首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。

a. 删除P结点的直接前驱结点的语句序列是_10 12 8 11 4 14______。 b. 删除结点P的语句序列是_____10 12 7 3 14___________。 c. 删除尾元结点的语句序列是______9 11 3 14___________。 (1) P = P->next; (2) P->next = P;

2

(3) P->next = P->next ->next; (4) P = P->next ->next;

(5) while (P != NULL) P = P->next;

(6) while (Q->next != NULL){P = Q; Q = Q->next}; (7) while (P->next != Q) P = P->next; (8) while (P->next->next != Q) P = P->next;

(9) while (P->next->next != NULL) P = P->next; (10) Q = P;

(11) Q = P->next; (12) P = L;

(13) L = L->next; (14) free (Q);

【14,3,3】对一个栈,给定输入的顺序是A、B、C,则全部不可能的输出序列有 C A B 。

【15,3,3】.在栈顶指针为HS的链栈中,判定栈空的条件是 head->next==null 。

【16,3,3】下列程序把十进制数转换为十六进制数,请填写合适的语句成分。

void conversion10_16() { InitStack(&s); scanf(“%d”,&N); while(N){

____ Push(s, N) _____ ___ ;

N = N/16; }

while(!StackEmpty(s)){ _______ Pop(s, e) ; if(e<=9)printf(“%d”,e); else printf(“%c”,e-10+’A’); }

} /* conversion */

【17,3,4】若用一个大小为6个元素的数组来实现循环队列,且当前rear=0和front=3。当从队列中删除一个元素,再加入两个元素后,rear和front的值分别是 2 和 4 。

【18,3,4】堆栈和队列都是线性表, 堆栈是___后进先出__的线性表, 而队列是________

3

先进先出___的线性表。

【19,3,4】若用一个大小为6个元素的数组来实现循环队列,且当前rear=0和front=3

。当从队列中删除一个元素,再加入两个元素后,rear和front的值分别是 2 和 4 。 【20,4,2】已知一棵树边的集合是{,,,,,,,,}。那么根结点是 e ,结点b的双亲是 d ,结点a的子孙有 bcdj ,树的深度是 4 ,树的度是 3 ,结点g在树的第 3 层。 【21,4,3】从概念上讲,树与二叉树是二种不同的数据结构,将树转化为二叉树的基本的目的是 树可采用二叉树的存储结构并利用二叉树的已有算法解决树的有关问题 【22,4,3】满三叉树的第i层的结点个数为 3i-1 ,深度为h时该树中共有 3h-1 结点。

【23,4,3】已知一棵完全二叉树有56个叶子结点,从上到下、从左到右对它的结点进行编号,根结点为1号。则该完全二叉树总共结点有___111_____个;有__7_____层;第91号结点的双亲结点是___45____号;第63号结点的左孩子结点是_________号。 【24,4,3】下列表示的图中,共有____5___个是树;有___3____个是二叉树;有___2____个是完全二叉树。

4

【25,4,4】n个结点的二叉排序树的最大深度是 n ,最小深度为 [log2?]+1 _ 【26,4,3】如果某二叉树的后序遍历序列是ABCDEFGHI,中序遍历序列是ACBIDFEHG,则其先序遍历序列的第一个字母是 I ,最后一个字母是 G 。

【27,4,3】下列二叉树的中序遍历序列是____ DBNGOAEC ____ ___;后序遍历序列是________ DNOGBECA ___。

5

删除所有值大于min而且小于max的元素。

SeqList Delete(SeqList &L, int min, int max) {

int i;=0,j=0

for (i=0; i

if(L.elem[i]>min && L.elem[i]

{ }

for(j=i;j

L.elem[j]=L.elem[j+1]; --L.length;

}

return L ; }

【8,3,2】给定一个顺序存储的线性表L = (a1, a2, ?, an),请设计一个算法查找该线性表中最长递增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。

void main() {

int n, i, j, k;

int A[1024]={}; int dp[1024]={};

scanf(\, &n); for (i=1; i<=n; i++) scanf(\, A[i]); dp[1] = 1; // 有n个阶段

for (i=2; i<=n; i++) {

dp[i] = 1; // 每个阶段只有1个状态

16

// 每个状态有i种决策,以得出以元素i结尾的最长递归子序列的长度 for (j=i-1; j>=0; j--) {

if (A[i]>A[j])

{ }

dp[i] = max(dp[i], dp[j]+1); } }

int maximum = dp[1]; for (i=2; i<=n; i++) }

{ }

printf(\, maximum); maximum = max(maximum, dp[i]);

【9,3,3】 如果有1、2、3、4、5按顺序入栈,不同的堆栈操作(pop, push)顺序可得到不同的堆栈输出序列。请问共有多少种不同的输出序列?为什么?

答案:按照正常情况,1,2,3,4,5的全排列组合共有5! = 120,即120种,但由于 像:12435、12534之类的无法按顺序出入栈,故按照顺序入栈的情况共有56种: 以1开始排列组合为14种

17

以2开始排列组合为14种 以3开始的排列组合为9种 以4开始的排列组合为4种 以5开始的排列组合为1种

【10,3,2】请编写程序将中缀表达式转换为后缀表达式。 答案:使用栈的循序存储结构实现、栈的顺序存储结构,用一维数组实现

#include #include

#define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE 0

18

#define MAXSIZE 10 typedef int Status; typedef char ElemType; typedef struct {

ElemType data[MAXSIZE]; int top;//栈顶指针 }Stack; //1. 初始化

Status InitStack(Stack *S){ int i;

for(i=0;idata[i]=NULL; S->top=-1; return OK; }

//2. 创建一个长度为n的堆栈

Status CreateStack(Stack *S,int n){ int i =0;

if(n>MAXSIZE || n<1){

printf(\输入长度有误!\\n\); return ERROR; }

for(i=0;i

S->data[i]=rand()0+1; }

S->top=n-1;

return OK; }

Status push(Stack *S,ElemType e){ if(MAXSIZE-1==S->top){ printf(\栈已满\\n\); return ERROR; }

//栈顶指向的元素有值 ++(S->top);

19

S->data[S->top]=e; return OK; } //4. 出栈

Status pop(Stack *S,ElemType *e){ //将栈顶元素出栈,传给e if(-1==S->top){

printf(\栈为空!\\n\); return ERROR; }

*e=S->data[S->top]; --(S->top); return OK; }

//5. 中缀表达式转后缀表达式

void MidToFinal(char *mid,char *final){

//中缀表达式为middle,要转换成后缀表达式传给last //新建一个栈,来存储符号 char e; Stack S;

if(OK!=InitStack(&S)){

printf(\初始化栈失败!\\n\); }

//当带转换的字符串*mid未终止时,循环处理 while(*mid){

//如果是数字,则直接输出 if(*mid>='0' && *mid<='9'){ *(final++)=*(mid++); continue;

}else if(*mid=='+' || *mid=='-' || *mid=='*' || *mid=='/' || *mid=='(' || *mid==')'){

//输入的是合法运算符号,比较之前是否有更高优先级的符号 if(S.top==-1 || '('==*mid){

//当符号栈为空或遇到左括号时,符号入栈 push(&S,*(mid++)); continue; }

20

if(')'==*mid){

//遇到右括号时,栈顶元素依次出栈;直到遇到第一个左括号时结束 pop(&S,&e); *(final++)=e;

while(pop(&S,&e) && e!='('){ *(final++)=e; }

// printf(\ mid++;

continue; }

//后续的处理都要取出临时的栈顶元素,与当前输入的符号*mid相比较;当临时栈顶元素优先级大于等于输入符号的优先级时,出栈;否则符号入栈(已经弹出一个,记得把弹出的元素也入栈) pop(&S,&e);

if('+'==*mid || '-'==*mid){ if(e=='('){ push(&S,'('); push(&S,*(mid++)); continue; }else{

*(final++)=e; push(&S,*(mid++)); continue; }

}else if('*'==*mid || '/'==*mid){ if('*'==e || '/'==e){ *(final++)=e; push(&S,*(mid++)); continue; }else{

push(&S,e); push(&S,*(mid++)); continue; } }

}else{

printf(\输入的字符不合法!%c\\n\,*mid); return;

21

} }

//当待转换的字符已经结束时,符号栈至少还有一个元素(中缀表达式的特点:数字结尾;后缀表达式以符号结尾);将栈中的元素依次出栈 while(S.top!=-1){ pop(&S,&e); *(final++)=e; }

//字符串的结束符! *final='\\0'; }

int main() {

char data[]=\; char final[]=\; MidToFinal(data,final); printf(\,final); return 0; }

【11,4,3】设二叉树的存储结构如下:

Lchild data Rchild 1 0 J 0 2 0 H 0 3 2 F 0 4 3 D 9 5 7 B 4 6 5 A 0 7 8 C 0 8 0 E 0 9 10 G 0 10 1 I 0 其中根结点的指针值为6,Lchild,Rchild分别为结点的左、右孩子指针域,data为数据域。

(1) 画出二叉树的逻辑结构。

(2) 写出该树的前序、中序和后序遍历的序列。 答:

22

前序遍历:ECBHFDJIGA 中序遍历:ABCEDFHGIJ 后序遍历:ECHFJIGDBA

【12,4,4】可以生成如下二叉排序树的关键字的初始排列有几种?请写出其中的任意5个。

23

解:30种。任写5个序列如下: (5,4,7,6,2,3,1); (5,7,4,6,2,3,1); (5,4,7,2,3,1,6); (5,7,6,4,2,3,1); (5,7,6,4,2,1,3)

【13,4,5】给定关键字序列(11、7、16、4、22、13、5),请回答: (1)画出依次插入到一棵空的二叉排序树后的最终二叉树(6分); (2)画出依次把给定序列关键字插入一棵空的平衡二叉树后的结果(4分); 答:(1)

24

25

2)

26

27

【14,4,6】 假设一个文本使用的字符集为{a,b,c,d,e,f,g}, 字符的哈夫曼编码依次为{0110,10,110,111,00,0111,010}。

(1)请根据哈夫曼编码画出此哈夫曼树,并在叶子结点中标注相应的字符; (2)若这些字符在文本中出现的频率分别为:{3,35,13,15,20,5,9},求该哈夫曼树的带权路径长度。 答:

28

【15,5,3】用公式5.6计算一下你的身份证号码的散列值是多少。 答:公式5.6如下h(key)=key mod 11;

身份证号码信息如下:362429198307050010,设身份证为数字类型,对11求余后为4

【16,5,4】设有一组关键字{29,01,13,15,56,20,87,27,69,9,10,74},散列函数为:H(key) = key % 17,采用平方探测方法解决冲突。试在0到18的散列地址空间中对该关键字序列构造散列表。 答: 散列地址 0 插入29 插入01 插入13 插入15 插入56 插入20 插入87 插入27 插入69

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 说明 29 无冲突 无冲突 无冲突 无冲突 无冲突 无冲突 无冲突 无冲突 d2=-1 01 13 15 56 20 87 27 69 29

插入9 插入10 插入74 74 9 无冲突 d1=1 无冲突 10

【17,5,4】将关键字序列(7,8,30,11,18,9,14)散列存储到散列列表中,散列表的存储空间是一个下标从0开始的一个一维数组。处理冲突采用线性探测法,散列函数为:H(key)=(key×3)mod TableSize,要求装入因子为0.7。 答:tableSize为7/0.7,即10,散列函数为h(key)=(key*3) mod 10;下面为散列表插入过程 散列地址 0 插入7 插入8 插入30 插入11 插入18 插入9 插入14

30

1 7 2 3 11 4 8 5 18 6 7 9 8 9 说明 无冲突 无冲突 无冲突 无冲突 d1=1 无冲突 无冲突 30 14

【18,6,3】已知一个无向图的顶点集为{V0,V1,…,V7},其邻接矩阵如下所示:

V0 0 1 0 1 1 0 0 0 V1 1 0 1 0 1 0 0 0 V2 0 1 0 0 0 1 0 0 V3 1 0 0 0 0 0 1 0 V4 1 1 0 0 0 0 1 0 V5 0 0 1 0 0 0 0 0 V6 0 0 0 1 1 0 0 1 V7 0 0 0 0 0 0 0 1

(1) 画出该图的图形;

(2) 给出从V0出发的深度优先遍历序和广度优先遍历序。 答:

深度优先:01254673 广度优先:01324657

31

【19,6,3】已知有向图如右图所示,请给出该图的 (1) 每个顶点的入度和出度; (2) 邻接矩阵; (3) 邻接表; (4) 逆邻接表;

(5) 各个强连通分量 答案: (1): 节点号 入度 出度 1 3 0 2 2 2 3 1 2 4 1 3 5 2 1 6 2 3 (2):

1 0 1 0 0 1 1 2 1 0 1 1 0 1 3 0 1 0 1 0 1 4 0 1 1 0 1 1 5 1 0 0 1 0 1 6 1 1 1 1 1 0 (3):

32

((4):

(5):

1:无强连通分量

33

【20,6,3】试利用Dijkstra算法求下图在从顶点A到其它顶点的最短距离及对应的路径,写出计算过程中各步状态。

答: 初始(第0步) 第一步(选C) 第二步(选F) 第三步(选E) 第四步(选G) 第五步(选D) 第六步(选B) 终点 D

P D P D P D 34

P D P D P D P B C D E F G

15 2 12 ∞ ∞ ∞ 0 0 0 15 2 12 10 6 ∞ A A A C C 15 2 12 10 6 16 A A A C C F 15 2 12 10 6 16 A A A C C F 15 2 12 10 6 16 A A A C C F 15 2 12 10 6 15 A A A C C D 15 2 12 10 6 15 A A A C C D 【21,6,3】给出如下图所示的具有7个结点的网G。请:

(1) 画出该网的邻接矩阵;

(2) 采用Prim算法,从4号结点开始,给出该网的最小生成树(画出Prim算法

的执行过程及最小生成树的生成示意图)。

1

答: (1):

0 0 1 1 0 0 0 1 1 1 0 0 1 0 0 1 2 1 0 0 0 1 0 1 3 0 1 0 0 0 1 1 4 0 0 1 0 0 1 1 5 0 0 0 1 1 0 1 6 1 1 1 1 1 1 0

35

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

本文来源:https://www.bwwdw.com/article/viu3.html

Top