耿国华数据结构习题答案完整版
《数据结构——C语言描述》习题及答案 耿国华
第1章绪论之杨若古兰创作习题一、问答题1. 什么是数据结构?2. 四类基本数据结构的名称与含义.3. 算法的定义与特性.4. 算法的时间复杂度.5. 数据类型的概念.6. 线性结构与非线性结构的不同.7. 面向对象程序设计说话的特点.8. 在面向对象程序设计中,类的感化是什么?9. 参数传递的次要方式及特点.10. 抽象数据类型的概念.二、判断题1. 线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放.2. 算法就是程序.3. 在高级说话(如C、或 PASCAL)中,指针类型是原子类型.三、计算以下程序段中X=X+1的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;[提示]:i=1时: 1 = (1+1)×1/2 = (1+12)/2i=2时: 1+2= (1+2)×2/2 = (2+22)/2i=3时: 1+2+3= (1+3)×3/2 = (3+32)/2…i=n时:1+2+3+……+n= (1+n)×n/2 = (n+n2)/2f(n) = [ (1+2+3+……+n) + (12 + 22 + 32 + …… + n2 ) ] / 2=[ (1+n)n/2 + n(n+1)(2n+1)/6 ] / 2=n(n+1)(n+2)/6=n3/6+n2/2+n/3区分语句频度和算法复杂度:四、试编写算法求一元多项式Pn(x)=a0+a1x+a2x2+a3x3+…a n x n的值P n(x0),并确定算法中的每一语句的履行次数和全部算法的时间复杂度,请求时间复杂度尽可能的小,规定算法中不克不及使用求幂函数.留意:本题中的输入a i(i=0,1,…,n), x和n,输出为P n(x0).通常算法的输入和输出可采取以下两种方式之一:(1)通过参数表中的参数显式传递;(2)通过全局变量隐式传递.试讨论这两种方法的优缺点,并在本题算法中以你认为较好的一种方式实现输入和输出.[提示]:float PolyValue(float a[ ], float x, int n) {……}核心语句:p=1; (x的零次幂)s=0;i从0到n轮回s=s+a[i]*p;p=p*x;或:p=x; (x的一次幂)s=a[0];i从1到n轮回s=s+a[i]*p;p=p*x;实习题设计实现抽象数据类型“有理数”.基本操纵包含有理数的加法、减法、乘法、除法,和求有理数的分子、分母.第一章答案计算以下程序中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)/61.4试编写算法,求p n(x)=a0+a1x+a2x2+…….+a n x n的值p n(x0),并确定算法可能小,规定算法中不克不及使用求幂函数.留意:本题中的输入为a i(i=0,1,…n)、x和n,输出为P n(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<n;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次*/return(p);}算法的时间复杂度:T(n)=O(n)第2章线性表习题2.1 描述以下三个概念的区别:头指针,头结点,首元素结点.2.2 填空:(1)在顺序表中拔出或删除一个元素,须要平均挪动__一半__元素,具体挪动的元素个数与__拔出或删除的地位__有关.(2)在顺序表中,逻辑上相邻的元素,其物理地位______相邻.在单链表中,逻辑上相邻的元素,其物理地位______相邻.(3)在带头结点的非空单链表中,头结点的存储地位由______唆使,首元素结点的存储地位由______唆使,除首元素结点外,其它任一元素结点的存储地位由__其直接前趋的next域__唆使.2.3 已知L是无表头结点的单链表,且P结点既不是首元素结点,也不是尾元素结点.按请求从以下语句当选择合适的语句序列.a. 在P结点后拔出S结点的语句序列是:_(4)、(1)_.b. 在P结点前拔出S结点的语句序列是:(7)、(11)、(8)、(4)、(1).c. 在表首拔出S结点的语句序列是:(5)、(12).d. 在表尾拔出S结点的语句序列是:(11)、(9)、(1)、(6).供选择的语句有:(1)P->next=S;(2)P->next= P->next->next;(3)P->next= S->next;(4)S->next= P->next;(5)S->next= L;(6)S->next= NULL;(7)Q= P;(8)while(P->next!=Q) P=P->next;(9)while(P->next!=NULL) P=P->next;(10)P= Q;(12)L= S;(13)L= P;2.4 已知线性表L递增有序.试写一算法,将X拔出到L的适当地位上,以坚持线性表L的有序性.[提示]:void insert(SeqList *L; ElemType x)< 方法1 >(1)找出应拔出地位i,(2)移位,(3)……< 方法2 > 参P. 2292.5 写一算法,从顺序表中删除自第i个元素开始的k个元素.[提示]:留意检查i和k的合法性.(集体搬家,“新居”、“旧房”)< 方法1 > 以待挪动元素下标m(“旧房号”)为中间,计算应移入地位(“新居号”):for ( m= i-1+k; m<= L->last; m++)L->elem[ m-k ] = L->elem[ m ];< 方法2 > 同时以待挪动元素下标m和应移入地位j为中间:< 方法3 > 以应移入地位j为中间,计算待挪动元素下标:已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构.试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在如许的元素),分析你的算法的时间复杂度(留意:mink和maxk是给定的两个参变量,它们的值为任意的整数).[提示]:留意检查mink和maxk的合法性:mink < maxk不要一个一个的删除(多次点窜next域).(1)找到第一个应删结点的前驱prepre=L; p=L->next;while (p!=NULL && p->data <= mink){ pre=p; p=p->next; }(2)找到最初一个应删结点的后继s,边找边释放应删结点s=p;while (s!=NULL && s->data < maxk){ t =s; s=s->next; free(t); }(3)pre->next = s;试分别以分歧的存储结构实现线性表的就地逆置算法,即在原表的存储空间将线性表(a1, a2..., a n)逆置为(a n, a n-1,..., a1).(1)以一维数组作存储结构,设线性表存于a(1:arrsize)的前elenum个分量中.(2)以单链表作存储结构.[方法1]:在原头结点后从头头插一遍[方法2]:可设三个同步挪动的指针p, q, r,将q的后继r改为p 2.8 假设两个按元素值递增有序排列的线性表A和B,均以单链表作为的排列的线性表C,并请求利用原表(即A表和B表的)结点空间存放表C.[提示]:参P.28 例2-1< 方法1 >void merge(LinkList A; LinkList B; LinkList *C){ ……pa=A->next; pb=B->next;*C=A; (*C)->next=NULL;while ( pa!=NULL && pb!=NULL ){if ( pa->data <= pb->data ){smaller=pa; pa=pa->next;smaller->next = (*C)->next; /* 头插法 */(*C)->next = smaller;}else{smaller=pb; pb=pb->next;smaller->next = (*C)->next;(*C)->next = smaller;}}while ( pa!=NULL){smaller=pa; pa=pa->next;smaller->next = (*C)->next;(*C)->next = smaller;}while ( pb!=NULL){smaller=pb; pb=pb->next;smaller->next = (*C)->next;(*C)->next = smaller;}< 方法2 >LinkList merge(LinkList A; LinkList B){ ……LinkList C;C=A; C->next=NULL;…………return C;2.9 假设有一个轮回链表的长度大于1,且表中既无头结点也无头指针.已知s为指向链表某个结点的指针,试编写算法在链表中删除指针s所指结点的前趋结点.[提示]:设指针p指向s结点的前趋的前趋,则p与s有何关系?2.10 已知有单链表暗示的线性表中含有三类字符的数据元素(如字母字符、数字字符和其它字符),试编写算法来构造三个以轮回链表暗示的线性表,使每个表中只含同一类的字符,且利用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间.2.11 设线性表A=(a1, a2,…,a m),B=(b1, b2,…,b n),试写一个按以下规则合并A、B为线性表C的算法,使得:C= (a1, b1,…,a m, b m, b m+1,…,b n)当m≤n时;或者 C= (a1, b1,…,a n, b n, a n+1,…,a m) 当m>n时.线性表A、B、C均以单链表作为存储结构,且C表利用A表和B 表中的结点空间构成.留意:单链表的长度值m和n均未显式存储.[提示]:void merge(LinkList A; LinkList B; LinkList *C)或:LinkList merge(LinkList A; LinkList B)2.12 将一个用轮回链表暗示的稀少多项式分解成两个多项式,使这两个多项式中各自仅含奇次项或偶次项,并请求利用原链表中的结点空间来构成这两个链表.[提示]:注明用头指针还是尾指针.2.13 建立一个带头结点的线性链表,用以存放输入的二进制数,链表中每个结点的data域存放一个二进制位.并在此链表上实现对二进制数加1的运算.[提示]:可将低位放在前面.2.14 设多项式P(x)采取课本中所述链接方法存储.写一算法,对给定的x 值,求P(x)的值.[提示]:float PolyValue(Polylist p; float x) {……}实习题1.将若干城市的信息存入一个带头结点的单链表,结点中的城市信息包含城市名、城市的地位坐标.请求:(1)给定一个城市名,返回其地位坐标;(2)给定一个地位坐标P和一个距离D,返回所有与P的距离小于等于D的城市.约瑟夫成绩的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数).一开始任选一个整数作为报数上限值m,从第一个人开始顺时针自1开始顺序报数,报到m 时停止报数.报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始从头从1报数,如此下去,直至所有的人全部出列为止.试设计一个程序,求出出列顺序.利用单向轮回链表作为存储结构模拟此过程,按照出列顺序打印出各人的编号.例如m的初值为20;n=7,7个人的密码顺次是:3,1,7,2,4,8,4,出列的顺序为6,1,4,7,2,3,5.第二章答案实习题二:约瑟夫环成绩约瑟夫成绩的一种描述为:编号1,2,…,n的n个人按顺时针方向围坐一圈,每个人持有一个密码(正整数).一开始任选一个报数上限值m,从第一个人开始顺时针自1开始顺序报数,报到m时停止报数.报m 的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始从头从1报数,如此下去,直至所有的人全部出列为止.试设计一个程序,求出出列顺序.利用单向轮回链表作为存储结构模拟此过程,按照出列顺序打印出各人的编号.例如,m的初值为20;n=7,7个人的密码顺次是:3,1,7,2,4,8,4,出列顺序为6,1,4,7,2,3,5.【解答】算法如下:typedef struct Node{int password;int num;struct Node *next;} Node,*Linklist;void Josephus(){Linklist L;Node *p,*r,*q;int m,n,C,j;L=(Node*)malloc(sizeof(Node)); /*初始化单向轮回链表*/if(L==NULL) { printf("\n链表申请不到空间!");return;}L->next=NULL;r=L;scanf("%d",&n);for(j=1;j<=n;j++) /*建立链表*/{p=(Node*)malloc(sizeof(Node));if(p!=NULL){printf("请输入第%d个人的密码:",j);scanf("%d",&C);p->password=C;p->num=j;r->next=p;r=p;}}r->next=L->next;printf("请输入第一个报数上限值m(m>0):");scanf("%d",&m);printf("*****************************************\n"); printf("出列的顺序为:\n");q=L;p=L->next;while(n!=1) /*计算出列的顺序*/{j=1;while(j<m) /*计算当前出列的人选p*/ {q=p; /*q为当前结点p的前驱结点*/ p=p->next;j++;}printf("%d->",p->num);m=p->password; /*获得新密码*/n--;q->next=p->next; /*p出列*/r=p;p=p->next;free(r);}printf("%d\n",p->num);试分别以分歧的存储结构实现单线表的就地逆置算法,即在原表的存储空间将线性表(a1,a2,…,a n)逆置为(a n,a n-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;}}将线性表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)所示铁道(两侧铁道均为单向行驶道)进行车厢调度,回答:⑴如进站的车厢序列为123,则可能得到的出站车厢序列是什么?123、213、132、231、321(312)⑵如进站的车厢序列为123456,能否得到435612和135426的出站序列,并说明缘由.(即写出以“S”暗示进栈、以“X”暗示出栈的栈操纵序列).SXSS XSSX XXSX 或 S1X1S2S3X3S4S5X5X4X2S6X62. 设队列中有A、B、C、D、E这5个元素,其中队首元素为A.如果对这个队列反复履行以下4步操纵:(1)输出队首元素;(2)把队首元素值拔出到队尾;(3)删除队首元素;(4)再次删除队首元素.直到队列成为空队列为止,则是否可能得到输出序列:(1)A、C、E、C、C (2) A、C、E(3) A、C、E、C、C、C (4) A、C、E、C[提示]:A、B、C、D、E (输出队首元素A)A、B、C、D、E、A (把队首元素A拔出到队尾)B、C、D、E、A (删除队首元素A)C、D、E、A (再次删除队首元素B)C、D、E、A (输出队首元素C)C、D、E、A、C (把队首元素C拔出到队尾)D、E、A、C (删除队首元素C)E、A、C (再次删除队首元素D)3. 给出栈的两种存储结构方式名称,在这两种栈的存储结构中如何判别栈空与栈满?4. 按照四则运算加、减、乘、除和幂运算(↑)优先关系的惯例,画出对以下算术表达式求值时操纵数栈和运算符栈的变更过程:A-B*C/D+E↑F5. 试写一个算法,判断顺次读入的一个以@为结束符的字母序列,是否为形如‘序列1& 序列2’模式的字符序列.其中序列1和序列2中都不含字符’&’,且序列2是序列1的逆序列.例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是.[提示]:(1)边读边入栈,直到&(2)边读边出栈边比较,直到……6. 假设表达式由单字母变量和双目四则运算算符构成.试写一个算法,将一个通常书写方式(中缀)且书写准确的表达式转换为逆波兰式(后缀).[提示]:例:中缀表达式:a+b后缀表达式: ab+中缀表达式:a+b×c后缀表达式: abc×+中缀表达式:a+b×c-d后缀表达式: abc×+d-中缀表达式:a+b×c-d/e后缀表达式: abc×+de/-中缀表达式:a+b×(c-d)-e/f后缀表达式: abcd-×+ef/-•后缀表达式的计算过程:(简便)顺序扫描表达式,(1)如果是操纵数,直接入栈;(2)如果是操纵符op,则连续退栈两次,得操纵数X, Y,计算X op Y,并将结果入栈.•如何将中缀表达式转换为后缀表达式?顺序扫描中缀表达式,(1)如果是操纵数,直接输出;(2)如果是操纵符op2,则与栈顶操纵符op1比较:如果op2 > op1,则op2入栈;如果op2 = op1,则脱括号;如果op2 < op1,则输出op1;7. 假设以带头结点的轮回链表暗示队列,而且只设一个指针指向队尾元素结点(留意不设头指针),试编写响应的队列初始化、入队列和出队列的算法.[提示]:参P.56 P.70 先画图.typedef LinkListCLQueue;int InitQueue(CLQueue * Q)int EnterQueue(CLQueue Q, QueueElementType x)int DeleteQueue(CLQueue Q, QueueElementType *x)8. 请求轮回队列不损失一个空间全部都能得到利用, 设置一个标记域tag , 以tag为0或1来区分头尾指针不异时的队列形态的空与满,请编写与此结构响应的入队与出队算法.[提示]:初始形态:front==0, rear==0, tag==0队空条件:front==rear, tag==0队满条件:front==rear, tag==1其它形态:front !=rear, tag==0(或1、2)入队操纵:……(入队)if (front==rear) tag=1;(或直接tag=1)出队操纵:……(出队)tag=0;[成绩]:如何明确区分队空、队满、非空非满三种情况?9. 简述以下算法的功能(其中栈和队列的元素类型均为int):(1)void proc_1(Stack S){ iint i, n, A[255];n=0;while(!EmptyStack(S)){n++;Pop(&S, &A[n]);}for(i=1; i<=n; i++)Push(&S, A[i]);}将栈S逆序.(2)void proc_2(Stack S, int e){Stack T; int d;InitStack(&T);while(!EmptyStack(S)){Pop(&S, &d);if (d!=e) Push( &T, d);}while(!EmptyStack(T)){Pop(&T, &d);Push( &S, d);}}删除栈S中所有等于e的元素.(3)void proc_3(Queue *Q){Stack S; int d;InitStack(&S);while(!EmptyQueue(*Q)){DeleteQueue(Q, &d);Push( &S, d);}while(!EmptyStack(S)){Pop(&S, &d);EnterQueue(Q,d)}}将队列Q逆序.实习题1.回文判断.称正读与反读都不异的字符序列为“回文”序列.试写一个算法,判断顺次读入的一个以@为结束符的字母序列,是否为形如‘序列1&序列2’模式的字符序列.其中序列1和序列2中都不含字符‘&’,且序列2是序列1的逆序列.例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是.2.停车场管理.设停车场是一个可停放n辆车的狭长通道,且只要一个大门可供汽车进出.在停车场内,汽车按到达的前后次序,由北向南顺次排列(假设大门在最南端).若车场内已停满n辆车,则后来的汽车需在门外的便道上等候,当有车开走时,便道上的第一辆车即可开入.当停车场内某辆车要离开时,在它以后进入的车辆必须先退出车场为它让路,待该辆车开出大门后,其它车辆再按原次序返回车场.每辆车离开停车场时,应按其停留时间的是非交费(在便道上停留的时间不收费).试编写程序,模拟上述管理过程.请求以顺序栈模拟停车场,以链队列模拟便道.从终端读入汽车到达或离去的数据,每组数据包含三项:①是“到达”还是“离去”;②汽车牌照号码;③“到达”或“离去”的时刻.与每组输入信息响应的输出信息为:如果是到达的车辆,则输出其在停车场中或便道上的地位;如果是离去的车辆,则输出其在停车场中停留的时间和应交的费用.(提示:需另设一个栈,临时停放为让路而从车场退出的车.)Array3.商品货架管理.的生产日期比来.较下的地位..按(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).给出栈的两种存储结构方式名称,在这两种栈的存储结构中如何判别栈空与栈满?【解答】(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();。
数据结构---C语言描述-(耿国华)-高等教育出版社出版-课后习题答案
第一章习题答案2、××√3、(1)包含改变量定义的最小范围(2)数据抽象、信息隐蔽(3)数据对象、对象间的关系、一组处理数据的操作(4)指针类型(5)集合结构、线性结构、树形结构、图状结构(6)顺序存储、非顺序存储(7)一对一、一对多、多对多(8)一系列的操作(9)有限性、输入、可行性4、(1)A(2)C(3)C5、语句频度为1+(1+2)+(1+2+3)+…+(1+2+3+…+n)第二章习题答案1、(1)一半,插入、删除的位置(2)顺序和链式,显示,隐式(3)一定,不一定(4)头指针,头结点的指针域,其前驱的指针域2、(1)A(2)A:E、AB:H、L、I、E、AC:F、MD:L、J、A、G或J、A、G(3)D(4)D(5)C(6)A、C3、头指针:指向整个链表首地址的指针,标示着整个单链表的开始。
头结点:为了操作方便,可以在单链表的第一个结点之前附设一个结点,该结点的数据域可以存储一些关于线性表长度的附加信息,也可以什么都不存。
首元素结点:线性表中的第一个结点成为首元素结点。
4、算法如下:int Linser(SeqList *L,int X){ int i=0,k;if(L->last>=MAXSIZE-1){ printf(“表已满无法插入”);return(0);}while(i<=L->last&&L->elem[i]<X)i++;for(k=L->last;k>=I;k--)L->elem[k+1]=L->elem[k];L->elem[i]=X;L->last++;return(1);}5、算法如下:#define OK 1#define ERROR 0Int LDel(Seqlist *L,int i,int k){ int j;if(i<1||(i+k)>(L->last+2)){ printf(“输入的i,k值不合法”);return ERROR;}if((i+k)==(L->last+2)){ L->last=i-2;ruturn OK;}else{for(j=i+k-1;j<=L->last;j++)elem[j-k]=elem[j];L->last=L->last-k;return OK;}}6、算法如下:#define OK 1#define ERROR 0Int Delet(LInkList L,int mink,int maxk){ Node *p,*q;p=L;while(p->next!=NULL)p=p->next;if(mink<maxk||(L->next->data>=mink)||(p->data<=maxk)){ printf(“参数不合法”);return ERROR;}else{ p=L;while(p->next-data<=mink)p=p->next;while(q->data<maxk){ p->next=q->next;free(q);q=p->next;}return OK;}}9、算法如下:int Dele(Node *S){ Node *p;P=s->next;If(p= =s){printf(“只有一个结点,不删除”);return 0;}else{if((p->next= =s){s->next=s;free(p);return 1;}Else{ while(p->next->next!=s)P=p->next;P->next=s;Free(p); return 1;}}}第三章习题答案2、(1)3、栈有顺序栈和链栈两种存储结构。
数据结构---C语言描述-(耿国华)-高等教育出版社出版-课后习题答案
第一章习题答案2、××√3、(1)包含改变量定义的最小范围(2)数据抽象、信息隐蔽(3)数据对象、对象间的关系、一组处理数据的操作(4)指针类型(5)集合结构、线性结构、树形结构、图状结构(6)顺序存储、非顺序存储(7)一对一、一对多、多对多(8)一系列的操作(9)有限性、输入、可行性4、(1)A(2)C(3)C5、语句频度为1+(1+2)+(1+2+3)+…+(1+2+3+…+n)第二章习题答案1、(1)一半,插入、删除的位置(2)顺序和链式,显示,隐式(3)一定,不一定(4)头指针,头结点的指针域,其前驱的指针域2、(1)A(2)A:E、AB:H、L、I、E、AC:F、MD:L、J、A、G或J、A、G(3)D(4)D(5)C(6)A、C3、头指针:指向整个链表首地址的指针,标示着整个单链表的开始。
头结点:为了操作方便,可以在单链表的第一个结点之前附设一个结点,该结点的数据域可以存储一些关于线性表长度的附加信息,也可以什么都不存。
首元素结点:线性表中的第一个结点成为首元素结点。
4、算法如下:int Linser(SeqList *L,int X){ int i=0,k;if(L->last>=MAXSIZE-1){ printf(“表已满无法插入”);return(0);}while(i<=L->last&&L->elem[i]<X)i++;for(k=L->last;k>=I;k--)L->elem[k+1]=L->elem[k];L->elem[i]=X;L->last++;return(1);}5、算法如下:#define OK 1#define ERROR 0Int LDel(Seqlist *L,int i,int k){ int j;if(i<1||(i+k)>(L->last+2)){ printf(“输入的i,k值不合法”);return ERROR;}if((i+k)==(L->last+2)){ L->last=i-2;ruturn OK;}else{for(j=i+k-1;j<=L->last;j++)elem[j-k]=elem[j];L->last=L->last-k;return OK;}}6、算法如下:#define OK 1#define ERROR 0Int Delet(LInkList L,int mink,int maxk){ Node *p,*q;p=L;while(p->next!=NULL)p=p->next;if(mink<maxk||(L->next->data>=mink)||(p->data<=maxk)){ printf(“参数不合法”);return ERROR;}else{ p=L;while(p->next-data<=mink)p=p->next;while(q->data<maxk){ p->next=q->next;free(q);q=p->next;}return OK;}}9、算法如下:int Dele(Node *S){ Node *p;P=s->next;If(p= =s){printf(“只有一个结点,不删除”);return 0;}else{if((p->next= =s){s->next=s;free(p);return 1;}Else{ while(p->next->next!=s)P=p->next;P->next=s;Free(p); return 1;}}}第三章习题答案2、(1)3、栈有顺序栈和链栈两种存储结构。
《数据结构——C语言描述》习题及答案 耿国华
第1章绪论习题一、问答题1. 什么是数据结构?2. 四类基本数据结构的名称与含义.3. 算法的定义与特性。
4. 算法的时间复杂度。
5. 数据类型的概念。
6. 线性结构与非线性结构的差别.7. 面向对象程序设计语言的特点.8. 在面向对象程序设计中,类的作用是什么?9. 参数传递的主要方式及特点。
10. 抽象数据类型的概念。
二、判断题1. 线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。
2. 算法就是程序.3. 在高级语言(如C、或PASCAL)中,指针类型是原子类型。
三、计算下列程序段中X=X+1的语句频度for(i=1;i<=n;i++)for(j=1;j〈=i;j++)for(k=1;k<=j;k++)x=x+1;[提示]:i=1时:1 = (1+1)×1/2 = (1+12)/2i=2时:1+2 = (1+2)×2/2 = (2+22)/2i=3时:1+2+3 = (1+3)×3/2 = (3+32)/2…i=n时:1+2+3+……+n = (1+n)×n/2 = (n+n2)/2f(n)= [ (1+2+3+……+n) + (12 + 22 + 32 + …… + n2 )] / 2=[ (1+n)n/2 + n(n+1)(2n+1)/6 ] / 2=n(n+1)(n+2)/6=n3/6+n2/2+n/3区分语句频度和算法复杂度:O(f(n))= O(n3)四、试编写算法求一元多项式Pn(x)=a0+a1x+a2x2+a3x3+…a n x n的值P n(x0),并确定算法中的每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能的小,规定算法中不能使用求幂函数。
注意:本题中的输入a i(i=0,1,…,n), x和n,输出为P n(x0)。
通常算法的输入和输出可采用下列两种方式之一:(1)通过参数表中的参数显式传递;(2)通过全局变量隐式传递。
数据结构答案(耿国华)
SubString(sub2,s,7,1)= 空格
StrIndex(s,’A’,4)= 6 StrReplace(s,’STUDENT’,q)= I AM A WORKER
StrCat(StrCat(sub1,t),StrCat(sub2,q)) = I AM A GOOD WORKER
B
C A
先:ABC 中:CBA 后:CBA
A
B C
先:ABC 中:BAC 后:BCA
6
A
先:ABC B 中:ACB 后:CBA
B C
C
先:ABC 中:ABC 后:CBA
第6章 树和二叉树习题
3.已知一棵度为k的树中有n1个度为1的结点,n2个度 为2的结点,…nk个度为k的结点,则该树中有多少个 叶子结点,并证明之。
3)前序和后序相同 空树、只有一个结点的树
9
第6章 树和二叉树习题
数 据 结 构
补充:写出下面二叉树的前序、中序、后序 遍历序列 先序序列: A ABCDEFGHIJ E B 中序序列: G C F BCDAFEHJIG D H I J 后序序列: DCBFJIHGEA
10
第6章 树和二叉树习题
13
解:设n为总结点数,则有
数 据 结 构
(总结点数) n=n0+n1+n2+…nk (总边数) n-1=1*n1+2*n2+…k*nk 两式相减得:1=n0-n2-2n3-…-(k-1)nk n0=1+n2+2n3+…+(k-1)nk =1+∑(i-1)ni
i=1
7
k
第6章 树和二叉树习题
4.假设一棵二叉树的先序序列和中序序列,试画出该二叉树, 并写出后序遍历序列。
耿国华大数据结构习题问题详解完整版
第一章答案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)/61.4试编写算法,求p n(x)=a0+a1x+a2x2+…….+a n x n的值p n(x0),并确定算法中每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能小,规定算法中不能使用求幂函数。
注意:本题中的输入为a i(i=0,1,…n)、x和n,输出为P n(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<n;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,…,a n)逆置为(a n,a n-1,…,a1)。
《数据结构——C语言描述》习题及答案 耿国华
第1章绪论习题一.问答题1. 什么是数据构造?2. 四类根本数据构造的名称与寄义.3. 算法的界说与特征.4. 算法的时光庞杂度.5. 数据类型的概念.6. 线性构造与非线性构造的不同.7. 面向对象程序设计说话的特色.8. 在面向对象程序设计中,类的感化是什么?9. 参数传递的重要方法及特色.10. 抽象数据类型的概念.二.断定题1. 线性构造只能用次序构造来存放,非线性构造只能用非次序构造来存放.2. 算法就是程序.3. 在高等说话(如C.或 PASCAL)中,指针类型是原子类型.三.盘算下列程序段中X=X+1的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;[提醒]:i=1时: 1 = (1+1)×1/2 = (1+12)/2i=2时: 1+2= (1+2)×2/2 = (2+22)/2i=3时: 1+2+3= (1+3)×3/2 = (3+32)/2…i=n时:1+2+3+……+n= (1+n)×n/2 = (n+n2)/2f(n) = [ (1+2+3+……+n) + (12 + 22 + 32 + …… + n2 ) ] / 2=[ (1+n)n/2 + n(n+1)(2n+1)/6 ] / 2=n(n+1)(n+2)/6=n3/6+n2/2+n/3区分语句频度和算法庞杂度:O(f(n)) = O(n3)四.试编写算法求一元多项式Pn(x)=a0+a1x+a2x2+a3x3+…a n x n的值P n(x0),并肯定算法中的每一语句的履行次数和全部算法的时光庞杂度,请求时光庞杂度尽可能的小,划定算法中不克不及应用求幂函数.留意:本题中的输入a i(i=0,1,…,n), x和n,输出为P n(x0).平日算法的输入和输出可采取下列两种方法之一:(1)经由过程参数表中的参数显式传递;(2)经由过程全局变量隐式传递.试评论辩论这两种办法的优缺陷,并在本题算法中以你以为较好的一种方法实现输入和输出.[提醒]:float PolyValue(float a[ ], float x, int n) {……}焦点语句:p=1; (x的零次幂)s=0;i从0到n轮回s=s+a[i]*p;p=p*x;或:p=x; (x的一次幂)s=a[0];i从1到n轮回s=s+a[i]*p;p=p*x;练习题设计实现抽象数据类型“有理数”.根本操纵包含有理数的加法.减法.乘法.除法,以及求有理数的分子.分母.第一章答案盘算下列程序中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)/61.4试编写算法,求p n(x)=a0+a1x+a2x2+…….+a n x n的值p n(x0),并肯定算法中每一语句的履行次数和全部算法的时光庞杂度,请求时光庞杂度尽可能小,划定算法中不克不及应用求幂函数.留意:本题中的输入为a i(i=0,1,…n).x和n,输出为P n(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<n;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章线性表习题2.1 描写以下三个概念的差别:头指针,头结点,首元素结点.2.2 填空:(1)在次序表中拔出或删除一个元素,须要平均移动__一半__元素,具体移动的元素个数与__拔出或删除的地位__有关.(2)在次序表中,逻辑上相邻的元素,其物理地位______相邻.在单链表中,逻辑上相邻的元素,其物理地位______相邻.(3)在带头结点的非空单链表中,头结点的存储地位由______指导,首元素结点的存储地位由______指导,除首元素结点外,其它任一元素结点的存储地位由__其直接前趋的next域__指导.2.3 已知L是无表头结点的单链表,且P结点既不是首元素结点,也不是尾元素结点.按请求从下列语句中选择适合的语句序列.a. 在P结点后拔出S结点的语句序列是:_(4).(1)_.b. 在P结点前拔出S结点的语句序列是:(7).(11).(8).(4).(1).c. 在表首拔出S结点的语句序列是:(5).(12).d. 在表尾拔出S结点的语句序列是:(11).(9).(1).(6).供选择的语句有:(1)P->next=S;(2)P->next= P->next->next;(3)P->next= S->next;(4)S->next= P->next;(5)S->next= L;(6)S->next= NULL;(7)Q= P;(8)while(P->next!=Q) P=P->next;(9)while(P->next!=NULL) P=P->next;(10)P= Q;(11)P= L;(12)L= S;(13)L= P;2.4 已知线性表L递增有序.试写一算法,将X拔出到L的恰当地位上,以保持线性表L的有序性.[提醒]:void insert(SeqList *L; ElemType x)< 办法1 >(1)找出应拔出地位i,(2)移位,(3)……< 办法2 > 参P. 2292.5 写一算法,从次序表中删除自第i个元素开端的k个元素.[提醒]:留意检讨i和k的正当性.(集体搬家,“新房”.“旧房”)< 办法1 > 以待移动元素下标m(“旧房号”)为中间,盘算应移入地位(“新房号”):for ( m= i-1+k; m<= L->last; m++)L->elem[ m-k ] = L->elem[ m ];< 办法2 > 同时以待移动元素下标m和应移入地位j为中间:< 办法3 > 以应移入地位j为中间,盘算待移动元素下标:已知线性表中的元素(整数)以值递增有序分列,并以单链表作存储构造.试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中消失如许的元素),剖析你的算法的时光庞杂度(留意:mink和maxk是给定的两个参变量,它们的值为随意率性的整数).[提醒]:留意检讨mink和maxk的正当性:mink < maxk不要一个一个的删除(多次修正next域).(1)找到第一个应删结点的前驱prepre=L; p=L->next;while (p!=NULL && p->data <= mink){ pre=p; p=p->next; }(2)找到最后一个应删结点的后继s,边找边释放应删结点s=p;while (s!=NULL && s->data < maxk){ t =s; s=s->next; free(t); }(3)pre->next = s;试分离以不合的存储构造实现线性表的当场逆置算法,即在原表的存储空间将线性表(a1, a2..., a n)逆置为(a n, a n-1,..., a1).(1)以一维数组作存储构造,设线性表存于a(1:arrsize)的前elenum个分量中.(2)以单链表作存储构造.[办法1]:在原头结点后从新头插一遍[办法2]:可设三个同步移动的指针p, q, r,将q的后继r改为p2.8 假设两个按元素值递增有序分列的线性表A和B,均以单链表作为存储构造,请编写算法,将A表和B表归并成一个按元素值递减有序的分列的线性表C,并请求应用原表(即A表和B表的)结点空间存放表C.[提醒]:参P.28 例2-1< 办法1 >void merge(LinkList A; LinkList B; LinkList *C){ ……pa=A->next; pb=B->next;*C=A; (*C)->next=NULL;while ( pa!=NULL && pb!=NULL ){if ( pa->data <= pb->data ){smaller=pa; pa=pa->next;smaller->next = (*C)->next; /* 头插法 */(*C)->next = smaller;}else{smaller=pb; pb=pb->next;smaller->next = (*C)->next;(*C)->next = smaller;}}while ( pa!=NULL){smaller=pa; pa=pa->next;smaller->next = (*C)->next;(*C)->next = smaller;}while ( pb!=NULL){smaller=pb; pb=pb->next;smaller->next = (*C)->next;(*C)->next = smaller;}< 办法2 >LinkList merge(LinkList A; LinkList B){ ……LinkList C;pa=A->next; pb=B->next;C=A; C->next=NULL;…………return C;2.9 假设有一个轮回链表的长度大于1,且表中既无头结点也无头指针.已知s 为指向链表某个结点的指针,试编写算法在链表中删除指针s所指结点的前趋结点.[提醒]:设指针p指向s结点的前趋的前趋,则p与s有何干系?2.10 已知有单链表暗示的线性表中含有三类字符的数据元素(如字母字符.数字字符和其它字符),试编写算法来构造三个以轮回链表暗示的线性表,使每个表中只含统一类的字符,且应用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间.2.11 设线性表A=(a1, a2,…,a m),B=(b1, b2,…,b n),试写一个按下列规矩归并A.B为线性表C的算法,使得:C= (a1, b1,…,a m, b m, b m+1,…,b n)当m≤n时;或者 C= (a1, b1,…,a n, b n, a n+1,…,a m) 当m>n时.线性表A.B.C均以单链表作为存储构造,且C表应用A表和B表中的结点空间组成.留意:单链表的长度值m和n均未显式存储.[提醒]:void merge(LinkList A; LinkList B; LinkList *C)或:LinkList merge(LinkList A; LinkList B)2.12 将一个用轮回链表暗示的稀少多项式分化成两个多项式,使这两个多项式中各自仅含奇次项或偶次项,并请求应用原链表中的结点空间来组成这两个链表.[提醒]:注明用头指针照样尾指针.2.13 树立一个带头结点的线性链表,用以存放输入的二进制数,链表中每个结点的data域存放一个二进制位.并在此链表上实现对二进制数加1的运算.[提醒]:可将低位放在前面.2.14 设多项式P(x)采取教材中所述链接办法存储.写一算法,对给定的x值,求P(x)的值.[提醒]:float PolyValue(Polylist p; float x) {……}练习题1.将若干城市的信息存入一个带头结点的单链表,结点中的城市信息包含城市名.城市的地位坐标.请求:(1)给定一个城市名,返回其地位坐标;(2)给定一个地位坐标P和一个距离D,返回所有与P的距离小于等于D 的城市.2.约瑟夫环问题.约瑟夫问题的一种描写是:编号为1,2,…,n的n小我按顺时针偏向围坐一圈,每人持有一个暗码(正整数).一开端任选一个整数作为报数上限值m,从第一小我开端顺时针自1开端次序报数,报到m时停滞报数.报m的人出列,将他的暗码作为新的m值,从他在顺时针偏向上的下一小我开端从新从1报数,如斯下去,直至所有的人全体出列为止.试设计一个程序,求出出列次序.应用单向轮回链表作为存储构造模仿此进程,按照出列次序打印出大家的编号.例如m的初值为20;n=7,7小我的暗码依次是:3,1,7,2,4,8,4,出列的次序为6,1,4,7,2,3,5.第二章答案练习题二:约瑟夫环问题约瑟夫问题的一种描写为:编号1,2,…,n的n小我按顺时针偏向围坐一圈,每小我持有一个暗码(正整数).一开端任选一个报数上限值m,从第一小我开端顺时针自1开端次序报数,报到m时停滞报数.报m的人出列,将他的暗码作为新的m值,从他在顺时针偏向上的下一小我开端从新从1报数,如斯下去,直至所有的人全体出列为止.试设计一个程序,求出出列次序.应用单向轮回链表作为存储构造模仿此进程,按照出列次序打印出大家的编号.例如,m的初值为20;n=7,7小我的暗码依次是:3,1,7,2,4,8,4,出列次序为6,1,4,7,2,3,5.【解答】算法如下:typedef struct Node{int password;int num;struct Node *next;} Node,*Linklist;void Josephus(){Linklist L;Node *p,*r,*q;int m,n,C,j;L=(Node*)malloc(sizeof(Node)); /*初始化单向轮回链表*/if(L==NULL) { printf("\n链表申请不到空间!");return;}L->next=NULL;r=L;printf("请输入数据n的值(n>0):");scanf("%d",&n);for(j=1;j<=n;j++)/*树立链表*/{p=(Node*)malloc(sizeof(Node));if(p!=NULL){printf("请输入第%d小我的暗码:",j);scanf("%d",&C);p->password=C;p->num=j;r->next=p;r=p;}}r->next=L->next;printf("请输入第一个报数上限值m(m>0):");scanf("%d",&m);printf("*****************************************\n");printf("出列的次序为:\n");q=L;p=L->next;while(n!=1) /*盘算出列的次序*/{j=1;while(j<m) /*盘算当前出列的人选p*/{q=p; /*q为当前结点p的前驱结点*/p=p->next;j++;}printf("%d->",p->num);m=p->password; /*获得新暗码*/n--;q->next=p->next; /*p出列*/r=p;p=p->next;free(r);}printf("%d\n",p->num);}试分离以不合的存储构造实现单线表的当场逆置算法,即在原表的存储空间将线性表(a1,a2,…,a n)逆置为(a n,a n-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;}}将线性表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)所示铁道(两侧铁道均为单向行驶道)进行车厢调剂,答复:⑴如进站的车厢序列为123,则可能得到的出站车厢序列是什么?123.213.132.231.321(312)⑵如进站的车厢序列为123456,可否得到435612和135426的出站序列,并解释原因.(即写出以“S”暗示进栈.以“X”暗示出栈的栈操纵序列).SXSS XSSX XXSX 或 S1X1S2S3X3S4S5X5X4X2S6X62. 设队列中有A.B.C.D.E这5个元素,个中队首元素为A.假如对这个队列反复履行下列4步操纵:(1)输出队首元素;(2)把队首元素值拔出到队尾;(3)删除队首元素;(4)再次删除队首元素.直到队列成为空队列为止,则是否可能得到输出序列:(1) A.C.E.C.C (2) A.C.E(3) A.C.E.C.C.C (4) A.C.E.C[提醒]:A.B.C.D.E (输出队首元素A)A.B.C.D.E.A (把队首元素A拔出到队尾)B.C.D.E.A (删除队首元素A)C.D.E.A (再次删除队首元素B)C.D.E.A (输出队首元素C)C.D.E.A.C (把队首元素C拔出到队尾)D.E.A.C (删除队首元素C)E.A.C (再次删除队首元素D)3. 给出栈的两种存储构造情势名称,在这两种栈的存储构造中若何判别栈空与栈满?4. 按照四则运算加.减.乘.除和幂运算(↑)优先关系的通例,画出对下列算术表达式求值时操纵数栈和运算符栈的变更进程:A-B*C/D+E↑F5. 试写一个算法,断定依次读入的一个以@为停滞符的字母序列,是否为形如‘序列1& 序列2’模式的字符序列.个中序列1和序列2中都不含字符’&’,且序列2是序列1的逆序列.例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是.[提醒]:(1)边读边入栈,直到&(2)边读边出栈边比较,直到……6. 假设表达式由单字母变量和双目四则运算算符组成.试写一个算法,将一个平日书写情势(中缀)且书写准确的表达式转换为逆波兰式(后缀).[提醒]:例:中缀表达式:a+b后缀表达式: ab+中缀表达式:a+b×c后缀表达式: abc×+中缀表达式:a+b×c-d后缀表达式: abc×+d-中缀表达式:a+b×c-d/e后缀表达式: abc×+de/-中缀表达式:a+b×(c-d)-e/f后缀表达式: abcd-×+ef/-•后缀表达式的盘算进程:(轻便)次序扫描表达式,(1)假如是操纵数,直接入栈;(2)假如是操纵符op,则持续退栈两次,得操纵数X, Y,盘算X op Y,并将成果入栈.•若何将中缀表达式转换为后缀表达式?次序扫描中缀表达式,(1)假如是操纵数,直接输出;(2)假如是操纵符op2,则与栈顶操纵符op1比较:假如op2 > op1,则op2入栈;假如op2 = op1,则脱括号;假如op2 < op1,则输出op1;7. 假设以带头结点的轮回链表暗示队列,并且只设一个指针指向队尾元素结点(留意不设头指针),试编写响应的队列初始化.入队列和出队列的算法.[提醒]:参P.56 P.70 先绘图.typedef LinkListCLQueue;int InitQueue(CLQueue * Q)int EnterQueue(CLQueue Q, QueueElementType x)int DeleteQueue(CLQueue Q, QueueElementType *x)8. 请求轮回队列不损掉一个空间全体都能得到应用, 设置一个标记域tag ,以tag为0或1来区分头尾指针雷同时的队列状况的空与满,请编写与此构造响应的入队与出队算法.[提醒]:初始状况:front==0, rear==0, tag==0队空前提:front==rear, tag==0队满前提:front==rear, tag==1其它状况:front !=rear, tag==0(或1.2)入队操纵:……(入队)if (front==rear) tag=1;(或直接tag=1)出队操纵:……(出队)tag=0;[问题]:若何明白区分队空.队满.非空非满三种情形?9. 简述以下算法的功效(个中栈和队列的元素类型均为int):(1)void proc_1(Stack S){ iint i, n, A[255];n=0;while(!EmptyStack(S)){n++;Pop(&S, &A[n]);}for(i=1; i<=n; i++)Push(&S, A[i]);}将栈S逆序.(2)void proc_2(Stack S, int e){Stack T; int d;InitStack(&T);while(!EmptyStack(S)){Pop(&S, &d);if (d!=e) Push( &T, d);}while(!EmptyStack(T)){Pop(&T, &d);Push( &S, d);}}删除栈S中所有等于e的元素.(3)void proc_3(Queue *Q){Stack S; int d;InitStack(&S);while(!EmptyQueue(*Q)){DeleteQueue(Q, &d);Push( &S, d);}while(!EmptyStack(S)){Pop(&S, &d);EnterQueue(Q,d)}}将队列Q逆序.练习题1.回文断定.称正读与反读都雷同的字符序列为“回文”序列.试写一个算法,断定依次读入的一个以@为停滞符的字母序列,是否为形如‘序列1&序列2’模式的字符序列.个中序列1和序列2中都不含字符‘&’,且序列2是序列1的逆序列.例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是.2.泊车场治理.设泊车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出.在泊车场内,汽车按到达的先后次序,由北向南依次分列(假设大门在最南端).若车场内已停满n辆车,则后来的汽车需在门外的便道上等候,当有车开走时,便道上的第一辆车即可开入.当泊车场内某辆车要分开时,在它之落后入的车辆必须先退出车场为它让路,待该辆车开出大门后,其它车辆再按原次序返回车场.每辆车分开泊车场时,应按其逗留时光的长短交费(在便道上逗留的时光不收费).试编写程序,模仿上述治理进程.请求以次序栈模仿泊车场,以链队列模仿便道.从终端读入汽车到达或离去的数据,每组数据包含三项:①是“到达”照样“离去”;②汽车派司号码;③“到达”或“离去”的时刻.与每组输入信息响应的输出信息为:假如是到达的车辆,则输出其在泊车场中或便道上的地位;假如是离去的车辆,则输出其在泊车场中逗留的时光和应交的费用.(提醒:需另设一个栈,临时停放为让路而从车场退出的车.)3.商品货架治理.,栈底商品的临盆日期比来.上货时,.用队列和栈作为周转,按,答复:(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).给出栈的两种存储构造情势名称,在这两种栈的存储构造中若何判别栈空与栈满?【解答】(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();。
《数据结构——C语言描述》习题及答案 耿国华
第1章绪论之马矢奏春创作习题一、问答题1. 什么是数据结构?2. 四类基本数据结构的名称与含义。
3. 算法的定义与特性。
4. 算法的时间复杂度。
5. 数据类型的概念。
6. 线性结构与非线性结构的不同。
7. 面向对象程序设计语言的特点。
8. 在面向对象程序设计中,类的作用是什么?9. 参数传递的主要方式及特点。
10. 抽象数据类型的概念。
二、判断题1. 线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。
2. 算法就是程序。
3. 在高级语言(如C、或 PASCAL)中,指针类型是原子类型。
三、计算下列程序段中X=X+1的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;[提示]:i=1时:1 = (1+1)×1/2 = (1+12)/2i=2时:1+2 = (1+2)×2/2 = (2+22)/2i=3时:1+2+3 = (1+3)×3/2 = (3+32)/2…i=n时:1+2+3+……+n = (1+n)×n/2 = (n+n2)/2f(n) = [ (1+2+3+……+n) + (12 + 22 + 32 + …… + n2 ) ]/ 2=[ (1+n)n/2 + n(n+1)(2n+1)/6 ] / 2=n(n+1)(n+2)/6=n3/6+n2/2+n/3区分语句频度和算法复杂度:O(f(n)) = O(n3)四、试编写算法求一元多项式Pn(x)=a0+a1x+a2x2+a3x3+…anxn的值Pn(x0),并确定算法中的每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能的小,规定算法中不克不及使用求幂函数。
注意:本题中的输入ai(i=0,1,…,n), x和n,输出为Pn(x0).通常算法的输入和输出可采取下列两种方式之一:(1)通过参数表中的参数显式传递;(2)通过全局变量隐式传递。
《数据结构——C语言描述》习题及答案 耿国华
第1章绪论之阳早格格创做习题一、问问题1. 什么是数据结构?2. 四类基础数据结构的称呼与含意.3. 算法的定义与个性.4. 算法的时间搀纯度.5. 数据典型的观念.6. 线性结构与非线性结构的不共.7. 里背对于象步调安排谈话的个性.8. 正在里背对于象步调安排中,类的效率是什么?9. 参数传播的主要办法及个性.10. 抽象数据典型的观念.二、推断题1. 线性结构只可用程序结构去存搁,非线性结构只可用非程序结构去存搁.2. 算法便是步调.3. 正在下档谈话(如C、大概 PASCAL)中,指针典型是本子典型.三、估计下列步调段中X=X+1的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;[提示]:i=1时: 1 = (1+1)×1/2 = (1+12)/2i=2时: 1+2 = (1+2)×2/2 = (2+22)/2i=3时: 1+2+3 = (1+3)×3/2 = (3+32)/2…i=n时:1+2+3+……+n = (1+n)×n/2 = (n+n2)/2f(n) = [ (1+2+3+……+n) + (12 + 22 + 32 + …… + n2 ) ] / 2=[ (1+n)n/2 + n(n+1)(2n+1)/6 ] / 2=n(n+1)(n+2)/6=n3/6+n2/2+n/3区别语句频度战算法搀纯度:O(f(n)) = O(n3)四、试编写算法供一元多项式Pn(x)=a0+a1x+a2x2+a3x3+…a n x n的值P n(x0),并决定算法中的每一语句的真止次数战所有算法的时间搀纯度,央供时间搀纯度尽大概的小,确定算法中不克不迭使用供幂函数.注意:本题中的输进a i(i=0,1,…,n), x战n,输出为P n(x0).常常算法的输进战输出可采与下列二种办法之一:(1)通过参数表中的参数隐式传播;(2)通过局部变量隐式传播.试计划那二种要领的劣缺面,并正在本题算法中以您认为较佳的一种办法真止输进战输出.[提示]:float PolyValue(float a[ ], float x, int n) {……}核心语句:p=1; (x的整次幂)s=0;i从0到n循环s=s+a[i]*p;p=p*x;大概:p=x; (x的一次幂)s=a[0];i从1到n循环s=s+a[i]*p;p=p*x;真习题安排真止抽象数据典型“有理数”.基础支配包罗有理数的加法、减法、乘法、除法,以及供有理数的分子、分母.第一章问案估计下列步调中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 1.4试编写算法,供p n(x)=a0+a1x+a2x2+…….+a n x n的值p n(x0),并决定算法中每一语句的真止次数战所有算法的时间搀纯度,央供时间搀纯度尽大概小,确定算法中不克不迭使用供幂函数.注意:本题中的输进为a i(i=0,1,…n)、x战n,输出为P n(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<n;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章线性表习题2.1 形貌以下三个观念的辨别:头指针,头结面,尾元素结面.2.2 挖空:(1)正在程序表中拔出大概简略一个元素,需要仄衡移动__一半__元素,简曲移动的元素个数与__拔出大概简略的位子__有闭.(2)正在程序表中,逻辑上相邻的元素,其物理位子______相邻.正在单链表中,逻辑上相邻的元素,其物理位子______相邻.(3)正在戴头结面的非空单链表中,头结面的保存位子由______指示,尾元素结面的保存位子由______指示,除尾元素结面中,其余任一元素结面的保存位子由__其间接前趋的next 域__指示.2.3 已知L是无表头结面的单链表,且P结面既不是尾元素结面,也不是尾元素结面.按央供从下列语句中采用符合的语句序列.a. 正在P结面后拔出S结面的语句序列是:_(4)、(1)_.b. 正在P结面前拔出S结面的语句序列是:(7)、(11)、(8)、(4)、(1).c. 正在表尾拔出S结面的语句序列是:(5)、(12).d. 正在表尾拔出S结面的语句序列是:(11)、(9)、(1)、(6).供采用的语句有:(1)P->next=S;(2)P->next= P->next->next;(3)P->next= S->next;(4)S->next= P->next;(5)S->next= L;(6)S->next= NULL;(7)Q= P;(8)while(P->next!=Q) P=P->next;(9)while(P->next!=NULL) P=P->next;(10)P= Q;(11)P= L;(12)L= S;(13)L= P;2.4 已知线性表L递加有序.试写一算法,将X拔出到L的适合位子上,以脆持线性表L的有序性.[提示]:void insert(SeqList *L; ElemType x)< 要领1 >(1)找出应拔出位子i,(2)移位,(3)……< 要领2 > 参P. 2292.5 写一算法,从程序表中简略自第i个元素启初的k个元素.[提示]:注意查看i战k的合法性.(普遍搬家,“新房”、“旧房”)< 要领1 > 以待移动元素下标m(“旧房号”)为核心,估计应移进位子(“新房号”):for ( m= i-1+k; m<= L->last; m++)L->elem[ m-k ] = L->elem[ m ];< 要领2 > 共时以待移动元素下标m战应移进位子j为核心:< 要领3 > 以应移进位子j为核心,估计待移动元素下标:已知线性表中的元素(整数)以值递加有序排列,并以单链表做保存结构.试写一下效算法,简略表中所有大于mink且小于maxk的元素(若表中存留那样的元素),领会您的算法的时间搀纯度(注意:mink战maxk是给定的二个参变量,它们的值为任性的整数).[提示]:注意查看mink战maxk的合法性:mink < maxk不要一个一个的简略(多次建改next域).(1)找到第一个应删结面的前驱prepre=L; p=L->next;while (p!=NULL && p->data <= mink){ pre=p; p=p->next; }(2)找到末尾一个应删结面的后继s,边找边释搁应删结面s=p;while (s!=NULL && s->data < maxk){ t =s; s=s->next; free(t); }(3)pre->next = s;试分别以分歧的保存结构真止线性表的便天顺置算法,即正在本表的保存空间将线性表(a1, a2..., a n)顺置为(a n, a n-1,..., a1).(1)以一维数组做保存结构,设线性表存于a(1:arrsize)的前elenum个分量中.(2)以单链表做保存结构.[要领1]:正在本头结面后沉新头插一遍[要领2]:可设三个共步移动的指针p, q, r,将q的后继r改为p2.8 假设二个按元素值递加有序排列的线性表A战B,均以单链表动做保存结构,请编写算法,将A表战B表归并成一个按元素值递减有序的排列的线性表C,并央供利用本表(即A表战B表的)结面空间存搁表C.[提示]:参P.28 例2-1< 要领1 >void merge(LinkList A; LinkList B; LinkList *C){ ……pa=A->next; pb=B->next;*C=A; (*C)->next=NULL;while ( pa!=NULL && pb!=NULL ){if ( pa->data <= pb->data ){smaller=pa; pa=pa->next;smaller->next = (*C)->next; /* 头插法 */(*C)->next = smaller;}else{smaller=pb; pb=pb->next;smaller->next = (*C)->next;(*C)->next = smaller;}}while ( pa!=NULL){smaller=pa; pa=pa->next;smaller->next = (*C)->next;(*C)->next = smaller;}while ( pb!=NULL){smaller=pb; pb=pb->next;smaller->next = (*C)->next;(*C)->next = smaller;}< 要领2 >LinkList merge(LinkList A; LinkList B){ ……LinkList C;pa=A->next; pb=B->next;C=A; C->next=NULL;…………return C;2.9 假设有一个循环链表的少度大于1,且表中既无头结面也无头指针.已知s为指背链表某个结面的指针,试编写算法正在链表中简略指针s 所指结面的前趋结面.[提示]:设指针p指背s结面的前趋的前趋,则p与s有何闭系?2.10 已知有单链表表示的线性表中含有三类字符的数据元素(如字母字符、数字字符战其余字符),试编写算法去构制三个以循环链表表示的线性表,使每个表中只含共一类的字符,且利用本表中的结面空间动做那三个表的结面空间,头结面可另辟空间.2.11 设线性表A=(a1, a2,…,a m),B=(b1, b2,…,b n),试写一个按下列准则合并A、B为线性表C的算法,使得:C= (a1, b1,…,a m, b m, b m+1,…,b n)当m≤n时;大概者 C= (a1, b1,…,a n, b n, a n+1,…,a m) 当m>n时.线性表A、B、C均以单链表动做保存结构,且C表利用A表战B 表中的结面空间形成.注意:单链表的少度值m战n均已隐式保存.[提示]:void merge(LinkList A; LinkList B; LinkList *C)大概:LinkList merge(LinkList A; LinkList B)2.12 将一个用循环链表表示的稠稀多项式领会成二个多项式,使那二个多项式中各自仅含奇次项大概奇次项,并央供利用本链表中的结面空间去形成那二个链表.[提示]:证明用头指针仍旧尾指针.2.13 建坐一个戴头结面的线性链表,用以存搁输进的二进制数,链表中每个结面的data域存搁一个二进制位.并正在此链表上真止对于二进制数加1的运算.[提示]:可将矮位搁正在前里.2.14 设多项式P(x)采与课本中所述链接要领保存.写一算法,对于给定的x值,供P(x)的值.[提示]:float PolyValue(Polylist p; float x) {……}真习题1.将若搞皆会的疑息存进一个戴头结面的单链表,结面中的皆会疑息包罗皆会名、皆会的位子坐标.央供:(1)给定一个皆会名,返回其位子坐标;(2)给定一个位子坐标P战一个距离D,返回所有与P的距离小于等于D的皆会.2.约瑟妇环问题.约瑟妇问题的一种形貌是:编号为1,2,…,n的n部分按顺时针目标围坐一圈,每人持有一个暗号(正整数).一启初任选一个整数动做报数上限值m,从第一部分启初顺时针自1启初程序报数,报到m时停止报数.报m的人出列,将他的暗号动做新的m值,从他正在顺时针目标上的下一部分启初沉新从1报数,如许下去,曲至所有的人局部出列为止.试安排一个步调,供出出列程序.利用单背循环链表动做保存结构模拟此历程,依照出列程序挨印出各人的编号.比圆m的初值为20;n=7,7部分的暗号依次是:3,1,7,2,4,8,4,出列的程序为6,1,4,7,2,3,5.第二章问案真习题二:约瑟妇环问题约瑟妇问题的一种形貌为:编号1,2,…,n的n部分按顺时针目标围坐一圈,每部分持有一个暗号(正整数).一启初任选一个报数上限值m,从第一部分启初顺时针自1启初程序报数,报到m时停止报数.报m 的人出列,将他的暗号动做新的m值,从他正在顺时针目标上的下一部分启初沉新从1报数,如许下去,曲至所有的人局部出列为止.试安排一个步调,供出出列程序.利用单背循环链表动做保存结构模拟此历程,依照出列程序挨印出各人的编号.比圆,m的初值为20;n=7,7部分的暗号依次是:3,1,7,2,4,8,4,出列程序为6,1,4,7,2,3,5.【解问】算法如下:typedef struct Node{int password;int num;struct Node *next;} Node,*Linklist;void Josephus(){Linklist L;Node *p,*r,*q;int m,n,C,j;L=(Node*)malloc(sizeof(Node)); /*初初化单背循环链表*/if(L==NULL) { printf("\n链表申请不到空间!");return;}L->next=NULL;r=L;printf("请输进数据n的值(n>0):");scanf("%d",&n);for(j=1;j<=n;j++) /*建坐链表*/{p=(Node*)malloc(sizeof(Node));if(p!=NULL){printf("请输进第%d部分的暗号:",j);scanf("%d",&C);p->password=C;p->num=j;r->next=p;r=p;}}r->next=L->next;printf("请输进第一个报数上限值m(m>0):");scanf("%d",&m);printf("*****************************************\n"); printf("出列的程序为:\n");q=L;p=L->next;while(n!=1) /*估计出列的程序*/{j=1;while(j<m) /*估计目前出列的人选p*/{q=p; /*q为目前结面p的前驱结面*/p=p->next;j++;}printf("%d->",p->num);m=p->password; /*赢得新暗号*/n--;q->next=p->next; /*p出列*/r=p;p=p->next;free(r);}printf("%d\n",p->num);}试分别以分歧的保存结构真止单线表的便天顺置算法,即正在本表的保存空间将线性表(a1,a2,…,a n)顺置为(a n,a n-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;}}将线性表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)所示铁讲(二侧铁讲均为单背止驶讲)举止车厢调动,回问:⑴如进站的车厢序列为123,则大概得到的出站车厢序列是什么?123、213、132、231、321(312)⑵如进站的车厢序列为123456,是可得到435612战135426的出站序列,并证明本果.(即写出以“S”表示进栈、以“X”表示出栈的栈支配序列).SXSS XSSX XXSX 大概 S1X1S2S3X3S4S5X5X4X2S6X62. 设行列中有A、B、C、D、E那5个元素,其中队尾元素为A.如果对于那个行列沉复真止下列4步支配:(1)输出队尾元素;(2)把队尾元素值拔出到队尾;(3)简略队尾元素;(4)再次简略队尾元素.曲到行列成为空行列为止,则是可大概得到输出序列:(1)A、C、E、C、C (2) A、C、E(3) A、C、E、C、C、C (4) A、C、E、C[提示]:A、B、C、D、E (输出队尾元素A)A、B、C、D、E、A (把队尾元素A拔出到队尾)B、C、D、E、A (简略队尾元素A)C、D、E、A (再次简略队尾元素B)C、D、E、A (输出队尾元素C)C、D、E、A、C (把队尾元素C拔出到队尾)D、E、A、C (简略队尾元素C)E、A、C (再次简略队尾元素D)3. 给出栈的二种保存结构形式称呼,正在那二种栈的保存结构中怎么样判别栈空与栈谦?4. 依照四则运算加、减、乘、除战幂运算(↑)劣先闭系的惯例,绘出对于下列算术表白式供值时支配数栈战运算符栈的变更历程:A-B*C/D+E↑F5. 试写一个算法,推断依次读进的一个以@为中断符的字母序列,是可为形如‘序列1&序列2’模式的字符序列.其中序列1战序列2中皆不含字符’&’,且序列2是序列1的顺序列.比圆,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是.[提示]:(1)边读边进栈,曲到&(2)边读边出栈边比较,曲到……6. 假设表白式由单字母变量战单目四则运算算符形成.试写一个算法,将一个常常书籍写形式(中缀)且书籍写精确的表白式变换为顺波兰式(后缀).[提示]:例:中缀表白式:a+b后缀表白式: ab+中缀表白式:a+b×c后缀表白式: abc×+中缀表白式:a+b×c-d后缀表白式: abc×+d-中缀表白式:a+b×c-d/e后缀表白式: abc×+de/-中缀表白式:a+b×(c-d)-e/f后缀表白式: abcd-×+ef/-•后缀表白式的估计历程:(烦琐)程序扫描表白式,(1)如果是支配数,间接进栈;(2)如果是支配符op,则连绝退栈二次,得支配数X, Y,估计X op Y,并将截止进栈.•怎么样将中缀表白式变换为后缀表白式?程序扫描中缀表白式,(1)如果是支配数,间接输出;(2)如果是支配符op2,则与栈顶支配符op1比较:如果op2 > op1,则op2进栈;如果op2 = op1,则脱括号;如果op2 < op1,则输出op1;7. 假设以戴头结面的循环链表表示行列,而且只设一个指针指背队尾元素结面(注意不设头指针),试编写相映的行列初初化、进行列战出行列的算法.[提示]:参P.56 P.70 先绘图.typedef LinkListCLQueue;int InitQueue(CLQueue * Q)int EnterQueue(CLQueue Q, QueueElementType x)int DeleteQueue(CLQueue Q, QueueElementType *x)8. 央供循环行列不益坏一个空间局部皆能得到利用, 树坐一个标记域tag , 以tag为0大概1去区别头尾指针相共时的行列状态的空与谦,请编写与此结构相映的进队与出队算法.[提示]:初初状态:front==0, rear==0, tag==0队空条件:front==rear, tag==0队谦条件:front==rear, tag==1其余状态:front !=rear, tag==0(大概1、2)进队支配:……(进队)if (front==rear) tag=1;(大概间接tag=1)出队支配:……(出队)tag=0;[问题]:怎么样精确区别队空、队谦、非空非谦三种情况?9. 简述以下算法的功能(其中栈战行列的元素典型均为int):(1)void proc_1(Stack S){ iint i, n, A[255];n=0;while(!EmptyStack(S)){n++;Pop(&S, &A[n]);}for(i=1; i<=n; i++)Push(&S, A[i]);}将栈S顺序.(2)void proc_2(Stack S, int e) {Stack T; int d;InitStack(&T);while(!EmptyStack(S)){Pop(&S, &d);if (d!=e) Push( &T, d);}while(!EmptyStack(T)){Pop(&T, &d);Push( &S, d);}}简略栈S中所有等于e的元素.(3)void proc_3(Queue *Q){Stack S; int d;InitStack(&S);while(!EmptyQueue(*Q)){DeleteQueue(Q, &d);Push( &S, d);}while(!EmptyStack(S)){Pop(&S, &d);EnterQueue(Q,d)}}将行列Q顺序.真习题1.回文推断.称正读与反读皆相共的字符序列为“回文”序列.试写一个算法,推断依次读进的一个以@为中断符的字母序列,是可为形如‘序列1&序列2’模式的字符序列.其中序列1战序列2中皆不含字符‘&’,且序列2是序列1的顺序列.比圆,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是.2.停车场管制.设停车场是一个可停搁n辆车的狭少通讲,且惟有一个大门可供汽车出进.正在停车场内,汽车按到达的先后序次,由北背北依次排列(假设大门正在最北端).若车场内已停谦n辆车,则厥后的汽车需正在门中的便讲上期待,当有车启走时,便讲上的第一辆车即可启进.当停车场内某辆车要离启时,正在它之后加进的车辆必须先退出车场为它让路,待该辆车启出大门后,其余车辆再按本序次返回车场.每辆车离启停车场时,应按其停顿时间的少短接费(正在便讲上停顿的时间不支费).试编写步调,模拟上述管制历程.央供以程序栈模拟停车场,以链行列模拟便讲.从末端读进汽车到达大概拜别的数据,每组数据包罗三项:①是“到达”仍旧“拜别”;②汽车牌照号码;③“到达”大概“拜别”的时刻.与每组输进疑息相映的输出疑息为:如果是到达的车辆,则输出其正在停车场中大概便讲上的位子;如果是拜别的车辆,则输出其正在停车场中停顿的时间战应接的费用.(提示:需另设一个栈,临时停搁为让路而从车场退出的车.)Array3.商品货架管制.的死产日期迩去.在较下的位子..按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).给出栈的二种保存结构形式称呼,正在那二种栈的保存结构中怎么样判别栈空与栈谦?【解问】(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();。
《数据结构——C语言描述》习题及答案 耿国华.
第1章绪论习题一、问答题1. 什么是数据结构?2. 四类基本数据结构的名称与含义。
3. 算法的定义与特性。
4. 算法的时间复杂度。
5. 数据类型的概念。
6. 线性结构与非线性结构的差别。
7. 面向对象程序设计语言的特点。
8. 在面向对象程序设计中,类的作用是什么?9. 参数传递的主要方式及特点。
10. 抽象数据类型的概念。
二、判断题1. 线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。
2. 算法就是程序。
3. 在高级语言(如C、或PASCAL)中,指针类型是原子类型。
三、计算下列程序段中X=X+1的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;[提示]:i=1时:1 = (1+1)×1/2 = (1+12)/2i=2时:1+2 = (1+2)×2/2 = (2+22)/2i=3时:1+2+3 = (1+3)×3/2 = (3+32)/2…i=n时:1+2+3+……+n = (1+n)×n/2 = (n+n2)/2f(n) = [ (1+2+3+……+n) + (12 + 22 + 32 + …… + n2 ) ] / 2=[ (1+n)n/2 + n(n+1)(2n+1)/6 ] / 2=n(n+1)(n+2)/6=n3/6+n2/2+n/3区分语句频度和算法复杂度:O(f(n)) = O(n3)四、试编写算法求一元多项式Pn(x)=a0+a1x+a2x2+a3x3+…a n x n的值P n(x0),并确定算法中的每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能的小,规定算法中不能使用求幂函数。
注意:本题中的输入a i(i=0,1,…,n), x和n,输出为P n(x0).通常算法的输入和输出可采用下列两种方式之一:(1)通过参数表中的参数显式传递;(2)通过全局变量隐式传递。
数据结构课后习题答案(耿国华版
第1章绪论2、(1)×(2)×(3)√3、(1)A(2)C(3)C5、计算下列程序中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)/66、编写算法,求一元多项式p n(x)=a0+a1x+a2x2+……、+a n x n得值p n(x0),并确定算法中每一语句得执行次数与整个算法得时间复杂度,要求时间复杂度尽可能小,规定算法中不能使用求幂函数.注意:本题中得输入为a i(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<n;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){floatp,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章线性表习题1、填空:(1)在顺序表中插入或删除一个元素,需要平均移动一半元素,具体移动得元素个数与插入或删除得位置有关。
《数据结构——C语言描述》习题及答案 耿国华
第1章绪论习题一、问答题1. 什么是数据结构2. 四类基本数据结构的名称与含义。
3. 算法的定义与特性。
4. 算法的时间复杂度。
5. 数据类型的概念。
6. 线性结构与非线性结构的差别。
7. 面向对象程序设计语言的特点。
8. 在面向对象程序设计中,类的作用是什么9. 参数传递的主要方式及特点。
10. 抽象数据类型的概念。
二、判断题1. 线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。
2. 算法就是程序。
3. 在高级语言(如C、或PASCAL)中,指针类型是原子类型。
三、计算下列程序段中X=X+1的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;[提示]:i=1时:1 = (1+1)×1/2 = (1+12)/2i=2时:1+2 = (1+2)×2/2 = (2+22)/2i=3时:1+2+3 = (1+3)×3/2 = (3+32)/2…i=n时:1+2+3+……+n = (1+n)×n/2 = (n+n2)/2f(n) = [ (1+2+3+……+n) + (12 + 22 + 32 + …… + n2 ) ] / 2=[ (1+n)n/2 + n(n+1)(2n+1)/6 ] / 2=n(n+1)(n+2)/6=n3/6+n2/2+n/3区分语句频度和算法复杂度:O(f(n)) = O(n3)四、试编写算法求一元多项式Pn(x)=a0+a1x+a2x2+a3x3+…a n x n的值P n(x0),并确定算法中的每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能的小,规定算法中不能使用求幂函数。
注意:本题中的输入a i(i=0,1,…,n), x和n,输出为P n(x0).通常算法的输入和输出可采用下列两种方式之一:(1)通过参数表中的参数显式传递;(2)通过全局变量隐式传递。
《数据结构——C语言描述》习题及答案 耿国华
第1章绪论之蔡仲巾千创作习题一、问答题1. 什么是数据结构?2. 四类基本数据结构的名称与含义。
3. 算法的定义与特性。
4. 算法的时间复杂度。
5. 数据类型的概念。
6. 线性结构与非线性结构的不同。
7. 面向对象程序设计语言的特点。
8. 在面向对象程序设计中,类的作用是什么?9. 参数传递的主要方式及特点。
10. 抽象数据类型的概念。
二、判断题1. 线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。
2. 算法就是程序。
3. 在高级语言(如C、或 PASCAL)中,指针类型是原子类型。
三、计算下列程序段中X=X+1的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;[提示]:i=1时:1 = (1+1)×1/2 = (1+12)/2i=2时:1+2 = (1+2)×2/2 = (2+22)/2i=3时:1+2+3 = (1+3)×3/2 = (3+32)/2…i=n时:1+2+3+……+n = (1+n)×n/2 = (n+n2)/2f(n) = [ (1+2+3+……+n) + (12 + 22 + 32 + …… + n2 ) ]/ 2=[ (1+n)n/2 + n(n+1)(2n+1)/6 ] / 2=n(n+1)(n+2)/6=n3/6+n2/2+n/3区分语句频度和算法复杂度:O(f(n)) = O(n3)四、试编写算法求一元多项式Pn(x)=a0+a1x+a2x2+a3x3+…anxn的值Pn(x0),并确定算法中的每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能的小,规定算法中不克不及使用求幂函数。
注意:本题中的输入ai(i=0,1,…,n), x和n,输出为Pn(x0).通常算法的输入和输出可采取下列两种方式之一:(1)通过参数表中的参数显式传递;(2)通过全局变量隐式传递。
耿国华数据结构习题答案全面版
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)/61. 4试编写算法,求p n(x)=a0+a1x+a2x2+…….+a n x n的值p n(x0),并确定算法中每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能小,规定算法中不能使用求幂函数。
注意:本题中的输入为a i(i=0,1,…n)、x和n,输出为P n(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<n;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,…,a n)逆置为(a n,a n-1,…,a1)。
耿国华大数据结构习题问题详解完整版
第一章答案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)/61.4试编写算法,求p n(x)=a0+a1x+a2x2+…….+a n x n的值p n(x0),并确定算法中每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能小,规定算法中不能使用求幂函数。
注意:本题中的输入为a i(i=0,1,…n)、x和n,输出为P n(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<n;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,…,a n)逆置为(a n,a n-1,…,a1)。
耿国华数据结构习题答案完整版
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)/61. 4试编写算法,求p n(x)=a o+a i x+a2X2+ ................ .+a n x n的值P n(x o),并确定算法中每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能小,规定算法中不能使用求幕函数。
注意:本题中的输入为a i(i=0,1,…n) x和n,输出为P n(x o)。
算法的输入和输出采用下列方法( 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<n;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试分别以不同的存储结构实现单线表的就地逆置算法,即在原表的存储空间将线性表 (a i ,a 2,…,a )逆置为(a n ,a n-1,…,ai)o【解答】(1)用一维数组作为存储结构 void in vert(SeqList *L, int *num){int j;ElemType tmp;for(j=0;j<=(* nu m-1)/2;j++) { tmp=L[j];L[j]=L[* nu m-j-1]; L[* num-j-1]=tmp;} }(2 )用单链表作为存储结构L) return; /*链表为空*//*摘下第一个结点,生成初始逆置表 *//*从第二个结点起依次头插入当前逆置表 */C=(a1,b1, an,bn,an+1, a m)当m>n 时,线性表 A 、B 、C 以单链表作为存储结构,且C 表利用A 表和B 表中的结点空间构成。
数据结构---C语言描述-(耿国华)-高等教育出版社出版-课后习题答案
第一章习题答案2、××√3、(1)包含改变量定义的最小范围(2)数据抽象、信息隐蔽(3)数据对象、对象间的关系、一组处理数据的操作(4)指针类型(5)集合结构、线性结构、树形结构、图状结构(6)顺序存储、非顺序存储(7)一对一、一对多、多对多(8)一系列的操作(9)有限性、输入、可行性4、(1)A(2)C(3)C5、语句频度为1+(1+2)+(1+2+3)+…+(1+2+3+…+n)第二章习题答案1、(1)一半,插入、删除的位置(2)顺序和链式,显示,隐式(3)一定,不一定(4)头指针,头结点的指针域,其前驱的指针域2、(1)A(2)A:E、AB:H、L、I、E、AC:F、MD:L、J、A、G或J、A、G(3)D(4)D(5)C(6)A、C3、头指针:指向整个链表首地址的指针,标示着整个单链表的开始。
头结点:为了操作方便,可以在单链表的第一个结点之前附设一个结点,该结点的数据域可以存储一些关于线性表长度的附加信息,也可以什么都不存。
首元素结点:线性表中的第一个结点成为首元素结点。
4、算法如下:int Linser(SeqList *L,int X){ int i=0,k;if(L->last>=MAXSIZE-1){ printf(“表已满无法插入”);return(0);}while(i<=L->last&&L->elem[i]<X)i++;for(k=L->last;k>=I;k--)L->elem[k+1]=L->elem[k];L->elem[i]=X;L->last++;return(1);}5、算法如下:#define OK 1#define ERROR 0Int LDel(Seqlist *L,int i,int k){ int j;if(i<1||(i+k)>(L->last+2)){ printf(“输入的i,k值不合法”);return ERROR;}if((i+k)==(L->last+2)){ L->last=i-2;ruturn OK;}else{for(j=i+k-1;j<=L->last;j++)elem[j-k]=elem[j];L->last=L->last-k;return OK;}}6、算法如下:#define OK 1#define ERROR 0Int Delet(LInkList L,int mink,int maxk){ Node *p,*q;p=L;while(p->next!=NULL)p=p->next;if(mink<maxk||(L->next->data>=mink)||(p->data<=maxk)){ printf(“参数不合法”);return ERROR;}else{ p=L;while(p->next-data<=mink)p=p->next;while(q->data<maxk){ p->next=q->next;free(q);q=p->next;}return OK;}}9、算法如下:int Dele(Node *S){ Node *p;P=s->next;If(p= =s){printf(“只有一个结点,不删除”);return 0;}else{if((p->next= =s){s->next=s;free(p);return 1;}Else{ while(p->next->next!=s)P=p->next;P->next=s;Free(p); return 1;}}}第三章习题答案2、(1)3、栈有顺序栈和链栈两种存储结构。
《数据结构C语言描述》习题及答案耿国华
第1章绪论习题一、问答题1. 什么是数据结构2. 四类基本数据结构的名称与含义。
3. 算法的定义与特性。
4. 算法的时间复杂度。
5. 数据类型的概念。
6. 线性结构与非线性结构的差别。
7. 面向对象程序设计语言的特点。
8. 在面向对象程序设计中,类的作用是什么9. 参数传递的主要方式及特点。
10. 抽象数据类型的概念。
二、判断题1. 线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。
2. 算法就是程序。
3. 在高级语言(如C、或PASCAL)中,指针类型是原子类型。
三、计算下列程序段中X=X+1的语句频度for(i=1;i<=n;i++)for(j=1;j<=i;j++)for(k=1;k<=j;k++)x=x+1;[提示]:i=1时:1 = (1+1)×1/2 = (1+12)/2i=2时:1+2 = (1+2)×2/2 = (2+22)/2i=3时:1+2+3 = (1+3)×3/2 = (3+32)/2…i=n时:1+2+3+……+n = (1+n)×n/2 = (n+n2)/2f(n) = [ (1+2+3+……+n) + (12 + 22 + 32 + …… + n2 ) ] / 2=[ (1+n)n/2 + n(n+1)(2n+1)/6 ] / 2=n(n+1)(n+2)/6=n3/6+n2/2+n/3区分语句频度和算法复杂度:O(f(n)) = O(n3)四、试编写算法求一元多项式Pn(x)=a0+a1x+a2x2+a3x3+…a n x n的值P n(x0),并确定算法中的每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能的小,规定算法中不能使用求幂函数。
注意:本题中的输入a i(i=0,1,…,n), x和n,输出为P n(x0).通常算法的输入和输出可采用下列两种方式之一:(1)通过参数表中的参数显式传递;(2)通过全局变量隐式传递。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 均未显式存储。
【解答】算法如下:
}
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 的出站序列,并说明
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 的头结点*/
.
.
第一章答案 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
通过参数表中的参数显式传递 float PolyValue(float a[ ],
{ float p,s; int i; p=x; s=a[0]; for(i=1;i<=n;i++) {s=s+a[i]*p; p=p*x;} return(p);
float x, int n) /*执行次数:n 次*/
页脚
.
.
} 算法的时间复杂度:T(n)=O(n)
第二章答案
2.7 试分别以不同的存储结构实现单线表的就地逆置算法,即在原表的存储空间将线性表
(a1,a2,…,an)逆置为(an,an-1,…,a1)。
【解答】(1)用一维数组作为存储结构
void invert(SeqList *L, int *num)
原因(即写出以“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)。
出采用下列方法(1)通过参数表中的参数显式传递(2)通过全局变量隐式传递。讨论
两种方法的优缺点,并在算法中以你认为较好的一种实现输入输出。
【解答】
(1)通过参数表中的参数显式传递
优点:当没有调用函数时,不占用存,调用结束后形参被释放,实参维持,函数通用
性强,移置性强。
缺点:形参须与实参对应,且返回值数量有限。
scanf(“%f”,&x);
for(i=0;i<n;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)
/*链表为空*/
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,
{
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;
while(pa!=NULL && { qa=pa->next;
qb=qb->next;
pb!=NULL)
/*利用尾插法建立连接之后的链表*/
页脚
.
.p->nexFra bibliotek=pa; /*交替选择表 A 和表 B 中的结点连接到新链表中;*/
p=pa;
p->next=pb;
p=pb;
pa=qa;
pb=qb;
(2)通过全局变量隐式传递
优点:减少实参与形参的个数,从而减少存空间以及传递数据时的时间消耗
缺点:函数通用性降低,移植性差
算法如下:通过全局变量隐式传递参数
PolyValue()
{ int i,n;
float x,a[],p;
printf(“\nn=”);
scanf(“%f”,&n);
printf(“\nx=”);
1. 4 试编写算法,求 pn(x)=a0+a1x+a2x2+…….+anxn 的值 pn(x0),并确定算法中每一语句的执
行次数和整个算法的时间复杂度,要求时间复杂度尽可能小,规定算法中不能使用求幂
函数。注意:本题中的输入为 ai(i=0,1,…n)、x 和 n,输出为 Pn(x0)。 算法的输入和输
3.3 给出栈的两种存储结构形式名称,在这两种栈的存储结构中如何判别栈空与栈满? 【解答】(1)顺序栈 (top 用来存放栈顶元素的下标)
判断栈 S 空:如果 S->top==-1 表示栈空。 判断栈 S 满:如果 S->top==Stack_Size-1 表示栈满。 (2) 链栈(top 为栈顶指针,指向当前栈顶元素前面的头结点) 判断栈空:如果 top->next==NULL 表示栈空。 判断栈满:当系统没有可用空间时,申请不到空间存放要进栈的元素,此时栈满。