第2章 基本数据结构及算法习题参 考答案.docx
- 文档编号:4322435
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:18
- 大小:71.93KB
第2章 基本数据结构及算法习题参 考答案.docx
《第2章 基本数据结构及算法习题参 考答案.docx》由会员分享,可在线阅读,更多相关《第2章 基本数据结构及算法习题参 考答案.docx(18页珍藏版)》请在冰豆网上搜索。
第2章基本数据结构及算法习题参考答案
习题2参考答案
1.分别写出求两个正整数最大公约数的递推与递归算法。
参考答案:
intgcd(intx,inty)
{inta,b,t,r;
a=x;b=y;
if(a
{t=a;a=b;b=t;}
r=a%b;
while(r!
=0)
{a=b;b=r;r=a%b;}
return(b);
}
intgcd(intx,inty)
{inta,b,t,r;
a=x;b=y;
if(a
{t=a;a=b;b=t;}
if(a%b==0)returnb;
elsegcd(b,a%b);
}
2.编写将一个十进制整数转换成二进制数的递归算法。
参考答案:
voiddec_to_bin(intnum,intbase)//base为2
{
if(num>0)
{
dec_to_bin(num/base,base);
cout< } } 3.利用减半递推技术,写出求长度为n(n=2k)的一维数组中的最小元素的递归算法。 参考答案: intmin(intx,inty) { returnx>y? y: x; } intminnum(inta[],intn) { int*p,*q; q=&a[n/2]; p=a; if(n==1)returna[0]; elsereturnmin(minnum(p,n/2),minnum(q,n/2)); } 4.试写出将一个元素插入到有序线性表中的算法。 参考答案: intinsert(inta[],intb,intn,intm) {if(n==m)printf("overflow"); else {if(n==0)a[n]=b; else {i=n-1; while((i>=0)&&(a[i]>b)) {a[i+1]=a[i];i=i-1;} a[i+1]=b; } n=n+1; } returnn; } 5.编写一个算法,将两个线性表合并成一个有序表。 参考答案: voidmerge(inta[],intb[],intc[],intm,intn) {inti,j,k; i=j=k=0; while(i if(a[i]<=b[j]) c[k++]=a[i++]; elsec[k++]=b[j++]; while(i c[k++]=a[i++]; while(j c[k++]=b[j++]; } 6.设有两个有序线性单链表,头指针分别为ah与bh。 试写出将这两个有序线性单链表合并为一个头指针为ch的有序线性单链表的算法。 参考答案: structnode {intdata; structnode*next; }; node*merge(node*ah,node*bh) {node*pa,*pb,*pc,*ch,*q; pa=ah;pb=bh;ch=NULL; while(pa! =NULL&&pb! =NULL) {pc=newnode; if(pa->data<=pb->data) {pc->data=pa->data; pa=pa->next; } else {pc->data=pb->data; pb=pb->next; } if(ch==NULL) ch=pc; elseq->next=pc; q=pc; } if(pb==NULL) while(pa! =NULL) {pc=newnode; pc->data=pa->data; pa=pa->next; if(ch==NULL) ch=pc; elseq->next=pc; q=pc; } else while(pb! =NULL) {pc=newnode; pc->data=pb->data; pb=pb->next; if(ch==NULL) ch=pc; elseq->next=pc; q=pc; } q->next=NULL; return(ch); } 7.试写出逆转线性单链表的算法。 参考答案: structnode {chard; structnode*next }; invlst(structnode**head) {structnode*p,*q,*r; if(*head! =NULL) {p=*head;q=p->next; p->next=NULL; while(q! =NULL) {r=q->next;q->next=p; p=q;q=r; } *head=p; } } 8.写出计算线性链表长度的算法。 参考答案: structnode/*定义线性单链表结点类型*/ {ETd;/*定义线性单链表结点数据类型*/ structnode*next;/*结点指针*/ }; intlen(structnode*head) {intn; structnode*p; n=0; p=head; while(p! =NULL) {n++; p=p->next; } returnn; } 9.用筛选法求1000以内的素数。 用单链表存放2~1000的值,编写一个函数删除该单链表中非素数的结点(即剩下的结点中的值均为素数)。 #include structnode {intd; node*next; }; node*creat(void) {node*head,*p,*q; inti; head=NULL; q=NULL; for(i=2;i<1000;i++) { p=newnode; p->d=i; p->next=NULL; if(head==NULL) head=p; else q->next=p; q=p; } return(head); } node*delst(node*head) { node*p,*q,*r; p=head; r=p; while(p! =NULL) { q=p->next; while(q! =NULL) { if((q->d)%(p->d)==0) { r->next=q->next; deleteq; q=r->next; } else { r=q; q=q->next; } } p=p->next; } return(head); } voidprint(node*head) { node*p,*q; p=head; while(p! =NULL) { cout< q=p; p=p->next; deleteq; } cout< } voidmain() { node*head,*q; head=creat(); q=delst(head); print(head); } 10.对于下面的每一步,画出栈元素与栈顶指针的示意图: (1)栈空; (2)在栈中插入一个元素X; (3)在栈中插入一个元素Y; (4)删除栈顶元素; (5)在栈中插入一个元素Z; (6)在栈中插入一个元素W; (7)栈初始化。 top → Y top → X X top → 栈空 在栈中插入一个元素X 在栈中插入一个元素Y top → W top → Z Z top → X X X 删除栈顶元素 在栈中插入一个元素Z 在栈中插入一个元素W top →→ 栈初始化 11.设循环队列的容量为50(序号1~50),现经过一系列的进队与退队运算后,有: (1)front=15,rear=22。 (2)front=26,rear=12。 问在这两种情况下,循环队列中各有多少个元素? (1)7 (2)36 12.假设一个算术表达式中包含圆括号、方括号和花括号三种类型的括号,编写一个判别表达式中括号是否正确配对的算法。 参考答案: #defineM100 correct(charexp[],inttag) {charst[M]; inttop=0,i=1; tag=1; while(i<=M&&tag) {if(exp[i]=='('||exp[i]=='['||exp[i]=='{') {top++; st[top]=exp[i]; } if(exp[i]==')') if(st[top]=='(')top--; elsetag=0; if(exp[i]==']') if(st[top]=='[')top--; elsetag=0; if(exp[i]=='}') if(st[top]=='{')top--; elsetag=0; i++; } if(top>0)tag=0; } 13.现有如下的稀疏矩阵,要求写出其三元组表示。 参考答案: 14.现有一个稀疏矩阵的三元组表示如下,试写出其对应的稀疏矩阵。 参考答案: 15.编写一个算法,将给定的m×n稀疏矩阵转换成三元组表示。 参考答案: intchange(intm,intn,inta[][M],intb[][3]) {inti,j,k=1,t=0; for(i=0;i for(j=0;j if(a[i][j]! =0) {t=t+1; b[k][0]=i; b[k][1]=j; b[k++][2]=a[i][j]; } b[0][0]=m;b[0][1]=n;b[0][2]=t; returnk;//k为三列二维数组中的行数 } 16.设一棵完全二叉树具有500个结点。 问该完全二叉树有多少个叶子结点? 有多少个度为2的结点? 有多少个度为1的结点? 若完全二叉树有501个结点,再回答上述问题,并说明理由。 (1)叶子结点: 250 度为2的结点: 249 度为1的结点: 1 因为总的结点数是偶数,第一层为一个结点,中间各层均为偶数个结点,因此最后一层是奇数个结点,可知叶子结点只有1个。 由性质知,度为0的结点数比度为2的结点数多1,则可推导出上述结论。 (2)同理可得 叶子结点: 251 度为2的结点: 250 度为1的结点: 0 17.以先序遍历法访问某二叉树各结点的顺序是ABDHEICFJK,以中序遍历法访问该二叉树结点的顺序是DHBEIACJFK,要求: (1)请还原该二叉树; (2)写出后序遍历结果。 (1) (2)HDJEBJKFCA 18.以后序遍历法访问某二叉树各结点的顺序是FHIGDEBCA,以中序遍历法访问该二叉树结点的顺序是FDHGIBEAC,要求: (1)请还原该二叉树; (2)写出先序遍历结果。 (1) (2)ABDFGHIEC 19.依次输入元素序列{37,81,43,75,20,10,14,26},试构造一棵二叉查找树。 在这棵二叉查找树中查找33,需要比较多少次? 需要比较3次 20.写出构造二叉查找树的算法,如输入序列: 23,45,11,98,16,67,35,73,53,56,78,34,0,输入为0表示序列结束。 参考答案: btree*insertree(btree*t,intkey) {btree*p,*q; p=newbtree;//申请结点,并插入之 p->data=key; p->lchild=NULL; p->rchild=NULL; q=t; if(q==NULL)t=p;//二叉查找树为空 else//二叉查找树不空 while((q->lchild! =p)&&(q->rchild! =p))//未到叶子结点 if(q->data>key)//插入到左子树 {if(q->lchild! =NULL)q=q->lchild; elseq->lchild=p; } else//插入到右子树 {if(q->rchild! =NULL)q=q->rchild; elseq->rchild=p; } return(t);//插入成功返回t } voidmain() {intkey; btree*t=NULL; cin>>key; while(key! =0) { t=insertree(t,key); cin>>key; }; } 21.设有5个结点为K1,K2,K3,K4,K5,其权值分别为16,2,18,16,23。 请构造一棵Huffman树。 22.对下列有向图,求出每个顶点的度、入度和出度以及图的度,并给出其邻接矩阵及邻接表的表示。 解1: 顶点入度出度vi的度 1)303 2)213 3)224 4)134 5)134 6)112 图的度为4。 解2: 有向图1的邻接矩阵 000000 100000 100100 010011 111000 001000 第i行非零元素的个数为第i个顶点的出度, 第i列非零元素的个数为第i个顶点的入度。 解3: 邻接表 顶点vi的出度是第i个链表中的结点个数, 顶点vi的入度,是所有链表中其邻接点域的值为i的结点的个数。 23.对下列无向图,分别写出按深度优先搜索法和广度优先搜索法,从V1出发遍历图的结点序列(遍历时一般按照编号顺序安排邻接点的次序)。 解: 深度优先搜索法: v1-v2-v4-v3-v7-v6-v5 广度优先搜索法: v1-v2-v3-v4-v7-v5-v6 24.顺序查找法适合于存储结构为什么样的线性表? 顺序存储或链接存储 25.对线性表进行二分查找时,要求线性表具备什么条件? 以顺序方式存储,且结点按关键字有序排序 26.对有序表{1,3,9,12,32,41,45,62,75,77,82,95,100},用二分查找法查找值为82的结点时,要经过多少次比较后才能查找成功。 4 27.如果要求一个线性表既能较快地查找,又能适应动态变化的要求,可以采用什么查找方法? 分块 28.设有一组关键字{19,1,23,14,55,20,84,27,68,11,10,77}。 哈希函数为: H(key)=key%13,采用线性探测法解决冲突,试在0~18的哈希地址空间中对该关键字序列构造哈希表。 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 27 1 14 55 68 84 19 20 10 23 11 77 29.在待排序的元素序列基本有序的前提下,效率最高的排序方法是什么? 插入排序 30.序列{46,79,56,38,40,84},如果采用快速排序的方法,以第一个记录为基准得到的一次划分结果是什么? 40,38,46,56,79,84 31.用快速排序对线性表{25,84,21,47,15,27,68,35,20}进行排序。 (1)258421471527683520 (2)201521254727683584 (3)152021253527476884 (4)152021252735476884 32.已知序列{70,83,90,65,10,32,7,9},请给出采用插入排序法对该序列作升序排序时的每一趟结果。 [70]839065103279 [7083]9065103279 [708390]65103279 [65708390]103279 [1065708390]3279 [103265708390]79 [7103265708390]9 [79103265708390 33.已知序列{10,18,4,3,6,12,1,9,15,8},请给出采用归并排序法对该序列作升序排序时的每一趟结果。 10184361219158 [1018][34][612][19][815] [341018][16912][815] [341018][16891215] [13468910121518
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第2章 基本数据结构及算法习题参 考答案 基本 数据结构 算法 习题 答案
![提示](https://static.bdocx.com/images/bang_tan.gif)