数据结构习题答案.doc





《数据结构习题答案.doc》由会员分享,可在线阅读,更多相关《数据结构习题答案.doc(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流数据结构习题答案.精品文档.计算机科学与工程学院二OO五年三月目 录第一章 绪论 3第二章线性表5第三章 栈和队列9第三章串10第五章 数组与广义表12第六章 树和二叉树14第七章 图 18第八章 查找 22第九章 内部排序24第一章 绪论1.2.3 综合题 14、设 n 为正整数。试确定下列各程序段中前置以记号的语句的频度:(1) i = 1; k = 0;While (i=n - 1) k + = 10 * I ; i +; 答:n-1(2) i = 1; k = 0;do k + = 10 * I ; i +; while (I = n
2、 - 1);答:n-1(3) i = 1; k = 0;While (i=n - 1) i +; k + = 10 * i ;答:n-1(4) k = 0;for ( i = 1;i=n ;i+) for ( j = i;j=n ;j+) k + +;答:(n+1)*n/2(5) for ( i = 1;i=n ;i+) for ( j = i;j=n ;j+) for ( k = 1;k=j ;k+) x + = delta;答:1/6*n*(n+1)*( n+2)(6) i=1;j=0;While (i+jj) j+; else i+;答:n(7) x= n; y= o;while (x=
3、(y+1) * (y + 1) y +;答: n (8) x= 91; y= 100;while (y0) if (x100)x-=10; y - -; else x + ;答:11001.2.3 综合题20、void print_descending(int x,int y,int z)/按从大到小顺序输出三个数 scanf(%d,%d,%d,&x,&y,&z); if(xy) xy; /为表示交换的双目运算符,以下同 if(yz) yz; if(xy) xy; /冒泡排序 printf(%d %d %d,x,y,z);/print_descending1.2.3 综合题22试编写算法,计算
4、 i !. 2i 的值并存入数组a0arrsize - 1 的第i- 1个分量中(I= 1,2,.,n)。假设计算机中允许的整数最大值为maxint, 则当narrsize 或对某个k(1kn)使 k!. 2k maxint 时,应按出错处理,注意选择你认为较好的出错处理方法。解:Status algo119(int aARRSIZE)/求i!*2i序列的值且不超过maxintlast=1;for(i=1;i=ARRSIZE;i+) ai-1=last*2*i; if(ai-1/last)!=(2*i) reurn OVERFLOW; last=ai-1; return OK;/algo119
5、分析:当某一项的结果超过了maxint时,它除以前面一项的商会发生异常.第二章 线性表作业:2.2.2 综合题3、编写一个函数将一个向量 A(有 n 个元素且任何元素均不为 0)分拆成两个向量,使 A 中大于 0 的元素存放在 B 中,小于 0 的元素存放在 C 中。解:本题的算法思想是:依次遍历 A 的元素,比较当前的元素值,大于 0 者赋给 B(假设有 p 个元素),小于 0 者赋给 C(假设有 q 个元素)。实现本题功能的函数如下: void ret(vector A,int n,vector B,int *p,vector C,int *q) int i; *p=0;*q=0; for
6、 (i=0;i0) (*p)+; B*p=Ai; if (Ai0) (*q)+; C*q=Ai;2.2.2 综合题5、编写一个函数从一给定的向量 A 中删除元素值在 x 到 y(xy)之间的所有元素,要求以较高的效率来实现。解:本题的算法思想是:从 0 开始扫描向量 A,以 k 记录下元素值在 x 到 y 之间的元素个数,对于不满足该条件的元素,前移 k 个位置。 最后返回向量的新长度,这种算法比每删除一个元素后立即移动其后元素效率要高一些。实现本题功能的过程如下: int del(A,n,x,y) vector A;int n;ElemType x,y; int i=0,k=0; while
7、 (i=x & Ai=y) k+; else Ai-k = Ai; /* 前移 k 个位置 */ i+; return(n-k); 2.2.2 综合题8、有两个向量 A(有 m 个元素)和 B(有 n 个元素),其元素均以从小到大的升序排列,编写一个函数将它们合并成一个向量 C,要求 C 的元素也是以从小到大的升序排列。解:本题的算法思想是:依次扫描通过 A 和 B 的元素,比较当前的元素的值,将较小值的元素赋给 C,如此直到一个向量扫描完毕,然后将未完的一个向量的余下所有元素赋给 C 即可。实现本题功能的函数如下: int link(vector a,int m,vector b,int n
8、,vector c) int i=0,j=0,l,k=0; while(im & jn) /* 扫描通过 a 和 b,将当前较小者赋给 c */ if(aibj) ck+=bj+; else /* 相等者只保存一个 */ ck+=bj+; i+; if(i=m) /* b 未完时,当余下的元素赋给 c*/ for(l=j;ln;l+) ck+=bl; if(j=n) /* a 未完时,当余下的元素赋给 c */ for(l=i;idata=x) n+; p=p-next; return(n); 2.2.2 综合题11、有一个单链表 L(至少有 1 个结点),其头结点指针为 head,编写一个函
9、数将 L逆置,即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。 解:本题采用的算法是:从头到尾扫描单链表 L,将第一个结点的 next 域置为 NULL,将第二个结点的 next 域指向第一个结点,将第三个结点的 next 域指向第二个结点,如此等等,直到最后一个结点,便用 head 指向它,这样达到了本题的要求。实现本题功能的函数如下: void invert(head) node *head;node *p,*q,*r; p=head; q=p-next; while (q!=NULL) /*当 L 没有后续结点时终止*/ r=q-next; q-next=p;
10、p=q; q=r; head-next=NULL; head=p; /*p 指向 L 的最后一个结点,现改为头结点*/ 2.2.2 综合题16、有一个有序单链表(从小到大排列),表头指针为 head,编写一个函数向该单链表中插入一个元素为 x 的结点,使插入后该链表仍然有序。 解:本题算法的思想是先建立一个待插入的结点,然后依次与链表中的各结点的数据域比较大小,找到插入该结点的位置,最后插入该结点。实现本题功能的函数如下: node *insertorder(head,x) node *head; ElemType x; node *s,*p,*q; s=(node *)malloc(size
11、of(node); /*建立一个待插入的结点*/ s-data=x; s-next=NULL; if (head=NULL | xdata) /*若单链表为空或 x 小于第一个结点的 date 域*/ s-next=head; /*则把 s 结点插入到表头后面*/ head=s; else q=head; /*为 s 结点寻找插入位置,p 指向待比较的结点,q 指向 p 的前驱结点*/ p=q-next; while (p!=NULL & xp-data) /*若 x 小于 p 所指结点的 data 域值*/ if (xp-data) /*则退出 while 循环*/ q=p; p=p-nex
12、t; s-next=p; /*将 s 结点插入到 q 和 p 之间*/ q-next=s; return(head); 2.2.2 综合题23、假设在长度大于 1 的循环单链表中,既无头结点也无头指针,p 为指向该链表中某个结点的指针,编写一个函数删除该结点的前驱结点。 解:本题利用循环单链表的特点,通过 p 指针可循环找到其前驱结点 q 及 q 的前驱结点 r,然后将其删除。实现本题功能的函数如下: node *del(p)node *p;node *q,*r; q=p; /*查找 p 结点的前驱结点,用 q 指针指向 */ while (q-next!=p) q=q-next; r=q;
13、/*查找 q 结点的前驱结点,用 r 指针指向 */ while (r-next!=q) r=r-next; r-next=p; /*删除 q 所指的结点 */ free(q); return(p); 2.2.2 综合题41试写一算法在带头结点的单链表结构上的实现线性表操作LOCATE(L,X)。LNode* Locate(LinkList L,int x)/链表上的元素查找,返回指针for(p=l-next;p&p-data!=x;p=p-next);return p;/Locate第三章 栈和队列3.2.2 综合习题13、如果用一个循环数组 qu0,m0-1表示队列时,该队列只有一个头指针
14、 front,不设队尾指针 rear,而改置计数器 count 用以记录队列中结点的个数。 (1)编写实现队列的五个基本运算; (2)队列中能容纳元素的最多个数还是 m0-1 吗? 解: (1)依题意,有如下条件: 队列为空:count=0,front=1 队列为满:count=m0 队列尾的第一个元素位置=(front+count) % m0 队列首的第一个元素位置=(front+1) % m0 队列类型定义如下: typedef int qum0; 由此得到如下对应上述基本运算的 5 个函数如下: /* m0 定义为全局变量 */ void makenull(front,count) /*
15、使队列 q 为空*/ int front,count; front=1; count=0; int empty(count) /*判定队列 q 是否为空*/ int count; if (count=0) return(1); else return(0); void pop(q,front,count,x) /*取队列头元素给 x*/ qu q;int front,count; ElemType *x; if (count=0) printf(队列下溢出n); else front=(front+1) % m0; *x=qfront; void enqueue(q,x,front,count
16、) /*将元素 x 入队列*/ qu q; int front,count; ElemType x; int place; if (count=m0) printf(队列上溢出n); else count+; e=(front+count) % m0; qplace=x; void dequeue(q,front,count) /*删除队列头元素*/ qu q; int front,count; if (count=0) printf(队列下溢出n); else front=(front+1) % m0; count-; (2)队列中可容纳的最多元素个数为 m0 个。3.2.2 综合习题31假
17、设称正读和反读都相同的字符序列为“回文”,例如,abba和abcba是回文,bcde和ababa则不是回文,试写一个算法判别读入的一个以为结束符的字符序列是否是“回文”。int Palindrome_Test()/判别输入的字符串是否回文序列,是则返回1,否则返回0InitStack(S);InitQueue(Q);while(c=getchar()!=)Push(S,c);EnQueue(Q,c); /同时使用栈和队列两种结构while(!StackEmpty(S)Pop(S,a);DeQueue(Q,b);if(a!=b) return ERROR;return OK;/Palindrom
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 习题 答案

限制150内