数据结构习题标准答案
- 格式:doc
- 大小:828.00 KB
- 文档页数:27
数据结构习题标准答案————————————————————————————————作者:————————————————————————————————日期:计算机科学与工程学院二OO五年三月目录第一章绪论 (5)第二章线性表 (7)第三章栈和队列 (11)第三章串 (12)第五章数组与广义表 (14)第六章树和二叉树 (16)第七章图 (20)第八章查找 (24)第九章内部排序 (26)第一章绪论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 - 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+j<= n){@ if (i>j) j++;else i++;}答:n(7)x= n; y= o;while (x>=(y+1) * (y + 1)){@ y ++;}答:⎣√ n ⎦(8)x= 91; y= 100;while (y>0){@ if (x>100){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(x<y) x<->y; //<->为表示交换的双目运算符,以下同if(y<z) y<->z;if(x<y) x<->y; //冒泡排序printf("%d %d %d",x,y,z);}//print_descending1.2.3 综合题22试编写算法,计算i !. 2i的值并存入数组a[0…arrsize - 1] 的第i- 1个分量中(I= 1,2,….,n)。
假设计算机中允许的整数最大值为maxint, 则当n>arrsize 或对某个k(1≤k≤n)使k!. 2k>maxint 时,应按出错处理,注意选择你认为较好的出错处理方法。
解:Status algo119(int a[ARRSIZE])//求i!*2^i序列的值且不超过maxint{last=1;for(i=1;i<=ARRSIZE;i++){a[i-1]=last*2*i;if((a[i-1]/last)!=(2*i)) reurn OVERFLOW;last=a[i-1];return OK;}}//algo119分析:当某一项的结果超过了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 (i=0;i<=n-1;i++){ if (A[i]>0){ (*p)++;B[*p]=A[i];}if (A[i]<0){ (*q)++;C[*q]=A[i];}}}2.2.2综合题5、编写一个函数从一给定的向量 A 中删除元素值在 x 到 y(x≤y)之间的所有元素,要求以较高的效率来实现。
解:本题的算法思想是:从 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 (i<n){ if (A[i]>=x && A[i]<=y) k++;else A[i-k] = A[i]; /* 前移 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,vector c){ int i=0,j=0,l,k=0;while(i<m && j<n) /* 扫描通过 a 和 b,将当前较小者赋给 c */{ if(a[i]<b[j]) c[k++]=a[i++];else if(a[i]>b[j]) c[k++]=b[j++];else{ /* 相等者只保存一个 */c[k++]=b[j++];i++;}}if(i==m) /* b 未完时,当余下的元素赋给 c*/for(l=j;l<n;l++)c[k++]=b[l];if(j==n) /* a 未完时,当余下的元素赋给 c */ for(l=i;i<m;l++)c[k++]=a[l];return k; /* 返回 c 的长度 */}2.2.2综合题9、有一个单链表(不同结点的数据域值可能相同),其头指针为 head,编写一个函数计算数据域为 x 的结点个数。
解:本题是遍历通过该链表的每个结点,每遇到一个结点,结点个数加 1,结点个数存储在变量 n 中。
实现本题功能的函数如下:int count(head,x)node *head;ElemType x;{node *p;int n=0;p=head;while (p!=NULL){if (p->data==x) n++;p=p->next;}return(n);}2.2.2综合题11、有一个单链表 L(至少有 1 个结点),其头结点指针为 head,编写一个函数将 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;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(sizeof(node)); /*建立一个待插入的结点*/s->data=x;s->next=NULL;if (head==NULL || x<head->data) /*若单链表为空或 x 小于第一个结点的date 域*/{s->next=head; /*则把 s 结点插入到表头后面*/head=s;}else{ q=head; /*为 s 结点寻找插入位置,p 指向待比较的结点,q 指向 p 的前驱结点*/p=q->next;while (p!=NULL && x>p->data) /*若 x 小于 p 所指结点的 data 域值*/if (x>p->data) /*则退出 while 循环*/ {q=p;p=p->next;}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; /*查找 q 结点的前驱结点,用 r 指针指向 */while (r->next!=q) r=r->next;r->next=p; /*删除 q 所指的结点 */free(q);return(p);}2.2.2综合题41试写一算法在带头结点的单链表结构上的实现线性表操作LOCATE(L,X)。