数据结构(C语言描述)课后答案习题答案7

合集下载

数据结构-c语言描述(第二版)答案耿国华编著

数据结构-c语言描述(第二版)答案耿国华编著

第1章绪论2.(1)×(2)×(3)√3.(1)A(2)C(3)C5.计算下列程序中x=x+1的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;【解答】x=x+1的语句频度为:T(n)=1+(1+2)+(1+2+3)+……+(1+2+……+n)=n(n+1)(n+2)/66.编写算法,求一元多项式p n(x)=a0+a1x+a2x2+…….+a n x n的值p n(x0),并确定算法中每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能小,规定算法中不能使用求幂函数。

注意:本题中的输入为a i(i=0,1,…n)、x和n,输出为P n(x0)。

算法的输入和输出采用下列方法(1)通过参数表中的参数显式传递(2)通过全局变量隐式传递。

讨论两种方法的优缺点,并在算法中以你认为较好的一种实现输入输出。

【解答】(1)通过参数表中的参数显式传递优点:当没有调用函数时,不占用内存,调用结束后形参被释放,实参维持,函数通用性强,移置性强。

缺点:形参须与实参对应,且返回值数量有限。

(2)通过全局变量隐式传递优点:减少实参与形参的个数,从而减少内存空间以及传递数据时的时间消耗缺点:函数通用性降低,移植性差算法如下:通过全局变量隐式传递参数PolyValue(){int i,n;float x,a[],p;printf(“\nn=”);scanf(“%f”,&n);printf(“\nx=”);scanf(“%f”,&x);for(i=0;i<n;i++)scanf(“%f”,&a[i]);/*执行次数:n次*/p=a[0];for(i=1;i<=n;i++){p=p+a[i]*x;/*执行次数:n次*/x=x*x;}printf(“%f”,p);}算法的时间复杂度:T(n)=O(n)通过参数表中的参数显式传递float PolyValue(float a[],float x,int n){float p,s;int i;p=x;s=a[0];for(i=1;i<=n;i++){s=s+a[i]*p;/*执行次数:n次*/p=p*x;}return(p);}算法的时间复杂度:T(n)=O(n)第2章线性表习题1.填空:(1)在顺序表中插入或删除一个元素,需要平均移动一半元素,具体移动的元素个数与插入或删除的位置有关。

《数据结构—用C语言描述》课后习题答案

《数据结构—用C语言描述》课后习题答案

数据结构课后习题参考答案第一章绪论1.3 (1) O(n)(2)(2)O(n)(3)(3)O(n)(4)(4)O(n1/2)(5)(5)执行程序段的过程中,x,y值变化如下:循环次数x y0(初始)91 1001 92 1002 93 100………………9 100 10010 101 10011 91 9912 92 100………………20 101 9921 91 98………………30 101 9831 91 97到y=0时,要执行10*100次,可记为O(10*y)=O(n)1.5 2100 , (2/3)n , log2n , n1/2 ,n3/2, (3/2)n , n log2n , 2 n ,n! , n n第二章线性表(参考答案)在以下习题解答中,假定使用如下类型定义:(1)顺序存储结构:#define MAXSIZE 1024typedef int ElemType;// 实际上,ElemType可以是任意类型typedef struct{ ElemType data[MAXSIZE];int last; // last表示终端结点在向量中的位置}sequenlist;(2)链式存储结构(单链表)typedef struct node{ElemType data;struct node *next;}linklist;(3)链式存储结构(双链表)typedef struct node{ElemType data;struct node *prior,*next;}dlinklist;(4)静态链表typedef struct{ElemType data;int next;}node;node sa[MAXSIZE];2.1 头指针:指向链表的指针。

因为对链表的所有操均需从头指针开始,即头指针具有标识链表的作用,所以链表的名字往往用头指针来标识。

如:链表的头指针是la,往往简称为“链表la”。

《数据结构(C语言版 第2版)》(严蔚敏 著)第七章练习题答案

《数据结构(C语言版 第2版)》(严蔚敏 著)第七章练习题答案

《数据结构(C语言版第2版)》(严蔚敏著)第七章练习题答案第7章查找1.选择题(1)对n个元素的表做顺序查找时,若查找每个元素的概率相同,则平均查找长度为()。

A.(n-1)/2B.n/2C.(n+1)/2D.n答案:C解释:总查找次数N=1+2+3+…+n=n(n+1)/2,则平均查找长度为N/n=(n+1)/2。

(2)适用于折半查找的表的存储方式及元素排列要求为()。

A.链接方式存储,元素无序B.链接方式存储,元素有序C.顺序方式存储,元素无序D.顺序方式存储,元素有序答案:D解释:折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

(3)如果要求一个线性表既能较快的查找,又能适应动态变化的要求,最好采用()查找法。

A.顺序查找B.折半查找C.分块查找D.哈希查找答案:C解释:分块查找的优点是:在表中插入和删除数据元素时,只要找到该元素对应的块,就可以在该块内进行插入和删除运算。

由于块内是无序的,故插入和删除比较容易,无需进行大量移动。

如果线性表既要快速查找又经常动态变化,则可采用分块查找。

(4)折半查找有序表(4,6,10,12,20,30,50,70,88,100)。

若查找表中元素58,则它将依次与表中()比较大小,查找结果是失败。

A.20,70,30,50B.30,88,70,50C.20,50D.30,88,50答案:A解释:表中共10个元素,第一次取⎣(1+10)/2⎦=5,与第五个元素20比较,58大于20,再取⎣(6+10)/2⎦=8,与第八个元素70比较,依次类推再与30、50比较,最终查找失败。

(5)对22个记录的有序表作折半查找,当查找失败时,至少需要比较()次关键字。

A.3B.4C.5D.6答案:B解释:22个记录的有序表,其折半查找的判定树深度为⎣log222⎦+1=5,且该判定树不是满二叉树,即查找失败时至多比较5次,至少比较4次。

(6)折半搜索与二叉排序树的时间性能()。

数据结构(c语言版)课后习题答案完整版

数据结构(c语言版)课后习题答案完整版

数据结构(c语言版)课后习题答案完整版数据结构(C语言版)课后习题答案完整版一、数据结构概述数据结构是计算机科学中一个重要的概念,用来组织和存储数据,使之可以高效地访问和操作。

在C语言中,我们可以使用不同的数据结构来解决各种问题。

本文将提供完整版本的C语言数据结构的课后习题答案。

二、顺序表1. 顺序表的定义和基本操作顺序表是一种线性表,其中的元素在物理内存中连续地存储。

在C 语言中,我们可以通过定义结构体和使用指针来实现顺序表。

以下是顺序表的一些基本操作的答案:(1)初始化顺序表```ctypedef struct{int data[MAX_SIZE];int length;} SeqList;void InitList(SeqList *L){L->length = 0;}```(2)插入元素到顺序表中```cbool Insert(SeqList *L, int pos, int elem){if(L->length == MAX_SIZE){return false; // 顺序表已满}if(pos < 1 || pos > L->length + 1){return false; // 位置不合法}for(int i = L->length; i >= pos; i--){L->data[i] = L->data[i-1]; // 向后移动元素 }L->data[pos-1] = elem;L->length++;return true;}```(3)删除顺序表中的元素```cbool Delete(SeqList *L, int pos){if(pos < 1 || pos > L->length){return false; // 位置不合法}for(int i = pos; i < L->length; i++){L->data[i-1] = L->data[i]; // 向前移动元素 }L->length--;return true;}```(4)查找顺序表中的元素```cint Search(SeqList L, int elem){for(int i = 0; i < L.length; i++){if(L.data[i] == elem){return i + 1; // 找到元素,返回位置 }}return -1; // 未找到元素}```2. 顺序表习题解答(1)逆置顺序表```cvoid Reverse(SeqList *L){for(int i = 0; i < L->length / 2; i++){int temp = L->data[i];L->data[i] = L->data[L->length - 1 - i]; L->data[L->length - 1 - i] = temp;}}```(2)顺序表元素去重```cvoid RemoveDuplicates(SeqList *L){for(int i = 0; i < L->length; i++){for(int j = i + 1; j < L->length; j++){if(L->data[i] == L->data[j]){Delete(L, j + 1);j--;}}}}```三、链表1. 单链表单链表是一种常见的链式存储结构,每个节点包含数据和指向下一个节点的指针。

数据结构课后习题答案第七章

数据结构课后习题答案第七章

第七章图(参考答案)7.1(1)邻接矩阵中非零元素的个数的一半为无向图的边数;(2)A[i][j]= =0为顶点,I 和j无边,否则j和j有边相通;(3)任一顶点I的度是第I行非0元素的个数。

7.2(1)任一顶点间均有通路,故是强连通;(2)简单路径V4 V3 V1 V2;(3)0 1 ∞ 1∞ 0 1 ∞1 ∞ 0 ∞∞∞ 1 0邻接矩阵邻接表(2)从顶点4开始的DFS序列:V5,V3,V4,V6,V2,V1(3)从顶点4开始的BFS序列:V4,V5,V3,V6,V1,V27.4(1)①adjlisttp g; vtxptr i,j; //全程变量② void dfs(vtxptr x)//从顶点x开始深度优先遍历图g。

在遍历中若发现顶点j,则说明顶点i和j间有路径。

{ visited[x]=1; //置访问标记if (y= =j){ found=1;exit(0);}//有通路,退出else { p=g[x].firstarc;//找x的第一邻接点while (p!=null){ k=p->adjvex;if (!visited[k])dfs(k);p=p->nextarc;//下一邻接点}}③ void connect_DFS (adjlisttp g)//基于图的深度优先遍历策略,本算法判断一邻接表为存储结构的图g种,是否存在顶点i //到顶点j的路径。

设 1<=i ,j<=n,i<>j.{ visited[1..n]=0;found=0;scanf (&i,&j);dfs (i);if (found) printf (” 顶点”,i,”和顶点”,j,”有路径”);else printf (” 顶点”,i,”和顶点”,j,”无路径”);}// void connect_DFS(2)宽度优先遍历全程变量,调用函数与(1)相同,下面仅写宽度优先遍历部分。

数据结构课后习题答案1--7

数据结构课后习题答案1--7

数据结构课后习题答案1--7题目1:请你设计一个栈数据结构,使其具备以下功能:可以在O(1)的时间复杂度内获取栈的最小元素。

解答1:要实现在O(1)的时间复杂度内获取栈的最小元素,可以使用两个栈来实现。

一个栈用来保存原始数据,另一个栈用来保存当前栈的最小元素。

具体实现如下:1. 初始化两个栈:stack和min_stack,其中stack用于保存所有元素,min_stack用于保存当前栈中的最小元素。

2. 插入元素时,先将元素插入stack中,然后判断插入的元素是否比min_stack的栈顶元素小,如果是,则将元素也插入到min_stack中;如果不是,则将min_stack的栈顶元素再次插入到min_stack中。

3. 删除元素时,分别从stack和min_stack中弹出栈顶元素。

这样,min_stack的栈顶元素始终是stack中的最小元素。

题目2:请你设计一个队列数据结构,使其具备以下功能:可以在O(1)的时间复杂度内获取队列的最大元素。

解答2:要实现在O(1)的时间复杂度内获取队列的最大元素,可以使用两个队列来实现。

一个队列用来保存原始数据,另一个队列用来保存当前队列的最大元素。

具体实现如下:1. 初始化两个队列:queue和max_queue,其中queue用于保存所有元素,max_queue用于保存当前队列中的最大元素。

2. 插入元素时,先将元素插入queue中,然后判断插入的元素是否比max_queue的队尾元素大,如果是,则将元素也插入到max_queue的队尾;如果不是,则将max_queue中所有比插入元素小的元素都弹出,再将插入元素插入到max_queue的队尾。

3. 删除元素时,分别从queue和max_queue中弹出队头元素。

这样,max_queue的队头元素始终是queue中的最大元素。

题目3:请你设计一个栈数据结构,使其除了具有常规的入栈和出栈功能外,还具备以下功能:能够在O(1)的时间复杂度内获取栈中的最大元素。

数据结构(C语言版)课后习题答案

数据结构(C语言版)课后习题答案

第1章绪论1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。

答案:数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。

如数学计算中用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形、图像、声音、动画等通过特殊编码定义后的数据。

数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。

在有些情况下,数据元素也称为元素、结点、记录等。

数据元素用于完整地描述一个对象,如一个学生记录,树中棋盘的一个格局(状态)、图中的一个顶点等。

数据项:是组成数据元素的、有独立含义的、不可分割的最小单位。

例如,学生基本信息表中的学号、姓名、性别等都是数据项。

数据对象:是性质相同的数据元素的集合,是数据的一个子集。

例如:整数数据对象是集合N={0,±1,±2,…},字母字符数据对象是集合C={‘A’,‘B’,…,‘Z’,‘a’,‘b’,…,‘z’},学生基本信息表也可是一个数据对象。

数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。

换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。

逻辑结构:从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。

因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。

存储结构:数据对象在计算机中的存储表示,也称为物理结构。

抽象数据类型:由用户定义的,表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。

具体包括三部分:数据对象、数据对象上关系的集合和对数据对象的基本操作的集合。

2.试举一个数据结构的例子,叙述其逻辑结构和存储结构两方面的含义和相互关系。

答案:例如有一张学生基本信息表,包括学生的学号、姓名、性别、籍贯、专业等。

每个学生基本信息记录对应一个数据元素,学生记录按顺序号排列,形成了学生基本信息记录的线性序列。

数据结构C语言版习题参考答案

数据结构C语言版习题参考答案

附录习题参考答案习题1参考答案1.1.选择题(1). A. (2). A. (3). A. (4). B.,C. (5). A. (6). A. (7). C. (8). A. (9). B. (10.)A.1.2.填空题(1). 数据关系(2). 逻辑结构物理结构(3). 线性数据结构树型结构图结构(4). 顺序存储链式存储索引存储散列表(Hash)存储(5). 变量的取值范围操作的类别(6). 数据元素间的逻辑关系数据元素存储方式或者数据元素的物理关系(7). 关系网状结构树结构(8). 空间复杂度和时间复杂度(9). 空间时间(10). Ο(n)1.3 名词解释如下:数据:数据是信息的载体,是计算机程序加工和处理的对象,包括数值数据和非数值数据。

数据项:数据项指不可分割的、具有独立意义的最小数据单位,数据项有时也称为字段或域。

数据元素:数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理,一个数据元素可由若干个数据项组成。

数据逻辑结构:数据的逻辑结构就是指数据元素间的关系。

数据存储结构:数据的物理结构表示数据元素的存储方式或者数据元素的物理关系。

数据类型:是指变量的取值范围和所能够进行的操作的总和。

算法:是对特定问题求解步骤的一种描述,是指令的有限序列。

1.4 语句的时间复杂度为:(1) Ο(n2)(2) Ο(n2)(3) Ο(n2)(4) Ο(n-1)(5) Ο(n3)1.5 参考程序:main(){int X,Y,Z;scanf(“%d, %d, %d”,&X,&Y,Z);if (X>=Y)if(X>=Z)if (Y>=Z){ printf(“%d, %d, %d”,X,Y,Z);}else{ printf(“%d, %d, %d”,X,Z,Y);}else{ printf(“%d, %d, %d”,Z,X,Y);}elseif(Z>=X)if (Y>=Z){ printf(“%d, %d, %d”,Y,Z,X);}else{ printf(“%d, %d, %d”,Z,Y,X);}else{ printf(“%d, %d, %d”,Y,X,Z);}}1.6 参考程序:main(){int i,n;float x,a[],p;printf(“\nn=”);scanf(“%f”,&n);printf(“\nx=”);scanf(“%f”,&x);for(i=0;i<=n;i++)scanf(“%f ”,&a[i]);p=a[0];for(i=1;i<=n;i++){ p=p+a[i]*x;x=x*x;}printf(“%f”,p)’}习题2参考答案2.1选择题(1). C. (2). B. (3). B. (4). B. 5. D. 6. B. 7. B. 8. A. 9. A. 10. D.2.2.填空题(1). 有限序列(2). 顺序存储和链式存储(3). O(n) O(n)(4). n-i+1 n-i(5). 链式(6). 数据指针(7). 前驱后继(8). Ο(1) Ο(n)(9). s->next=p->next; p->next=s ;(10). s->next2.3. 解题思路:将顺序表A中的元素输入数组a,若数组a中元素个数为n,将下标为0,1,2,…,(n-1)/2的元素依次与下标为n,n-1,…, (n-1)/2的元素交换,输出数组a的元素。

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

习题7
1)选择题
(1)图中有关路径的定义是(A)。

A.由不同顶点所形成的序列
B.由顶点和相邻顶点对构成的边所形成的序列
C.由不同边所形成的序列
D.上述定义都不是
(2)设无向图的顶点个数为n,则该图最多有(B)条边。

A.n-1 B.n(n-1)/2 C.n(n+1)/2 D.n2
(3)一个n个顶点的连通无向图,其边的个数至少为(A)。

A.n-1 B.n C.n+1 D.n log2n
(4)要连通具有n个顶点的有向图,至少需要(B)条边
A.n-1 B.n C.n+1 D.2n
(5)n个结点的完全有向图含有边的数目为(D)。

A.n2B.n(n+1) C.n/2 D.n(n-1)
(6)一个有n个结点的图,最少有(B)个连通分量,最多有(D)个连通分量。

A.0 B.1 C.n-1 D.n
(7)在一个无向图中,所有顶点的度数之和等于所有边数的(B)倍,在一个有向图中,所有顶点的入度之和等于所有顶点出度之和的(C)倍。

A.1/2 B.2 C.1 D.4
(8)下面结构中最适于表示稀疏无向图的是(C),适于表示稀疏有向图的是(BDE)。

A.邻接矩阵B.逆邻接表C.邻接多重表D.十字链表E.邻接表
(9)下列哪些图的邻接矩阵是对称矩阵(B)。

A.有向图B.无向图C.有向网D.无向网
(10)下列有关图遍历的说法不正确的是(C)。

A.连通图深度优先搜索是个递归过程
B.图的广度优先遍历中邻接点的搜索具有“先进先出”的特征C.非连通图不能用深度优先搜索
D.图的遍历要求每个顶点仅被访问一次
(11)某图的邻接表如图7-26所示。

1
2
3
4
5
6
7
图7-26 某图的邻接表
①从顶点v1进行深度优先遍历,遍历过程中要经过的顺序是(A)。

A.v1v2v3B.v1v3v4C.v1v2v4D.v1 v3v5
②从顶点v1进行广度优先遍历,遍历过程中要经过的顺序是(D)。

A.v1v2v3B.v1v3v4C.v1v2v4D.v1 v3v5
(12)一个加权无向连通图的最小生成树(A)。

A.有一棵或者多棵B.只有一棵
C.一定有多棵D.可能不存在
2)判断题
(1)在n个结点的无向图中,若边数大于n-1,则该图必是连通图。

(×)
(2)有e条边的无向图,在邻接表中有e个结点。

(×)
(3)有向图中顶点v的度等于其邻接矩阵中第v行中1的个数。

(×)
(4)强连通图的各顶点间均可达。

(√)
(5)邻接多重表是无向图和有向图的链式存储结构。

(×)
(6)用邻接矩阵法存储一个图所需的存储单元数目与图的边数有关。

(×)
(7)有n个顶点的无向图,采用邻接矩阵表示,图中的边数等
于邻接矩阵中非零元素之和的一半。

(√)
(8)求最小生成树的普里姆(Prim)算法中边上的权可正可负。

(×)
3)填空题
(1)判断一个无向图是一棵树的条件是_有n个顶点,n-1条边的无向连通图__。

(2)一个连通图的___生成树_________是一个极小连通子图。

(3)具有10个顶点的无向图,边的总数最多为____45________。

(4)G是一个非连通无向图,共有28条边,则该图至少有_____9_______个顶点。

(5)在有n个顶点的有向图中,若要使任意两点间可以互相到达,则至少需要__n___条弧。

(6)如果含n个顶点的图形形成一个环,则它有_____n______棵生成树。

4)解答题
(1)按图7-26的邻接表分别写出从v6出发进行广度优先和深度优先遍历序列。

广度优先:v6 v5 v7 v0 v2 v3 v1 v4
深度优先:v6 v5 v7 v0 v2 v3 v1 v4
(2)证明:具有n个顶点和多于n-1条边的无向连通图G一定不是树。

证明:具有n个顶点n-1条边的无向连通图是自由树,即没
有确定根结点的树,每个结点均可当根。

若边数多于n-1条,因一条边要连接两个结点,则必因加上这一条边而使两个结点多了一条通路,即形成回路。

形成回路的连通图不再是树(在图论中树定义为无回路的连通图)。

(3)画出如图7-27所示的无向网的最小生成树。

v 2v 1v 3v 4
v 5v 6v 7
v 8
13
2265424
31
图7-27 某无向网
(略)
(4)按照Prim 算法,写出从顶点v 2开始构造图7-26的最小生成树的过程。

(略)
(5)按照Sollin 算法,写出构造图7-26的最小生成树的过程。

(略)
(6)按照Dijkstra 算法,写出求图7-26的顶点v 0到其他各个结点的最短路径过程中数组dist 和pre 各分量的变化情况表。

(略)
5)算法题
(1)以邻接多重表作存储结构,写出创建图的算法。

void CreatGraph (AdjList g) //建立有n个顶点和m 条边的无向图的邻接表存储结构
{
int n,m;
scanf("%d%d",&n,&m);
for (i =1,i<=n;i++)//输入顶点信息,建立顶点向量
{scanf(&g[i].vertex); g[i].firstarc=null;}
for (k=1;k<=m;k++)//输入边信息
{
scanf(&v1,&v2);//输入两个顶点
i=GraphLocateVertex (g,v1);
j=GraphLocateVertex (g,v2); //顶点定位
p=(ArcNode *)malloc(sizeof(ArcNode));//申请边结点
p->adjvex=j; p->next=g[i].firstarc; g[i].firstarc=p;//将边结点链入
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=i;
p->next=g[j].firstarc;
g[j].frstarc=p;
}
}//算法CreatGraph结束
(2)设有向G图有n个点,e条边,编写一个算法根据其邻接表生成其反向邻接表,要求算法复杂度为)
O 。

n
(e
void InvertAdjList(AdjList gin,gout)//将有向图的出度邻接表改为按入度建立的逆邻接表
{
for (i=1;i<=n;i++)//设有向图有n个顶点,建逆邻接表的顶点向量。

{gin[i].vertex=gout[i].vertex; gin.firstarc=null; } for (i=1;i<=n;i++) //邻接表转为逆邻接表。

{
p=gout[i].firstarc;//取指向邻接表的指针。

while (p!=null)
{
j=p->adjvex;
s=(ArcNode *)malloc(sizeof(ArcNode));//申请结点空间。

s->adjvex=i; s->next=gin[j].firstarc; gin[j].firstarc=s;
p=p->next;//下一个邻接点。

}//while
}//for
}
(3)用Floyd算法,求图7-26中任意顶点之间的最短路径。

(略)。

相关文档
最新文档