没有合适的资源?快使用搜索试试~ 我知道了~
数据结构课后习题部分参考答案.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 93 浏览量
2023-05-11
13:06:39
上传
评论
收藏 537KB PDF 举报
温馨提示
试读
21页
数据结构课后习题部分参考答案.pdf
资源推荐
资源详情
资源评论
数据结构课后习题部分参考答案
第一章
一、选择题
1.C 2.C 3.A 4.D 5.B
二、判断题
1.╳ 2.╳ 3.╳ 4.╳ 5.∨
三、简答题
1. 常见逻辑结构:
集合结构,数据元素之间的关系仅仅是属于同一个集合。
线性结构,除第一个元素只有一个直接后继、最后一个元素只有一个直接前驱,其余元
素有且只有唯一一个直接前驱、有且只有唯一一个直接后继,数据元素之间存在一对一的关
系。
树形结构,树中只有唯一一个根元素,除根元素之外,其余元素只有一个直接前驱,但
可以有多个直接后继元素,数据元素之间存在一对多的关系。
图形结构,元素之间关系任意,数据元素之间存在多对多的关系。
常用的存储结构:
顺序存储,把逻辑上相邻的元素存储在物理位置相邻的存储单元中,由此得到的存储表
示称为顺序存储结构。通常用数组实现。
链式存储,对逻辑上相邻的元素不要求其物理位置相邻,元素间的逻辑关系通过附加的
指针字段来表示,由此得到的存储表示称为链式存储结构。通常用指针来实现。
除上述两种方法外,有时为了查找方便还采用索引存储方法和散列存储方法。
索引存储:在存储结点信息的同时,还建立附加的索引表来标识结点的地址。
散列存储:根据元素的关键码确定元素存储位置的存储方式。
2. 算法与程序的区别:
程序不一定满足有穷性(如操作系统);
程序中的指令必须是机器可执行的,算法中的指令则无此限制;
算法代表了对问题的解,程序则是算法在计算机上的特定的实现(一个算法若用程序设
计语言来描述,它才是一个程序);
数据结构+算法=程序。
3.例如有一张学生成绩表,记录了一个班的学生各门课的成绩。按学生的姓名为一行记成
的表。这个表就是一个数据结构。每个记录就是一个结点,对于整个表来说,只有一个开始
结点和一个终端结点,其他的结点则各有一个也只有一个直接前趋和直接后继。这几个关系
就确定了这个表的逻辑结构——线形结构。
那么我们怎样把这个表中的数据存储到里呢 ? 用高级语言如何表示各结点之间的关系
呢? 是用一片连续的内存单元来存放这些记录(顺序存储)还是随机存放各结点数据再用指
针进行链接(链式存储)呢? 这就是存储结构的问题,我们都是从高级语言的层次来讨论这
个问题的。
最后,我们有了这个表,肯定要用它,那么就是要对这张表中的记录进行查询,修改,
删除等操作,对这个表可以进行哪些操作以及如何实现这些操作就是数据的运算问题了。
4.例如栈和队列,两个数据结构的逻辑结构和存储方式完全相同,只是对于运算(如插入、
删除)的定义不同,两个结构具有显著不同的特性。
5.语句频度
(1)n-1 (2)1 (3)n(n+1)/2 (4)n/2-1 (5)100
6.时间复杂度
n 2 2
(1)O(log
3
) (2)O(n ) (3)O(n )
7.
算法思想:
P (x,n)=(…((a
n
x+a
n-1
)x+a
n-2
)x+…+a
1
)x+a
0
语句:
y=0 ;
for (i=n;i>=0;i--)
y=y*x+ a
i
;
函数:
void p( )
{float x,y;
int n,i,a;
scanf("%f",&x);
scanf("%d",&n);
y=0;
for (i=n;i>=0;i--)
{scanf("%d",&a);
y=y*x+a; }
printf("x=%4.2f,y=%6.4f",x,y);
}
第二章
一、选择题
1.A 2.A 3.D 4.C 5.D
6.B 7.C 8.B 9.A 10.D
11.B 12.D
二、判断题
1.╳ 2.∨ 3.╳ 4.∨ 5.╳
6.∨ 7.╳ 8.∨ 9.∨ 10.╳
11.╳ 12.╳
三、算法设计题
1.
第一种方法(从后往前比较):
因已知顺序表 L 是递增有序表,所以只要从顺序表终端结点(设为 i 位置元素)开始向前寻找到第一
个小于或等于 x 的元素位置 i 后,插入该位置后面即可。
在寻找过程中,由于大于 x 的元素都应放在 x 之后,所以可边寻找,边后移元素,当找到第一个小于
或等于 x 的元素位置 i 时,插入 x 的位置 i+1 也空出来了。
算法如下:
void InsertIncreaseList1(seqlist *L,datatype x)
{int i;
if (L->elemnum==maxsize) printf("overflow"); // L->elemnum 中存放当前顺序表中的元素个数
for (i=L->elemnum-1;i>=0 && L->data[i]>x;i--) L->data[i+1]=L->data[i]; //从后往前比较并移动
元素
L->data[i+1]=x;
L->elemnum++;
}
第二种方法(从前往后比较):
void InsertIncreaseList2(seqlist *L,datatype x)
{int i,j;
if (L->elemnum==maxsize) printf("overflow");
i=0;
while((i<=L->elemnum-1)&&(L->data[i]<x)) i++; //从前往后比较寻找插入位置
for(j=L->elemnum-1;j>=i;j--) L->data[j+1]=L->data[j]; //腾位置
L->data[i]=x; //插入
L->elemnum++;
}
2(思路同算法 2-16)
6(
同 1 类似,最好也做一下。1 是顺序存储,6 是链式存储。做完同 1 比较一下)
7(看算法 2-17,尾插实现)
第三章
一、选择题
1.C 2.B 3.D 4.B 5.B
6.C 7.B 8.D 9.C 10.C
二、判断题
1.∨ 2.∨ 3.∨ 4.╳ 5.╳
三、简答题
1 循环队列的优点是:它可以克服顺序队列的"假上溢"现象,能够使存储队列的向量空间得
到充分的利用。 判别循环队列的"空"或"满"通常有两种方法:
(1)另设一个变量 num 记录当前队列中的元素个数,当 num==0 时队空, num==maxsize 时
队满。
(2)少用一个存储单元(即少存一个元素), 队空条件为 front == rear,队满条件为(rear
+ 1) % maxsize == front 。
2.栈的特点是先进后出,队列的特点是先进先出。
先进后出用栈;先进先出用队列。
3.一个直接调用自己或通过一系列调用间接调用自己的过程称为递归。
递归程序结构清晰,可读性强,而且容易用数学归纳法来证明程序的正确性。
递归程序运行效率低,不论是耗费的计算时间还是占用的存储空间都比非递归程序要多。
4.1234,1243,1324,1342,1432,2134,2143,2314,2341,2431,3214,3241,3421,4321(十四种
可能)
四、算法设计题
1.思想:将一半字符入栈)
算法为:
//以下为顺序栈的存储结构定义
#define StackSize 100 //假定预分配的栈空间最多为 100 个元素
typedef char DataType;//假定栈元素的数据类型为字符
typedef struct{
DataType data[StackSize];
int top;
}SeqStack;
int IsHuiwen( char *t)
{//判断 t 字符向量是否为回文,若是,返回 1,否则返回 0
SeqStack s;
int i , len;
char temp;
InitStack( &s);
len=strlen(t); //求向量长度
for ( i=0; i<len/2; i++)//将一半字符入栈
Push( &s, t[i]);
if (len%2==1) i++;// 处理向量长度为奇数的情况
while( !EmptyStack( &s))
{// 每弹出一个字符与相应字符比较
temp=Pop (&s);
if( temp!=S[i]) return 0 ;// 不等则返回 0
else i++;
}
return 1 ; // 比较完毕均相等则返回 1
}
2.我们通常用一个有三个分量(存储元素的空间、front、rear)的结构体变量实现循环队
列,此题即要求用一个数组和两个简单变量(而不是一个结构体变量)实现循环队列的入队
和出队。
5.思想: 对表达式进行扫描,凡遇到'('就进栈,遇')'就退掉栈顶的'(',表达式被扫描
完毕,栈应为空。
算法如下:
int PairBracket( char *SR)
{//检查表达式 ST 中括号是否配对
int i;
SeqStack S; //定义一个栈
InitStack (&s);
for (i=0; i<strlen(SR) ; i++)
{
if ( S[i]=='(' ) Push(&S, SR[i]); //遇'('时进栈
if ( S[i]==')' ) //遇')'
if (!StackEmpty(S))//栈不为空时,将栈顶元素出栈
Pop(&s);
else return 0;//不匹配,返回 0
}
if EmptyStack(&s) return 1;// 匹配,返回 1
else return 0;//不匹配,返回 0
}
第五章
一、选择题
1. C 2. C 3. B 4. B 5.B
6. C 7. B 8. D 9. A 10.D
11.D 12.C 13.B 14.D 15.B
二、判断题
1. ╳ 2.∨ 3. ╳ 4.╳ 5. ∨
6. ╳ 7.╳ 8. ╳ 9.∨ 10.╳
11. ╳ 12. ∨ 13.╳ 14.╳ 15.╳
16.╳ 17.∨ 18.╳ 19.╳ 20.∨
三、简答题
1.一棵度为 2 的树与一棵二叉树的区别在于: 度为 2 的树有两个分支,没有左右之分;一
棵二叉树也有两个分支,但有左右之分,左右不能交换。
树与二叉树的区别:
(1)二叉树的一个结点至多有两个子树,树形则不然。
(2)树中的结点只有一个子树时,无须区分其是左子树还是右子树;而二叉树中的结
点只有一个子树时,必需确定其是左子树还是右子树。
2.(1)
0
A
1
B
2
C
3
D
4
E
5
F
6 7 8 9
G
10 11 12
H
(2)
剩余20页未读,继续阅读
资源评论
hhappy0123456789
- 粉丝: 61
- 资源: 5万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功