数据结构c语言版课后习题答案完整版资料.docx
- 文档编号:30776725
- 上传时间:2023-08-23
- 格式:DOCX
- 页数:54
- 大小:1.62MB
数据结构c语言版课后习题答案完整版资料.docx
《数据结构c语言版课后习题答案完整版资料.docx》由会员分享,可在线阅读,更多相关《数据结构c语言版课后习题答案完整版资料.docx(54页珍藏版)》请在冰豆网上搜索。
数据结构c语言版课后习题答案完整版资料
第1章绪论
5.选择题:
CCBDCA
6.试分析下面各程序段的时间复杂度。
(1)O
(1)
(2)O(m*n)
(3)O(n2)
(4)O(log3n)
(5)因为x++共执行了n-1+n-2+⋯⋯+1=n(n-1)/2,所以执行时间为O(n2)
(6)O(n)
第2章线性表
1.选择题
babadbcabdcddac
2.算法设计题
(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。
ElemTypeMax(LinkListL){
if(L->next==NULL)returnNULL;
pmax=L->next;//假定第一个结点中数据具有最大值
p=L->next->next;
while(p!
=NULL){//如果下一个结点存在
if(p->data>pmax->data)pmax=p;
p=p->next;
}
returnpmax->data;
(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。
voidinverse(LinkList&L){
//逆置带头结点的单链表
L
p=L->next;L->next=NULL;
while(p){
q=p->next;//q
指向*p
的后继
p->next=L->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 {while(i =item)i++;∥若值不为item,左移指针。 if(i if(i } [算法讨论]因元素只扫描一趟,算法时间复杂度为O(n)。 删除元素未使用其它辅助 空间,最后线性表中的元素个数是j。 第3章栈和队列 1.选择题 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 Push(&s,t[i]); 将一半字符入栈 while(! EmptyStack(&s)) {//每弹出一个字符与相应字符比较 temp=Pop(&s); if(temp! =S[i]) return0;// 不等则返回 0 elsei++; } return1;//比较完毕均相等则返回1 } (7)假设以数组 Q[m]存放循环队列中的元素 同时设置一个标志 tag,以tag==0和 tag==1来区别在队头指针 (front)和队尾指针 (rear)相等时,队列状态为 “空”还是“满”。 试编 写与此结构相应的插入 (enqueue)和删除 (dlqueue)算法。 【解答】 循环队列类定义 #include template //循环队列的类定义 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: int rear,front, tag; //队尾指针、队头指针和队满标志 Type*Q; //存放队列元素的数组 intm;//队列最大可容纳元素个数 } 构造函数 template Queue : 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,表示队列不空 } 删除函数 template TypeQueue : DeQueue(){ assert(! IsEmpty());//判断队列是否不空,空则出错处理 front=(front+1)%m;//队头位置进1,队头指针指示实际队头的前一位置 tag=0;//标志改0,表示栈不满 returnQ[front];//返回原队头元素的值 } 读取队头元素函数 template TypeQueue : GetFront(){ assert(! IsEmpty());//判断队列是否不空,空则出错处理 returnQ[(front+1)%m];//返回队头元素的值 } 第4章串、数组和广义表 1.选择题 BBCABBBCBBABDCBC 2.综合应用题 (1)已知模式串t=‘abcaabbabcab’写出用KMP法求得的每个字符对应的next和 nextval函数值。 模式串t的next和nextval值如下: j 1 2 3 4 5 6 7 8 9 101112 t串 abcaabbab cab next[j] 0 1 1 1 2 2 3 1 2 3 4 5 nextval[j] 0 1 1 0 2 1 3 0 1 1 0 5 (3)数组A中,每个元素A[i,j]的长度均为32个二进位,行下标从-1到9,列下标从 1到11,从首地址S开始连续存放主存储器中,主存储器字长为 ①存放该数组所需多少单元? ②存放数组第4列所有元素至少需多少单元? ③数组按行存放时,元素A[7,4]的起始地址是多少? ④数组按列存放时,元素A[4,7]的起始地址是多少? 每个元素32个二进制位,主存字长16位,故每个元素占 到11。 (1)242 (2)22(3)s+182(4)s+142 16位。 求: 2个字长,行下标可平移至 1 (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]++;}//数字字符 elseif(‘A’<=ch<=‘Z’){i=ch-65+10;num[i]++;}//字母字符 for for (i=0;i<10;i++)//输出数字字符的个数 printf(“数字%d的个数=%d\n”,i,num[i]); (i=10;i<36;i++)//求出字母字符的个数 printf(“字母字符%c的个数=%d\n”,i+55,num[i] ); }//算法结束。 第5章树和二叉树 1.选择题 ADDCACCBDCCCACC 2.应用题 (2)设一棵二叉树的先序序列: ABDFCEGH,中序序列: BFDAGEHC①画出这棵二叉树。 ②画出这棵二叉树的后序线索树。 ③将这棵二叉树转换成对应的树(或森林)。 AC A A BMDEMH BC BC F G D E D E null F G H F G H (3) (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,2,6,32,3,21,10},按哈夫曼规则: 【[(2,3),6],(7,10)】,⋯⋯19,21,32 (100) (40) (60) 0 1 19 21 32 (28) 0 1 0 1 (17) (11) 19 21 32 01 7 10 6 (5) 0 1 2 3 10 7 106 1 0 2 3 方案比较: 字母 对应 出现 字母 对应 出现 编号 编码 频率 编号 编码 频率 1 1100 0.07 1 000 0.07 2 00 0.19 2 001 0.19 3 11110 0.02 3 010 0.02 4 1110 0.06 4 011 0.06 5 10 0.32 5 100 0.32 6 101 0.03 方 案 1 的 WPL = 2(0.19+0.32+0.21)+4(0.07+0.06+0.10)+5(0.02+0.03)=1.44+0.92+0.25=2.61 方案2的WPL=3(0.19+0.32+0.21+0.07+0.06+0.10+0.02+0.03)=3结论: 哈夫曼编码优于等长二进制编码 3.算法设计题 以二叉链表作为二叉树的存储结构,编写以下算法: (1)统计二叉树的叶结点个数。 intLeafNodeCount(BiTreeT) { if(T==NULL) return0;//如果是空树,则叶子结点个数为0 elseif(T->lchild==NULL&&T->rchild==NULL) return1;//判断该结点是否是叶子结点(左孩子右孩子都为空),若是则 返回1 else returnLeafNodeCount(T->lchild)+LeafNodeCount(T->rchild); } (3)交换二叉树每个结点的左孩子和右孩子。 voidChangeLR(BiTree&T) { BiTreetemp; if(T->lchild==NULL&&T->rchild==NULL) return; else { temp=T->lchild; T->lchild=T->rchild; T->rchild=temp; } ChangeLR(T->lchild); ChangeLR(T->rchild); } 第6章图 1.选择题 CBBBCBABAADCCDDB 2.应用题 (1)已知如图6.27所示的有向图,请给出: ①每个顶点的入度和出度; ②邻接矩阵; ③邻接表; ④逆邻接表。 (2)已知如图6.28所示的无向网,请给出: ①邻接矩阵; ②邻接表; ③最小生成树 图6.28无 4 3 4 5 5 9 3 5 5 5 5 5 7 6 5 4 9 7 3 6 3 2 5 2 6 5 4 6 a →b4 →c 3 b→a4→c5→d5 →e9 ^ c→a3→b5→d5 →h 5 ^ d→b5→c5→e 7 →f 6 →g5→h4^ e →b9→d7→f 3 ^ f →d6 →e 3 →g2 ^ g→d5 →f 2 →h6 ^ h→c5 →d4 →g6 ^ (3)已知图的邻接矩阵如 6.29所示。 试分别画出自顶点 1出发进行遍历所得的深度优 先生成树和广度优先生成树。 (4)有向网如图6.29所示,试用迪杰斯特拉算法求出从顶点a到其他各顶点间的最短 路径,完成表6.9。 图6.29邻接矩阵 D 终i=1i=2i=3i=4i=5i=6 点 b 15 15 15 15 15 15 (a,b) (a,b) (a,b) (a,b) (a,b) (a,b) c 2 (a,c) d 12 12 11 11 (a,d) (a,d) (a,c,f,d) (a,c,f,d) e ∞ 10 10 (a,c,e) (a,c,e) f ∞ 6 (a,c,f) g ∞ ∞ 16 16 14 (a,c,f,g) (a,c,f,g) (a,c,f,d,g) S 终 {a,c} {a,c,f} {a,c,f,e} {a,c,f,e,d} {a,c,f,e,d,g} {a,c,f,e,d,g,b} 点集 第7章查找 1.选择题 CDCABCCCDCBCADA 2.应用题 (1)假定对有序表: (3,4,5,7,24,30,42,54,63,72,87,95)进行折半查找,试回答下列问题: ①画出描述折半查找过程的判定树; ②若查找元素54,需依次与哪些元素比较? ③若查找元素90,需依次与哪些元素比较? ④假定每个元素的查找概率相等,求查找成功时的平均查找长度。 ①先画出判定树如下(注: mid=(1+12)/2=6): 30 5 63 37 42 87 424 5472 95 ②查找元素54,需依次与30,63,42,54元素比较; ③查找元素90,需依次与30,63,87,95元素比较; ④求ASL之前,需要统计每个元素的查找次数。 判定树的前 次;但最后一层未满,不能用8×4,只能用5×4=20次, 所以ASL=1/12(17+20)=37/12≈3.08 3层共查找 1+2×2+4×3=17 (2)在一棵空的二叉排序树中依次插入关键字序列为 12,7,17,11,16,2,13,9,21, 4,请画出所得到的二叉排序树。 12 7 17 2 11 16 21 4 9 13 验算方法: 用中序遍历应得到排序结果: 2,4,7,9,11,12,13,16,17,21 (5)设哈希表的地址范围为0~17,哈希函数为: H(key)=key%16。 用线性探测法处理冲突,输入关键字序列: (10,24,32,17,31,30,46,47,40,63,49),构造哈希表,试回答下列问题: ①画出哈希表的示意图; ②若查找关键字63,需要依次与哪些关键字进行比较? ③若查找关键字60,需要依次与哪些关键字比较? ④假定每个关键字的查找概率相等,求查找成功时的平均查找长度。 ①画表如下: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 32 17 63 49 24 40 10 30 31 46 47 ②查找63, 首先要与 H(63)=63%16=15号单元内容比较,即 63vs31,no; 然后顺移,与 46,47,32,17,63 相比,一共比较了 6次! ③查找 60,首先要与 H(60)=60%16=12 号单元内容比较,但因为 12号单元为空(应当有空标 记),所以应当只比较这一次即可。 ④对于黑色数据元素,各比较1次;共6次; 对红色元素则各不相同,要统计移位的位数。 “63”需要 6次,“49”需要 3次,“40”需要 2次,“46”需要3次,“47”需要3次, 所以ASL=1/1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言版 课后 习题 答案 完整版 资料
![提示](https://static.bdocx.com/images/bang_tan.gif)