数据结构____用C语言描述__课后答案.pdf
《数据结构____用C语言描述__课后答案.pdf》由会员分享,可在线阅读,更多相关《数据结构____用C语言描述__课后答案.pdf(59页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第 一 章 绪 论课堂习题1、试写一算法,自大到小依次输出顺序读入的三个整数X,Y和 Z 的值。【解答】一解:IFXvY XY;IF YZ YZ;IF XY XY;此算法最坏情况下比较3 次,移动(即赋值9 次)二解:IF XY TEMP=X;X=Y;Y=TEMP;IFYTEMPY=TEMPELSEY=X;X=TEMP;此算法最坏情况下比较3 次,移动7 次三解:IFXZ XYELSE XZ;ELSEIF XZ XZ;IFYZ Y-Z;此算法最坏情况下比较3 次,移动6 次2、抽象数据类型三元组的定义、表示和实现【解答】抽象数据类型三元组的定义已经给出(见教材12页),要求设计实现三元组基本操
2、作的演示程序。#include#include typedef int ElemType;typedef ElemType Triplet;typedef int Status;#define OK 1#define ERROR 0#define OVERFLOW-2Status InitTriplet(Triplet*T)ElemType vl,v2,v3;*T=(ElemType*)malloc(3*sizeof(ElemType);if(*T=0)return(OVERFLOW);scanf(M%d,%d,%dn,&vl,&v2,&v3);(*T)0=v 1;(*T)1 =v2;(*T)
3、2=v3;IStatus DestroyTriplet(Triplet*T)(free(*T);町=NULL;Status Get(Triplet T,int i,ElemType*e)(if(i3)return ERROR;*e=Ti-l;return OK;)Status Put(Triplet T,int i,ElemType e)(if(i3)return ERROR;(*T)i-l=e;return OK;)Status IsAscending(Triplet T)(retum(TlOT 1 )&(T 1 JTl)&(T1 T2);)Status Max(Triplet T,Elem
4、Type*e)(*e=(T0=Tl?(T0=T2)?T0:T):(T1=T2)?T1:T2);return OK;)Status Min(Triplet T,ElemType*e)(*e=(T0=Tl?(T0=T2)?T0:T2):(Tl=T2)?Tl:T2);return OK;void main()Triplet T;ElemType e;int select,i;printf(请输入三个数,建立一-个三元组:n);if(InitTriplet(&T)=O VERFLOW)printf(存储空间分配失败,退出程序n“);else(do(printf(MI:取三元组第I 个元素n);prin
5、tf(2:修改三元组第I 个元素n”);printf(3:判断三元组元素是否递增n);printfC4:判断三元组元素是否递减n);printf(n5:取三元组最大元n);printf(n6:取三元组最小元n);printf(nO:结束n);scanf(&d,&select);switch(select)(case 1:printf(nni=n);scanf(n%d,&i);if(Get(T,i,&e)=ERROR)printf(I 值输入不合法n);else printf(第 I 个元素的值为dn”,e);break;case 2:printf(,ni=H);scanf(n%dH,&i);p
6、rintf(nne=);scanf(%d,&e);if(Put(T,i,e)=ERROR)p printf(I 值输入不合法n);else printf(”新三元组为:%4d%4d%4dnT0,Tl,T2);break;case 3:if(IsAscending(T)=1)printf(三元组递增有序 n”);else printf(三元组非递增 n”);break;case 4:if(IsDescending(T)=1)printf(三元组递减有序 n”);else printf(三元组非递减 n);break;case 5:Max(T,&e);printf(三元组的最大元为%(111”,)
7、;break;case 6:Min(T,&e);printf(三元组的最小元为%dn,e);break;case 0:printf(操作结束n);break;default:printf(选择出错,请输入数字(06)n)while(select!=0);DestroyTriplet(&T);课后练习一、问答题1.什么是数据结构?2.叙述四类基本数据结构的名称与含义。3.叙述算法的定义与特性。4.叙述算法的时间复杂度。5.叙述数据类型的概念。6.叙述线性结构与非线性结构的差别。7.叙述面向对象程序设计语言的特点。8.在面向对象程序设计中,类的作用是什么?9.叙述参数传递的主要方式及特点。1 0.
8、叙述抽象数据类型的概念。二、判断题(在各题后填写“J”或“X”)1.线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。()2.算法就是程序。()3.在高级语言(如C 或 PASCAL)中,指针类型是原子类型。()三、计算下列程序段中X=X+1的语句频度for(i=l;i=n;i+)for(j=l;jv=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四、试编写算法,求 元 多 项 式 Pn(x)=ao+atx+a2x2+a3x3+.a”x的值Pn(x(),并自
9、定算法中的每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能小,规定算法中不能使用求暴函数。注意:本题中的输入ai(i=0,I”.,n),x和 n,输出为Pn(x()。通常算法的输入和输出可采用F 列两种方式之一:(1)通过参数表中的参数显式传递。(2)通过全局变量隐式传递。试讨论这两种方法的优缺点,并在本题算法中以你认为较好的一种方式实现输入和输出【解答】(1)通过参数表中的参数显式传递优点:当没有调用函数时,不占用内存,调用结束后形参被释放,实参维持,函数通用性强,移置性强。缺点:形参须与实参对应,且返回值数量有限。(2)通过全局变量隐式传递优点:减少实参与形参的个数,从而减少
10、内存空间以及传递数据时的时间消耗缺点:函数通用性降低,移植性差算法如下:通过全局变量隐式传递参数PolyValue()int i,n;float x,a,p;printf(,nn=);scanf(%f,&n);printf(unx=);scanf(B%f,&x);for(i=0;in;i+)scanf(f/*执行次数:n 次*/P=a0;for(i=1;i=n;i+)p=p+ai*x;/*执行次数:n 次*/x=x*x;printf(f”,p);)算法的时间复杂度:T(n)=O(n)通过参数表中的参数显式传递float PolyValue(float a,float x,int n)(floa
11、t p,s;inti;p=x;s=a0;for(i=1;iPRIOR;因此可直接将*P 删除掉,其时间复杂度为0(1);在单循环链表中,可 从 P 结点依次扫描到其前驱结点,故也能删除掉该结点,其时间复杂度为O(N)o2、下述算法的功能是什么?LINKLIST DEM0(LINKLIST L)其中L 为带头指针的单链表 LISTNODE*Q,*P;IF(L&L-NEXT)(Q=L;L=L-NEXT;P=L;WHILE(P-NEXT)P=P-NEXT;P-NEXT=Q;Q-NEXT=NULL;)RETURN L【解答】当 L 是空链表或仅有一个结点时,L 不变;当 L 有两个或两个以上结点时,将
12、第一个结点移至链表最后,关指针指向原第二个结点。3、试分别用顺序表和单链表作为存储结构,实现线性表的就地逆置。【解答】顺序表 VOID REVERSELIST(SQLIST*L)DATATYPE T;INT I,J;FOR(I=0;ILENGTH/2-1 ;I+)J=L-LENGTH-1-I;T=L-ELEMI;L-ELEMI=L-ELEMJ;L-ELEMJ=T;单链表 VOID REVERSELIST(LINKLIST*L)LNODE*P,*Q;P=L-NEXT;L-NEXT=NULL;WHILE(P)Q=P-NEXT;P-NEXT=L-NEXT;L-NEXT=P;P=Q;)4、设顺序表L
13、是一个递增有序表,试写一算法将X 插入到L 中,并使得L 仍是一个有序表。【解答】VOID INSERTSOR(SQLIST*L,DATATYPE X)INT I;IF(L-LENGTH=LISTSIZE)RETURN ERROR;I=L-LENGTH-1;WHILE(I=O&L-DATAIJX)L-ELEMI+1=L-ELEMI;I-;L-ELEMI+1J=X;L-LENGTH+;)5、已知L I和 L2分别指向两个单链表的头结点,且已知其长度分别为M 和 N,试写一算法将两个链表连接在一起,请分析算法的时间复杂度。【解答】LINKLIST CONNECT(LINKLIST LI,LINKL
14、IST L2,INT M,INT N)LISTNODE*P,*Q;INT K;IF(MN)K=N;P=L2;Q=L1;ELSEK=M;P=L2;Q=L2;WHILE(K0)P=P-NEXT;K-;P-NEXT=Q-NEXT;FREE(Q);IF(MN)RETURN L2;ELSE RETURN LI;6、写一算法将单链表中值重复的结点删除,使所得的结果表中各结点值各不相同。【解答】VOID DELSAMENODE(LINKLIST L)LISTNODE*P,*Q,*R;P=L-NEXT;WHILE(P)Q=P;R=Q-NEXT;WHILE(R)IF R-DATA=P-DATAQ-NEXT=R-
15、NEXT;R=Q-NEXT;ELSEQ=R;R=R-NEXT;)P=P-NEXT;)7、假设在长度大于1 的单循环链表中,既无头结点也无头指针,S 为指向表中某个结点的指针,试编写算法删除结点*S 的直接前驱结点。【解答】VOID DELETEFNODE(LISTNODE*S)LISTNODE*P,*Q;P=S;WHILE(P-NEXT!=S)Q=P;P=P-NEXT;Q-NEXT=S;FREE(P);)8、狐狸逮兔子问题围绕着山顶有10个圆形排列的洞,狐狸要吃兔子逸子说:可以,但必须找到我,我就藏身于 这 10个洞中,你先到1 号洞找,第二次隔1 个洞,(即3 号洞)找,第三次就隔2 个洞(
16、即6 号洞找),以后如此类推,次数不限.”但狐狸从早到晚进进出出了 1000次,仍没有找到兔子,问兔子究竟藏在哪个洞里?【解答】#include ustdio.h#include stdlib.h#define OK 1#define OVERFLOW-2#define LIST_INIT_SIZE 10typedef int status;typedef int elemtype;typedef struct elemtype*elem;int length;int listsize;sqlist;status initlist_sq(sqlist*1)(l-elem=(elemtype*)
17、malloc(LIST_INIT_SIZE*sizeof(elemtype);if(!(l-elem)return OVERFLOW;l-length=O;l-listsize=LIST_INIT_SIZE;return OK;)status rabbit(sqlist*1)(int i,current=O;for(i=0;ielemi=l;l-elem0=0;for(i=2;ielemcurrent=O;)printf(nthe hole are:);for(i=0;ielemi=l)printf(H%d M,i+1);return OK;)main()(sqlist 1;initlist_
18、sq(&l);rabbit(&l);getch();)9、约瑟夫问题设有N 个人围坐在圆桌周围,现从某个位置M(1=M=l;i-)(p=(cnode*)malloc(sizeof(cnode);if(p=null)return OVERFLOW;p-data=i;p-next=clist;clist=p;if(i=n)q=p;)q-next=clist;joseph=clist;return ok;)status joseph(cnode*clist,int m,int n,int k)(int i;cnode*p,*q;if(mn)return ERROR;if(!create_clist(
19、clist,n)return ERROR;p=joseph;for(i=l;inext;while(p)for(i=1 ;inext;q=p-next;printf(n%d n,q-data);if(p-next=p)p=null;else p-next=q-next;p=p-next;free(q);clist=null;main()(int m,n,k,i;cnode*clist;clist=null;printf(nplease input the number of people:);scanf(d”,&n);printf(nplease input the position star
20、t:1);scanf(n%dn,&m);printf(nnplease input the NO.out:);scanf(d”,&k);create_clist(clist,n);printf(MnTHE OUT LINE:n);joseph(clist,m,n,k);getch();课后练习一、术语理解描述以下三个概念的区别:头指针,头结点,首元素结点。二、填空题(1)在顺序表中插入或删除一个元素,需要平均移动 元素,具体移动的元素个数与 有关。(2)在顺序表中,逻辑上相邻的元素,其物理位置 相邻。在单链表中,逻辑上相邻的元素,其物理位置_ _ _ _ _ _ _ _ _ _ _ _ _ 相
21、邻。(3)在带头结点的非空单链表中,头结点的存储位置由 指示,首元素结点的存储位置由 指示,除首元素结点外,其它任一元素结点的存储位置由 指示。三、已知L是无表头结点的单链表,且 P 结点既不是首元素结点,也不是尾元素结点。按要求从下列语句中选择合适的语句序列。a.在 P 结点后插入S 结点的语句序列是:ob.在 P 结点前插入S 结点的语句序列是:,c.在表首插入S 结点的语句序列是:d.在表尾插入S 结点的语句序列是:O供选择的语句有:(1)P-n e xt=S;(2)P-n e xt=P-n e xt-n e xt;(3)P-n e xt=S-n e xt;(4)S-n e xt=P-n
22、 e xt;(5)S-n e xt=L;(6)S-n e xt=N U L L;(7)Q=P;(8)wh i l e(P-n e xt!=Q)P=P-n e xt;(9)wh i l e(P-n e xt!=N U L L)P=P-n e xt;(1 0)P=Q;(1 1)P=L;(1 2)L=S;(1 3)L=P;四、设线性表存于a(l:a r r si ze)的前e l e n u m 个分量中且递增有序。试写一算法,将 X 插入到线性表的适当位置上,以保持线性表的有序性。五、写一算法,从顺序表中删除自第i 个元素开始的k个元素。六、已知线性表中的元素(整数)以值递增有序排列,并以单链表作
23、存储结构。试写一高效算法,删除表中所有大于m i n k 且小于m a xk 的元素(若表中存在这样的元素),分析你的算法的时间复杂度(注意:m i n k 和 m a xk 是给定的两个参变量,它们的值为任意的整数)。七、试分别以不同的存储结构实现线性表的就地逆置算法,即在原表的存储空间将线性表(a i,a2.,a)逆 置 为(a,a-i,.,a O o(1)以一维数组作存储结构,设线性表存于a(l :a r r si ze)的前e l e n u m 个分量中。(2)以单链表作存储结构。八、假设两个按元素值递增有序排列的线性表A和 B,均以单链表作为存储结构,请编写算法,将 A表和B表归并
24、成个按元素值递减有序排列的线性表C,并要求利用原表(即A表和B表的)结点空间存放表C。九、已知有单链表表示的线性表中含有三类字符的数据元素(如字母字符、数字字符和其它字符),试编写算法来构造三个以循环链表表示的线性表,使每个表中只含同一类的字符,且利用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间。十、设线性表A=(a ,a 2,a m),B=(b,b2,.,bn),试写一个按下列规则合并A、B为线性表C的算法,使得:C=,b l,a m,b m,b m+1.,b n)当 m W n 时;或者 C=(ah b,.,an,bn,an+1,当 m n 时。线性表A、B、C均以单链表作为存
25、储结构,且 C表利用A表和B 表中的结点空间构成。注意:单链表的长度值m 和 n 均未显式存储。十一、将一个用循环链表表示的稀疏多项式分解成两个多项式,使这两个多项式中各自仅含奇次项或偶次项,并要求利用原链表中的结点空间来构成这两个链表。十二、建立一个带头结点的线性链表,用以存放输入的二进制数,链表中每个结点的d a t a域存放一个二进制位。并在此链表上实现对二进制数加1 的运算。十三、设多项式P(x)采用课本中所述链接方法存储。写一算法,对给定的x 值,求 P(x)的值。十三、顺序表基本操作实现【解答】include“stdlib.h#define LISTJNIT_SIZE 100#de
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 _ 语言 描述 _ 课后 答案
限制150内