数据结构部分答案耿国华2

合集下载

数据结构_c语言描述(第二版)答案_耿国华_西安电子科技大学

数据结构_c语言描述(第二版)答案_耿国华_西安电子科技大学

A 的头结点 */
while(pa!=NULL && pb!=NULL) /* 利用尾插法建立连接之后的链表 */ { qa=pa->next;
qb=qb->next;
p->next=pa; /*交替选择表 A 和表 B 中的结点连接到新链表中; */ p=pa; p->next=pb; p=pb;
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);
scanf( “ %f ” ,&a[i]); /* 执行次数: n 次 */ p=a[0]; for(i=1;i<=n;i++)
{ p=p+a[i]*x; x=x*x;}
/*执行次数: n 次 */
printf( “ %f” ,p); } 算法的时间复杂度: T(n)=O(n)
通过参数表中的参数显式传递 float PolyValue(float a[ ], float x, int n)
因为有 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)

《数据结构——C语言描述》习题及答案-耿国华-2

《数据结构——C语言描述》习题及答案-耿国华-2

第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语言描述]

数据结构复习题集[耿国华(第二版)版C语言描述]

第一章复习题1.简述顺序存储结构与链式存储结构在表示数据元素之间关系上的主要区别。

答:在顺序结构中,逻辑关系上相邻的两个元素在物理位置上也相邻。

而链式存储结构中,数据元素之间关系是由结点中指针指示的。

2.数据结构是一门……的学科。

3.在数据结构中,从逻辑上可以把数据结构分成〔 C 〕。

A、动态结构与静态结构B、紧凑结构和非紧凑结构C、线性结构和非线性结构D、部结构和外部结构4.编写一个函数,用不多于3n/2的平均比拟次数,在一个数组中找出最大和最小值元素。

void maxmin(int a[],int n){max=min=a[0];for(i=1;i<n;i++){if(a[i]>max) max=a[i];else if(a[i]<min) min=a[i];}printf(“max=%d, min=%d〞,max, min);}第二章复习题1.下述哪一条是顺序存储结构的优点?〔 A 〕A.存储密度大 B.插入运算方便C.删除运算方便 D.可方便地用于各种逻辑结构的存储表示2.下面关于线性表的表达中,错误的选项是哪一个?〔 B 〕A.线性表采用顺序存储,必须占用一片连续的存储单元。

B.线性表采用顺序存储,便于进展插入和删除操作。

C.线性表采用存储,不必占用一片连续的存储单元。

D.线性表采用存储,便于插入和删除操作。

3.线性表是具有n个〔 C 〕的有限序列〔n>=0〕。

A.表元素 B.字符 C.数据元素 D.数据项4.假设某线性表最常用的操作是存取任一指定序号的元素和在最后进展插入和删除运算,那么利用〔 A 〕存储方式最节省时间。

A.顺序表 B.单循环链表C.带头结点的双循环链表 D.双链表5.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,那么采用〔 D 〕存储方式最节省运算时间。

A.单链表 B.仅有头指针的单循环链表C.双链表 D.仅有尾指针的单循环链表6.假设某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点。

(完整版)数据结构_c语言描述(第二版)答案_耿国华_西安电子科技大学

(完整版)数据结构_c语言描述(第二版)答案_耿国华_西安电子科技大学

第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,输出为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章线性表习题1.填空:(1)在顺序表中插入或删除一个元素,需要平均移动一半元素,具体移动的元素个数与插入或删除的位置有关。

数据结构---C语言的描述_课后大部分习题答案

数据结构---C语言的描述_课后大部分习题答案

耿国华《数据结构》程序算法课后答案第二章线性表2.4 设线性表存于a(1:arrsize)的前elenum 个分量中且递增有序。

试写一算法,将X 插入到线性表的适当位置上,以保持线性表的有序性。

Status Insert_SqList(SqList &va,int x)//把x 插入递增有序表va 中{if(va.length+1>va.listsize) return ERROR;va.length++;for(i=va.length-1;va.elem[i]>x&&i>=0;i--)va.elem[i+1]=va.elem[i];va.elem[i+1]=x;return OK;}//Insert_SqList2.6 已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。

试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值为任意的整数)。

Status Delete_Between(Linklist &L,int mink,int maxk)//删除元素递增排列的链表L中值大于mink 且小于maxk 的所有元素{p=L;while(p->next->data<=mink) p=p->next; //p 是最后一个不大于mink 的元素if(p->next) //如果还有比mink 更大的元素{q=p->next;while(q->data<maxk) q=q->next; //q 是第一个不小于maxk 的元素p->next=q;}}//Delete_Between2.7 试分别以不同的存储结构实现线性表的就地逆置算法,即在原表的存储空间将线性表(a, a ..., a )逆置为(a, a ,..., a )。

数据结构课后习题答案(耿国华版

数据结构课后习题答案(耿国华版

第1章绪论2 、(1)×(2)×(3) √3 、(1)A(2)C(3)C5、f or计(算i=下1n程;序中 1 得语句频度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。

(x)=a。

+a,x+a₂X2+……、+a Xn得值p(x) 并确定算法中每一语句得执行次数与整个算法得时间复杂度,要求时间复杂度尽可能小,规定算法中不能使用求幂函数.注意:本题中得输入为a,(i=01,…n)、x 与n,输出为P。

(x)。

算法得输入与输出采用下列方法(1)通过参数表中得参数显式传递(2)通过全局变量隐式传递。

讨论两种方法得优缺点,并在算法中以您认为较好得一种实现输入输出.【解答】(1)通过参数表中得参数显式传递优点:当没有调用函数时,不占用内存,调用结束后形参被释放,实参维持,函数通用性强,移置性强。

缺点:形参须与实参对应,且返回值数量有限。

(2)通过全局变量隐式传递优点:减少实参预形参得个数,从而减少内存空间以及传递数据时得时间消耗缺点:函数通用性降低,移植性差算法如下:通过全局变量隐式传递参数PolyValue({ int,in;floatx,a[]p;pri n tf(hn=”);s c anf(“%f,”&n);printf(“x=”;)sca nf(“%f&x);f or(i=0;i<n; i++)s c anf(%f ,&a[i]; /*执行次数:n 次 */p=a[0];for (i=1;i<=n;i++){ p=p+a [i]*x; /*执行次数:n次*/x= x*x;}prin t f(%f” p);}算法得时间复杂度:T(n)=0(n)通过参数表中得参数显式传递f loat PolyVa lue(float a[ ], float x, i nt n)f 1 oat p, s;int;is p a X0];for(=1;i<= n;i++)/执行次数:n 次*/{s=s+a [i]* p;p=p*x;}re turn(p);算法得时间复杂度:T(n)=O(n)第2章线性表习题1、填空:(1)在顺序表中插入或者删除一个元素,需要平均挪移一半元素,具体挪移得元素个数与插入或者删除得位置有关。

《数据结构——C语言描述》习题及答案 耿国华,DOC

《数据结构——C语言描述》习题及答案 耿国华,DOC

欢迎阅读第1章绪论习题一、问答题1. 什么是数据结构?2. 四类基本数据结构的名称与含义。

3. 算法的定义与特性。

4. 算法的时间复杂度。

5. 数据类型的概念。

6.7.8.9.10.1.2.3.[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) {……}或:实习题1.3x=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)通过全局变量隐式传递。

数据结构-用C语言描述习题及答案-耿国华

数据结构-用C语言描述习题及答案-耿国华
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)/2 i=2 时: 1+2 = (1+2)×2/2 = (2+22)/2 i=3 时: 1+2+3 = (1+3)×3/2 = (3+32)/2
L->elem[ m-k ] = L->elem[ m ]; < 方法 2 > 同时以待移动元素下标 m 和应移入位置 j 为中心: < 方法 3 > 以应移入位置 j 增有序排列,并以单链表作存储结构。试写 一高效算法,删除表中所有大于 mink 且小于 maxk 的元素(若表中存在这样的元 素),分析你的算法的时间复杂度(注意:mink 和 maxk 是给定的两个参变量, 它们的值为任意的整数)。 [提示]:注意检查 mink 和 maxk 的合法性:mink < maxk
第1章 绪 论
习题
一、问答题 1. 什么是数据结构 2. 四类基本数据结构的名称与含义。 3. 算法的定义与特性。 4. 算法的时间复杂度。 5. 数据类型的概念。 6. 线性结构与非线性结构的差别。 7. 面向对象程序设计语言的特点。 8. 在面向对象程序设计中,类的作用是什么 9. 参数传递的主要方式及特点。 10. 抽象数据类型的概念。 二、判断题 1. 线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。 2. 算法就是程序。 3. 在高级语言(如 C、或 PASCAL)中,指针类型是原子类型。 三、计算下列程序段中 X=X+1 的语句频度
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第1章绪论1.4 试编写算法,求一元多项式P n(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)通过全局变量隐式传递。

试讨论这两种方法的优缺点,并在本题算法中以你认为较好的一种方式实现输入和输出。

void polyvalue(){int n,p,i,x,xp,sum;float a[];float *p=a;printf("Input number of terms:");scanf("%d",&n);printf("Input the %d coefficients from a0 to a%d:\n",n,n);for(i=0;i<=n;i++) scanf("%f",p++);printf("Input value of x:");scanf("%f",&x);p=a;xp=1;sum=0; //xp用于存放x的i次方for(i=0;i<=n;i++){sum+=xp*(*p++);xp*=x;}printf("Value is:%f",sum);}//polyvalue第二章线性表2.4设线性表存于a(1:arrsize)的前elenum个分量中且递增有序。

试写一算法,将X插入到线性表的适当位置上,以保持线性表的有序性。

Status Insert_SqList(SqList &va,int x)//把x插入递增有序表va中{if(va.length+1>va.listsize) return ERROR;va.length++;for(i=va.length-1;va.elem[i]>x&&i>=0;i--)va.elem[i+1]=va.elem[i];va.elem[i+1]=x;return OK;}//Insert_SqList2.6已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。

试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值为任意的整数)。

Status Delete_Between(Linklist &L,int mink,int maxk)//删除元素递增排列的链表L 中值大于mink且小于maxk的所有元素{p=L;while(p->next->data<=mink) p=p->next; //p是最后一个不大于mink的元素if(p->next) //如果还有比mink更大的元素{q=p->next;while(q->data<maxk) q=q->next; //q是第一个不小于maxk的元素p->next=q;}}//Delete_Between2.7试分别以不同的存储结构实现线性表的就地逆置算法,即在原表的存储空间将线性表(a1, a2..., an)逆置为(an, an-1,..., a1)。

(1)以一维数组作存储结构,设线性表存于a(1:arrsize)的前elenum个分量中。

(2)以单链表作存储结构。

void reverse(SqList &A)//顺序表的就地逆置{for(i=1,j=A.length;i<j;i++,j--)A.elem[i]<->A.elem[j];}//reverse2.8假设两个按元素值递增有序排列的线性表A和B,均以单链表作为存储结构,请编写算法,将A表和B表归并成一个按元素值递减有序排列的线性表C,并要求利用原表(即A表和B表的)结点空间存放表C。

while(pa||pb){if(pa->data<pb->data||!pb){pc=pa;q=pa->next;pa->next=pre;pa=q; //将A的元素插入新表}else{pc=pb;q=pb->next;pb->next=pre;pb=q; //将B的元素插入新表}pre=pc;}C=A;A->next=pc; //构造新表头}//reverse_merge分析:本算法的思想是,按从小到大的顺序依次把A和B的元素插入新表的头部pc处,最后处理A或B的剩余元素.2.9假设有一个循环链表的长度大于1,且表中既无头结点也无头指针。

已知s 为指向链表某个结点的指针,试编写算法在链表中删除指针s所指结点的前趋结点。

Status Delete_Pre(CiLNode *s)//删除单循环链表中结点s的直接前驱{p=s;while(p->next->next!=s) p=p->next; //找到s的前驱的前驱pp->next=s;return OK;}//Delete_Pre2.10已知有单链表表示的线性表中含有三类字符的数据元素(如字母字符、数字字符和其它字符),试编写算法来构造三个以循环链表表示的线性表,使每个表中只含同一类的字符,且利用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间。

Status LinkList_Divide(LinkList &L,CiList &A,CiList &B,CiList &C)//把单链表L 的元素按类型分为三个循环链表.CiList为带头结点的单循环链表类型.{s=L->next;A=(CiList*)malloc(sizeof(CiLNode));p=A;B=(CiList*)malloc(sizeof(CiLNode));q=B;C=(CiList*)malloc(sizeof(CiLNode));r=C; //建立头结点while(s){if(isalphabet(s->data)){p->next=s;p=s;}else if(isdigit(s->data)){q->next=s;q=s;}else{r->next=s;r=s;}}//whilep->next=A;q->next=B;r->next=C; //完成循环链表}//LinkList_Divide2.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 merge1(LinkList &A,LinkList &B,LinkList &C)//把链表A和B合并为C,A和B的元素间隔排列,且使用原存储空间{p=A->next;q=B->next;C=A;while(p&&q){s=p->next;p->next=q; //将B的元素插入if(s){t=q->next;q->next=s; //如A非空,将A的元素插入}p=s;q=t;}//while}//merge12.12 将一个用循环链表表示的稀疏多项式分解成两个多项式,使这两个多项式中各自仅含奇次项或偶次项,并要求利用原链表中的结点空间来构成这两个链表。

void Divide_LinkedPoly(LinkedPoly &L,&A,&B)//把循环链表存储的稀疏多项式L拆成只含奇次项的A和只含偶次项的B{p=L->next;A=(PolyNode*)malloc(sizeof(PolyNode));B=(PolyNode*)malloc(sizeof(PolyNode));pa=A;pb=B;while(p!=L){if(p->data.exp!=2*(p->data.exp/2)){pa->next=p;pa=p;}else{pb->next=p;pb=p;}p=p->next;}//whilepa->next=A;pb->next=B;}//Divide_LinkedPoly2.14 设多项式P(x)采用课本中所述链接方法存储。

写一算法,对给定的x值,求P(x)的值。

float GetValue_SqPoly(SqPoly P,int x0)//求升幂顺序存储的稀疏多项式的值{PolyTerm *q;xp=1;q=P.data;sum=0;ex=0;while(q->coef){while(ex<q->exp) xp*=x0;sum+=q->coef*xp;q++;}return sum;}//GetValue_SqPoly第3章限定性线性表——栈和队列3.5试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如‘序列1& 序列2’模式的字符序列。

其中序列1和序列2中都不含字符’&’,且序列2是序列1的逆序列。

例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是。

int IsReverse()//判断输入的字符串中'&'前和'&'后部分是否为逆串,是则返回1,否则返回0{InitStack(s);while((e=getchar())!='&')push(s,e);while((e=getchar())!='@'){if(StackEmpty(s)) return 0;pop(s,c);if(e!=c) return 0;}if(!StackEmpty(s)) return 0;return 1;}//IsReverse3.6假设表达式由单字母变量和双目四则运算算符构成。

相关文档
最新文档