数据结构习题答案作业.docx
- 文档编号:25778325
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:28
- 大小:319.28KB
数据结构习题答案作业.docx
《数据结构习题答案作业.docx》由会员分享,可在线阅读,更多相关《数据结构习题答案作业.docx(28页珍藏版)》请在冰豆网上搜索。
数据结构习题答案作业
第二章线性表
2.6
a.(4)
(1)
b.(7)(11)(8)(4)
(1)
c.(5)(12)
d.(11)(9)
(1)(6)或(11)(9)(6)
(1)
2.7
a.(11)(3)(4)
b.(10)(12)(8)(11)(3)(14)
c.(10)(12)(7)(3)(14)
d.(10)(12)(13)(14)
e.(9)(11)(3)(14)
2.9
(1)如果L的长度不小于2,则将首元结点删去并插入到表尾。
(2)voidBB():
用*s所指结点的值替换*q所指结点的值。
voidAA():
将*pa与*pb所指结点的值交换。
2.14
intLength(LinkListL)//求链表的长度
{
for(k=0,p=L;p->next;p=p->next,k++);
returnk;
}//Length
2.21
voidreverse(SqList&A)//顺序表的就地逆置
{
for(i=1,j=A.length;i A.elem[i]<->A.elem[j]; }//reverse 2.22 voidLinkList_reverse(Linklist&L)//链表的就地逆置;为简化算法,假设表长大于2 { p=L->next;q=p->next;s=q->next;p->next=NULL; while(s->next) { q->next=p;p=q; q=s;s=s->next;//把L的元素逐个插入新表表头 } q->next=p;s->next=q;L->next=s; }//LinkList_reverse 2.24 voidreverse_merge(LinkList&A,LinkList&B,LinkList&C)//把元素递增排列的链表A和B合并为C,且C中元素递减排列,使用原空间 { pa=A->next;pb=B->next;pre=NULL;//pa和pb分别指向A,B的当前元素 while(pa||pb) { if(pa->data pb) { pc=pa;q=pa->next;pa->next=pre;pa=q;//将A的元素插入新表 } else { pc=pb;q=pb->next;pb->next=pre;pb=q;//将B的元素插入新表 } pre=pc; } C=A;A->next=pc;//构造新表头 }//reverse_merge 第三章栈和队列 3.1 (1)123,132,213,231,321 (2)可以得到135426,不可能得到435612,因为’4356’出栈说明12已在栈中,则1不可能在2之前出栈。 3.3 输出结果: stack 3.4 (1)利用数组A[]将栈S中的所有值实现逆置。 (2)利用栈T辅助将栈S中所有值为e的数据元素删除之。 3.9 voiddigui(intj) { if(j>1) { printf(j); digui(j-1); } }//digui 3.10 voidtest(int&sum) { StackS; intx; scanf(x); InitStack(S); while(x) { Push(S,x); scanf(x); } sum=0; printf(sum); while(Pop(S,x)) { sum+=x; printf(sum); } } 3.24 Statusg(intm,intn,int&s)//求递归函数g的值s { if(m==0&&n>=0)s=0; elseif(m>0&&n>=0)s=n+g(m-1,2*n); elsereturnERROR; returnOK; }//g 第四章串 4.4 s=’THISSAMPLEIS’ t=’AGOOD’ v=’THISSAMPLEISAGOODONE’ StrLength(s)=14 Index(v,g)=3 Index(u,g)=0 4.5 t=’THESEAREBOOKS’ v=’YXY’ u=’XWXWXW’ 4.18 typedefstruct{ charch; intnum; }mytype; voidStrAnalyze(StringtypeS)//统计串S中字符的种类和个数 { mytypeT[MAXSIZE];//用结构数组T存储统计结果 for(i=1;i<=S[0];i++) { c=S[i];j=0; while(T[j].ch&&T[j].ch! =c)j++;//查找当前字符c是否已记录过 if(T[j].ch)T[j].num++; elseT[j]={c,1}; }//for for(j=0;T[j].ch;j++) printf("%c: %d\n",T[j].ch,T[j].num); }//StrAnalyze 4.20 intSubString_Delete(Stringtype&s,Stringtypet)//从串s中删除所有与t相同的子串,并返回删除次数 { for(n=0,i=1;i<=s[0]-t[0]+1;i++) { for(j=1;j<=t[0]&&s[i+j-1]==t[i];j++); if(j>m)//找到了与t匹配的子串 { for(k=i;k<=s[0]-t[0];k++) s[k]=s[k+t[0]];//左移删除 s[0]-=t[0];n++; } }//for returnn; }//Delete_SubString 第五章数组与广义表 5.1 (1)288 (2)1282 (3)1072 (4)1276 5.2 (1)100 (2)776 (3)1784 (4)4416 5.5 则得 5.10 (1)p (2)(k,p,h) (3)(a,b) (4)((c,d)) (5)(c,d) (6)(b) (7)b (8)(d) 5.16 记a+b为add(a,b),一种写法为 第六章树和二叉树 6.5 6.6 6.13 1 1 1 0 0 0 1 0 0 1 6.14 (a)空二叉树 只有一个结点的二叉树 只有右子树的单支二叉树 (b)空二叉树 只有一个结点的二叉树 只有左子树的单支二叉树 (c)空二叉树 只有一个结点的二叉树 6.19 6.21 6.28 6.41 intc,k;//这里把k和计数器c作为全局变量处理 voidGet_PreSeq(BitreeT)//求先序序列为k的结点的值 { if(T) { c++;//每访问一个子树的根都会使前序序号计数器加1 if(c==k) { printf("Valueis%d\n",T->data); exit (1); } else { Get_PreSeq(T->lchild);//在左子树中查找 Get_PreSeq(T->rchild);//在右子树中查找 } }//if }//Get_PreSeq main() { ... scanf("%d",&k); c=0;//在主函数中调用前,要给计数器赋初值0 Get_PreSeq(T,k); ... }//main 6.42 intLeafCount_BiTree(BitreeT)//求二叉树中叶子结点的数目 { if(! T)return0;//空树没有叶子 elseif(! T->lchild&&! T->rchild)return1;//叶子结点 elsereturnLeafCount_BiTree(T->lchild)+LeafCount_BiTree(T->rchild);//左子树的叶子数加上右子树的叶子数 }//LeafCount_BiTree 第七章图 7.1 (1)每个顶点的入/出度如下表所示: 顶点 1 2 3 4 5 6 入度 3 2 1 1 2 2 出度 0 2 2 3 1 3 (2)邻接矩阵 (3)邻接表 (4)逆邻接表 (5)有3个强连通分量 7.7 (1)邻接矩阵如下图所示: (2)邻接表如下所示: 最小生成树为: 7.9 全部可能的拓扑有序序列为: (1)5->6->1->2->3->4 (2)5->1->6->2->3->4 (3)5->1->2->6->3->4 (4)5->1->2->3->6->4 (5)1->5->6->2->3->4 (6)1->5->2->6->3->4 (7)1->5->2->6->3->4 其中,第一个序列为算法topsort所求得的序列。 7.11 从顶点a到其他各点的最短路径的求解过程如下: b c d e f g S {终点集} K=1 15 (a,b) 2 (a,c) 12 (a,d) {a,c} K=2 15 (a,b) 12 (a,d) 10 (a,c,e) 6 (a,c,f) {a,c,f} K=3 15 (a,b) 11 (a,c,f,d) 10 (a,c,e) 16 (a,c,f,g) {a,c,f,e} K=4 15 (a,b) 11 (a,c,f,d) 16 (a,c,f,g) {a,c,f,e,d} K=5 15 (a,b) 14 (a,c,f,d,g) {a,c,f,e,d,g} K=6 15 (a,b) {a,c,f,e,d,g,b} 7.23 intexist_path_BFS(ALGraphG,inti,intj)//广度优先判断有向图G中顶点i到顶点j是否有路径,是则返回1,否则返回0 { intvisited[MAXSIZE]; InitQueue(Q); EnQueue(Q,i); while(! QueueEmpty(Q)) { DeQueue(Q,u); visited[u]=1; for(p=G.vertices[i].firstarc;p;p=p->nextarc) { k=p->adjvex; if(k==j)return1; if(! visited[k])EnQueue(Q,k); }//for }//while return0; }//exist_path_BFS 第九章查找 9.2 (1)当key=e时查找过程如下: (2)当key=f时查找过程如下: (3)当key=g时查找过程如下: 9.3 等概率查找时查找成功的平均查找长度为: 9.9 (1)求得的二叉排序树如下图所示,在等概率情况下查找成功的平均查找长度为: (2) 经排序后的表及在折半查找时找到表中元素所经比较的次数如下表所示: Apr Aug Dec Feb Jan July June Mar May Nov Oct Sep 3 4 2 3 4 1 3 4 2 4 3 4 等概率情况下查找成功时的平均查找长度为: (3) 所求得的平衡二叉树为: 在等概率情况下的平均查找长度为: 9.21 (1) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Apr Aug Dec Feb Jan Mar May June July Sep Oct Nov (2) 9.25 intSearch_Sq(SSTableST,intkey)//在有序表上顺序查找的算法,监视哨设在高下标端 { ST.elem[ST.length+1].key=key; for(i=1;ST.elem[i].key>key;i++); if(i>ST.length||ST.elem[i].key returni; }//Search_Sq 分析: 本算法查找成功情况下的平均查找长度为ST.length/2,不成功情况下为ST.length. 9.26 intSearch_Bin_Recursive(SSTableST,intkey,intlow,inthigh)//折半查找的递归算法 { if(low>high)return0;//查找不到时返回0 mid=(low+high)/2; if(ST.elem[mid].key==key)returnmid; elseif(ST.elem[mid].key>key) returnSearch_Bin_Recursive(ST,key,low,mid-1); elsereturnSearch_Bin_Recursive(ST,key,mid+1,high); }//Search_Bin_Recursive 9.32 intlast=0; voidMaxLT_MinGT(BiTreeT,intx)//找到二叉排序树T中小于x的最大元素和大于x的最小元素 { if(T->lchild)MaxLT_MinGT(T->lchild,x);//本算法仍是借助中序遍历来实现 if(last printf("a=%d\n",last); if(last<=x&&T->data>x)//找到了大于x的最小元素 printf("b=%d\n",T->data); last=T->data; if(T->rchild)MaxLT_MinGT(T->rchild,x); }//MaxLT_MinGT 第十章排序 10.1 (1)直接插入排序: 初始 i=2 i=3 i=4 i=5 i=6 i=7 i=8 i=9 i=10 (2)希尔排序: 第一趟: 第二趟: 第三趟: (3)快速排序: 初始: 第一趟结束后: 第二趟结束后: 第三趟结束后: (4)堆排序: (5)归并排序 10.7 (1)在最好情况下需进行10次比较 在最好情况下,每一趟快速排序后均能划分出左、右两个相等的区间,即设线性表的长度n=2k-1,则第一趟快速排序后划分得到两个长度为n/2,的子表,第二快速排序后划分得到4个长度为n/4的子表,以此类推,总共需进行k=log2(n+1)遍划分,即子表长度为1时排序完毕。 因此,当n=7,k=3时,也即在最好情况下第一个元素由两头向中间扫描到正中位置,即需与其余6个元素都进行比较后找到其最终存储位置,因此需比较6次。 第二趟分别对左、右两个子表(长度均为3,即k=2)进行排序,与第一趟类似,需与子表中其余2个元素进行比较后找到其最终存储位置,也即两个子表共需比较4次,并且继续划分出的每个子表其长度均为1 ,即排序完毕,故总共需比较10次。 (2)每趟排序都应使第一个元素存储于表的正中位置,因此最好的初始排列的例子为: 4,7,5,6,3,1,2 10.12 (1)(3)是大顶堆,分别如下图所示: (2) (4) 10.26 voidBubble_Sort1(inta[],intn)//对包含n个元素的数组a进行改进的冒泡排序 { change=n-1;//change指示上一趟冒泡中最后发生交换的元素 while(change) { for(c=0,i=0;i if(a[i]>a[i+1]) { a[i]<->a[i+1]; c=i+1;//c指示这一趟冒泡中发生交换的元素 } change=c; }//while }//Bubble_Sort1 10.33 voidLinkedList_Select_Sort(LinkedList&L)//单链表上的简单选择排序算法 { for(p=L;p->next->next;p=p->next) { q=p->next;x=q->data; for(r=q,s=q;r->next;r=r->next)//在q后面寻找元素值最小的结点 if(r->next->data { x=r->next->data; s=r; } if(s! =q)//找到了值比q->data更小的最小结点s->next { p->next=s->next;s->next=q; t=q->next;q->next=p->next->next; p->next->next=t; }//交换q和s->next两个结点 }//for }//LinkedList_Select_Sort
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 习题 答案 作业