数据结构c语言版课后习题答案完整版Word文档下载推荐.docx
- 文档编号:15171767
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:21
- 大小:224.20KB
数据结构c语言版课后习题答案完整版Word文档下载推荐.docx
《数据结构c语言版课后习题答案完整版Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构c语言版课后习题答案完整版Word文档下载推荐.docx(21页珍藏版)》请在冰豆网上搜索。
if(p->
data>
pmax->
data)pmax=p;
p=p->
}
returnpmax->
data;
(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。
voidinverse(LinkList&
L){
//逆置带头结点的单链表L
L->
next=NULL;
while(p){
q=p->
//q指向*p的后继
p->
next=L->
next=p;
//*p插入在头结点之后
p=q;
}
(10)已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为O(n)、空间复杂度为O
(1)的算法,该算法删除线性表中所有值为item的数据元素。
[题目分析]在顺序存储的线性表上删除元素,通常要涉及到一系列元素的移动(删第i个元素,第i+1至第n个元素要依次前移)。
本题要求删除线性表中所有值为item的数据元素,并未要求元素间的相对位置不变。
因此可以考虑设头尾两个指针(i=1,j=n),从两端向中间移动,凡遇到值item的数据元素时,直接将右端元素左移至值为item的数据元素位置。
voidDelete(ElemTypeA[],intn)
∥A是有n个元素的一维数组,本算法删除A中所有值为item的元素。
{i=1;
j=n;
∥设置数组低、高端指针(下标)。
while(i<
j)
{while(i<
j&
&
A[i]!
=item)i++;
∥若值不为item,左移指针。
if(i<
j)while(i<
A[j]==item)j--;
∥若右端元素值为item,指针左移
j)A[i++]=A[j--];
[算法讨论]因元素只扫描一趟,算法时间复杂度为O(n)。
删除元素未使用其它辅助空间,最后线性表中的元素个数是j。
第3章栈和队列
CCDAADABCDDDBCB
2.算法设计题
(2)回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。
试写一个算法判定给定的字符向量是否为回文。
(提示:
将一半字符入栈)
根据提示,算法可设计为:
//以下为顺序栈的存储结构定义
#defineStackSize100//假定预分配的栈空间最多为100个元素
typedefcharDataType;
//假定栈元素的数据类型为字符
typedefstruct{
DataTypedata[StackSize];
inttop;
}SeqStack;
intIsHuiwen(char*t)
{//判断t字符向量是否为回文,若是,返回1,否则返回0
SeqStacks;
inti,len;
chartemp;
InitStack(&
s);
len=strlen(t);
//求向量长度
for(i=0;
i<
len/2;
i++)//将一半字符入栈
Push(&
s,t[i]);
while(!
EmptyStack(&
s))
{//每弹出一个字符与相应字符比较
temp=Pop(&
if(temp!
=S[i])
return0;
//不等则返回0
elsei++;
}
return1;
//比较完毕均相等则返回1
}
(7)假设以数组Q[m]存放循环队列中的元素,同时设置一个标志tag,以tag==0和tag==1来区别在队头指针(front)和队尾指针(rear)相等时,队列状态为“空”还是“满”。
试编写与此结构相应的插入(enqueue)和删除(dlqueue)算法。
【解答】
循环队列类定义
#include<
assert.h>
template<
classType>
classQueue{//循环队列的类定义
public:
Queue(int=10);
~Queue(){delete[]Q;
voidEnQueue(Type&
item);
TypeDeQueue();
TypeGetFront();
voidMakeEmpty(){front=rear=tag=0;
}//置空队列
intIsEmpty()const{returnfront==rear&
tag==0;
}//判队列空否
intIsFull()const{returnfront==rear&
tag==1;
}//判队列满否
private:
intrear,front,tag;
//队尾指针、队头指针和队满标志
Type*Q;
//存放队列元素的数组
intm;
//队列最大可容纳元素个数
}
构造函数
Queue<
Type>
:
Queue(intsz):
rear(0),front(0),tag(0),m(sz){
//建立一个最大具有m个元素的空队列。
Q=newType[m];
//创建队列空间
assert(Q!
=0);
//断言:
动态存储分配成功与否
插入函数
template<
voidQueue<
:
EnQueue(Type&
item){
assert(!
IsFull());
//判队列是否不满,满则出错处理
rear=(rear+1)%m;
//队尾位置进1,队尾指针指示实际队尾位置
Q[rear]=item;
//进队列
tag=1;
//标志改1,表示队列不空
删除函数
TypeQueue<
DeQueue(){
IsEmpty());
//判断队列是否不空,空则出错处理
front=(front+1)%m;
//队头位置进1,队头指针指示实际队头的前一位置
tag=0;
//标志改0,表示栈不满
returnQ[front];
//返回原队头元素的值
读取队头元素函数
GetFront(){
returnQ[(front+1)%m];
//返回队头元素的值
第4章串、数组和广义表
BBCABBBCBBABDCBC
2.综合应用题
(1)已知模式串t=‘abcaabbabcab’写出用KMP法求得的每个字符对应的next和nextval函数值。
模式串t的next和nextval值如下:
j
123456789101112
t串
abcaabbabcab
next[j]
011122312345
nextval[j]
011021301105
(3)数组A中,每个元素A[i,j]的长度均为32个二进位,行下标从-1到9,列下标从1到11,从首地址S开始连续存放主存储器中,主存储器字长为16位。
求:
存放该数组所需多少单元?
存放数组第4列所有元素至少需多少单元?
数组按行存放时,元素A[7,4]的起始地址是多少?
数组按列存放时,元素A[4,7]的起始地址是多少?
每个元素32个二进制位,主存字长16位,故每个元素占2个字长,行下标可平移至1到11。
(1)242
(2)22(3)s+182(4)s+142
(4)请将香蕉banana用工具H()—Head(),T()—Tail()从L中取出。
L=(apple,(orange,(strawberry,(banana)),peach),pear)
H(H(T(H(T(H(T(L)))))))
(5)写一个算法统计在输入字符串中各个不同字符出现的频度并将结果存入文件(字符串中的合法字符为A-Z这26个字母和0-9这10个数字)。
voidCount()
//统计输入字符串中数字字符和字母字符的个数。
{inti,num[36];
charch;
for(i=0;
i<
36;
i++)num[i]=0;
//初始化
while((ch=getchar())!
=‘#’)//‘#’表示输入字符串结束。
if(‘0’<
=ch<
=‘9’){i=ch-48;
num[i]++;
}//数字字符
else if(‘A’<
=‘Z’){i=ch-65+10;
}//字母字符
for(i=0;
10;
i++)//输出数字字符的个数
printf(“数字%d的个数=%d\n”,i,num[i]);
for(i=10;
i++)//求出字母字符的个数
printf(“字母字符%c的个数=%d\n”,i+55,num[i]);
}//算法结束。
第5章树和二叉树
ADDCACCBDCCCACC
2.应用题
(2)设一棵二叉树的先序序列:
ABDFCEGH,中序序列:
BFDAGEHC
画出这棵二叉树。
画出这棵二叉树的后序线索树。
将这棵二叉树转换成对应的树(或森林)。
(1)
(2)
(3)假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10。
试为这8个字母设计赫夫曼编码。
试设计另一种由二进制表示的等长编码方案。
对于上述实例,比较两种方案的优缺点。
解:
方案1;
哈夫曼编码
先将概率放大100倍,以方便构造哈夫曼树。
w={7,19,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言版 课后 习题 答案 完整版