当前位置:首页 > 耿国华数据结构习题答案完整
.
第一章答案
1.3计算下列程序中x=x+1的语句频度 for(i=1;i<=n;i++)
for(j=1;j<=i;j++) for(k=1;k<=j;k++) x=x+1;
【解答】x=x+1的语句频度为:
T(n)=1+(1+2)+(1+2+3)+……+(1+2+……+n)=n(n+1)(n+2)/6
2n
1. 4试编写算法,求pn(x)=a0+a1x+a2x+…….+anx的值pn(x0),并确定算法中每一语句的执
行次数和整个算法的时间复杂度,要求时间复杂度尽可能小,规定算法中不能使用求幂函数。注意:本题中的输入为ai(i=0,1,…n)、x和n,输出为Pn(x0)。 算法的输入和输出采用下列方法(1)通过参数表中的参数显式传递(2)通过全局变量隐式传递。讨论两种方法的优缺点,并在算法中以你认为较好的一种实现输入输出。 【解答】
(1)通过参数表中的参数显式传递
优点:当没有调用函数时,不占用内存,调用结束后形参被释放,实参维持,函数通
用性强,移置性强。
缺点:形参须与实参对应,且返回值数量有限。 (2)通过全局变量隐式传递
优点:减少实参与形参的个数,从而减少内存空间以及传递数据时的时间消耗 缺点:函数通用性降低,移植性差 算法如下:通过全局变量隐式传递参数 PolyValue() { int i,n;
float x,a[],p; printf(“\\nn=”); scanf(“%f”,&n); printf(“\\nx=”); scanf(“%f”,&x); for(i=0;i scanf(“%f ”,&a[i]); /*执行次数:n次 */ p=a[0]; for(i=1;i<=n;i++) { p=p+a[i]*x; /*执行次数:n次*/ x=x*x;} printf(“%f”,p); } 算法的时间复杂度:T(n)=O(n) 通过参数表中的参数显式传递 float PolyValue(float a[ ], float x, int n) { float p,s; int i; p=x; s=a[0]; for(i=1;i<=n;i++) {s=s+a[i]*p; /*执行次数:n次*/ p=p*x;} return(p); . . } 算法的时间复杂度:T(n)=O(n) 第二章答案 2.7试分别以不同的存储结构实现单线表的就地逆置算法,即在原表的存储空间将线性表(a1,a2,…,an)逆置为(an,an-1,…,a1)。 【解答】(1)用一维数组作为存储结构 void invert(SeqList *L, int *num) { int j; ElemType tmp; for(j=0;j<=(*num-1)/2;j++) { tmp=L[j]; L[j]=L[*num-j-1]; L[*num-j-1]=tmp;} } (2)用单链表作为存储结构 void invert(LinkList L) { Node *p, *q, *r; if(L->next ==NULL) return; /*链表为空*/ p=L->next; q=p->next; p->next=NULL; /* 摘下第一个结点,生成初始逆置表 */ while(q!=NULL) /* 从第二个结点起依次头插入当前逆置表 */ { r=q->next; q->next=L->next; L->next=q; q=r; } } 2.11将线性表A=(a1,a2,……am), B=(b1,b2,……bn)合并成线性表C, C=(a1,b1,……am,bm,bm+1,…….bn) 当m<=n时,或 C=(a1,b1, ……an,bn,an+1,……am)当m>n时,线性表A、B、C以单链表作为存储结构,且C表利用A表和B表中的结点空间构成。注意:单链表的长度值m和n均未显式存储。 【解答】算法如下: LinkList merge(LinkList A, LinkList B, LinkList C) { Node *pa, *qa, *pb, *qb, *p; pa=A->next; /*pa表示A的当前结点*/ pb=B->next; p=A; / *利用p来指向新连接的表的表尾,初始值指向表A的头结点*/ while(pa!=NULL && pb!=NULL) /*利用尾插法建立连接之后的链表*/ { qa=pa->next; qb=qb->next; p->next=pa; /*交替选择表A和表B中的结点连接到新链表中;*/ p=pa; . . p->next=pb; p=pb; pa=qa; pb=qb; } if(pa!=NULL) p->next=pa; /*A的长度大于B的长度*/ if(pb!=NULL) p->next=pb; /*B的长度大于A的长度*/ C=A; Return(C); } 第三章答案 3.1按3.1(b)所示铁道(两侧铁道均为单向行驶道)进行车厢调度,回答: (1) 如进站的车厢序列为123,则可能得到的出站车厢序列是什么? (2) 如进站的车厢序列为123456,能否得到435612和135426的出站序列,并说明 原因(即写出以“S”表示进栈、“X”表示出栈的栈序列操作)。 【解答】 (1)可能得到的出站车厢序列是:123、132、213、231、321。 (2)不能得到435612的出站序列。 因为有S(1)S(2)S(3)S(4)X(4)X(3)S(5)X(5)S(6)S(6),此时按照“后进先出”的原则,出栈的顺序必须为X(2)X(1)。 能得到135426的出站序列。 因为有S(1)X(1)S(2)S(3)X(3)S(4)S(5)X(5)X(4)X(2)X(1)。 3.3给出栈的两种存储结构形式名称,在这两种栈的存储结构中如何判别栈空与栈满? 【解答】(1)顺序栈 (top用来存放栈顶元素的下标) 判断栈S空:如果S->top==-1表示栈空。 判断栈S满:如果S->top==Stack_Size-1表示栈满。 (2) 链栈(top为栈顶指针,指向当前栈顶元素前面的头结点) 判断栈空:如果top->next==NULL表示栈空。 判断栈满:当系统没有可用空间时,申请不到空间存放要进栈的元素,此时栈满。 3. 4照四则运算加、减、乘、除和幂运算的优先惯例,画出对下列表达式求值时操作数栈 和运算符栈的变化过程:A-B*C/D+E↑F 【解答】 . . 3. 5写一个算法,判断依次读入的一个以@为结束符的字母序列,是否形如‘序列1&序列 2’的字符序列。序列1和序列2中都不含‘&’,且序列2是序列1 的逆序列。例如,’a+b&b+a’是属于该模式的字符序列,而’1+3&3-1’则不是。 【解答】算法如下: int IsHuiWen() { Stack *S; Char ch,temp; InitStack(&S); Printf(“\\n请输入字符序列:”); Ch=getchar(); While( ch!=&) /*序列1入栈*/ { Push(&S,ch); ch=getchar(); } do /*判断序列2是否是序列1的逆序列 */ { ch=getchar(); Pop(&S,&temp); if(ch!= temp) /*序列2不是序列1的逆序列*/ { return(FALSE); printf(“\\nNO”);} } while(ch!=@ && !IsEmpty(&S)) if(ch = = @ && IsEmpty(&S)) { return(TRUE); printf(“\\nYES”);} /*序列2是序列1的逆序列*/ else {return(FALSE); printf(“\\nNO”);} }/*IsHuiWen()*/ 3.8 要求循环队列不损失一个空间全部都能得到利用,设置一个标志tag,以tag为0或1来区分头尾指针相同时的队列状态的空与满,请编写与此相应的入队与出队算法。 .
共分享92篇相关文档