耿国华课后习题答案_第1页
耿国华课后习题答案_第2页
免费预览已结束,剩余29页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第1章绪论2. (1)XXV3. (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编写算法,求一元多项式pn(x)=ao+a1X+a2X2+.+anxn的值Pn(xo),并确定算法中每一语句的执行次数和整个算法的时间复杂度,要求时间复杂度尽可能小,规定算法中不能使用求幕函数。注意:本题中的输入为ai(i=0,1,n)x和n,输出为Pn(xo

2、)。算法的输入和输出采用下列方法(1)通过参数表中的参数显式传递(2)通过全局变量隐式传递。讨论两种方法的优缺点,并在算法中以你认为较好的一种实现输入输出。【解答】(1)通过参数表中的参数显式传递优点:当没有调用函数时,不占用内存,调用结束后形参被释放,实参维持,函数通用性强,移置性强。缺点:形参须与实参对应,且返回值数量有限。(2)通过全局变量隐式传递优点:减少实参与形参的个数,从而减少内存空间以及传递数据时的时间消耗缺点:函数通用性降低,移植性差算法如下:通过全局变量隐式传递参数PolyValue()inti,n;floatx,a,p;printf(nn=”);scanf(“f”,&

3、;n);printf(nx=”);scanf(“f”,&x);for(i=0;i<n;i+)scanf(“%f”,&ai);/*执行次数:n次*/p=a0;for(i=1;i<=n;i+)p=p+ai*x;/*执行次数:n次*/x=x*x;printf(“f”,p);算法的时间复杂度:T(n)=0(n)通过参数表中的参数显式传递floatPolyValue(floata,floatx,intn)floatp,s;inti;p=x;s=aO;/*执行次数:n次*/for(i=1;i<=n;i+)s=s+ai*p;P=P*x;return(p);算法的时间复杂度:

4、T(n)=0(n)第2章线性表1.填空:(1)在顺序表中插入或删除一个元素,需要平均移动或删除的位置有关。半元素,具体移动的元素个数与插入(2)线性表有顺序和链式两种存储结构。在顺序表中,线性表的长度在数组定义时就已经确定,是静态保存,在链式表中,整个链表由“头指针”来表示,单链表的长度是动态保存。在顺序表中,逻辑上相邻的元素,其物理位置辑上相邻的元素,其物理位置不一定相邻。一定相邻。在单链表中,逻(4)在带头结点的非空单链表中,头结点的存储位置由头指针指示,首元素结点的存储位置由头结点指示,除首元素结点外,其它任一元素结点的存储位置由其直接前趋的next域指示。2.选择题(1) A(2) 已

5、知L是无表头结点的单链表,且P结点既不是首元素结点,求从下列语句中选择合适的语句序列。a. 在P结点后插入S结点的语句序列是:E、A。b. 在P结点前插入S结点的语句序列是:H、L、I、E、A。c. 在表首插入S结点的语句序列是:F、M。也不是尾元素结点。按要d.在表尾插入S结点的语句序列是:L、J、A、G。供选择的语句有:AP->next=S;BP->next=P->next->next;CP->next=S->next;DS->next=P->next;ES->next=L;FS->next=NULL;GQ=P;Hwhile(P-

6、>next!=Q)P=P->next;Iwhile(P->next!=NULL)P=P->next;JP=Q;KP=L;LL=S;ML=P;DDDA7试分别以不同的存储结构实现单线表的就地逆置算法,即在原表的存储空间将线性表(ai,a2,)逆置为(an,an-i,ai)。【解答】(1)用一维数组作为存储结构voidinvert(SeqList*L,int*num)intj;ElemTypetmp;for(j=0;j<=(*num-1)/2;j+)tmp=Lj;Lj=L*num-j-1;L*num-j-1=tmp;voidinvert(LinkListNode*p,

7、*q,*r;if(L->next=NULL)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)用单链表作为存储结构L)return;/*链表为空*/*摘下第一个结点,生成初始逆置表*/*从第二个结点起依次头插入当前逆置表*/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

8、>n时,线性表A、B、C以单链表作为存储结构,且C表利用A表和B表中的结点空间构成。注意:单链表的长度值m和n均未显式存储。【解答】算法如下:LinkListmerge(LinkListA,LinkListB,LinkListC)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-

9、>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)C=A;p->next=pb;/*B的长度大于A的长度*/Return(C);实习题约瑟夫环问题约瑟夫问题的一种描述为:编号1,2,n的n个人按顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任选一个报数上限值m,从第一个人开始顺时针自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人

10、开始重新从1报数,如此下去,直至所有的人全部出列为止。试设计一个程序,求出出列顺序。利用单向循环链表作为存储结构模拟此过程,按照出列顺序打印出各人的编号。例如m的初值为20;n=7,7个人的密码依次是:3,1,7,2,4,8,4,出列顺序为6,1,4,7,2,3,5【解答】算法如下:typedefstructNodeintpassword;intnum;structNode*next;Node,*Linklist;voidJosephus()LinklistL;Node*p,*r,*q;intm,n,C,j;L=(Node*)malloc(sizeof(Node);/*初始化单向循环链表*/i

11、f(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->

12、next=p;r=p;r->next=L->next;printf(”请输入第一个报数上限值m(m>0):");seanf("%d",&m);printf("*printf(”出列的顺序为:n");q=L;p=L->next;while(n!=1)j=1;while(j<m)q=p;p=p->next;j+;printf("%d->",p->num);m=p->password;/*计算出列的顺序*/*计算当前出列的人选p*/*q为当前结点p的前驱结点*/n-;q

13、_>next=p->next;/*p出列*/*获得新密码*/r=p;p=p->next;free(r);printf("%dn",p->num);第3章限定性线性表一栈和队列第三章答案1按3.1(b)所示铁道(两侧铁道均为单向行驶道)进行车厢调度,回答:(1) 如进站的车厢序列为123,则可能得到的出站车厢序列是什么?(2) 如进站的车厢序列为123456,能否得到435612和135426的出站序列,并说明原因(即写出以“S”表示进栈、“X”表示出栈的栈序列操作)。【解答】(1)可能得到的出站车厢序列是:123、132、213、231、321。不能

14、得到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给出栈的两种存储结构形式名称,在这两种栈的存储结构中如何判别栈空与栈满?【解答】(1)顺序栈(top用来存放栈顶元素的下标)判断栈S空:如果S->top=-1表示栈空。判断栈S满:如果S->top=Stack_Size-1表示栈满。(2)链栈(top为栈顶指针,指向当前栈顶元素前面的

15、头结点)判断栈空:如果top->next=NULL表示栈空。判断栈满:当系统没有可用空间时,申请不到空间存放要进栈的元素,此时栈满。4照四则运算加、减、乘、除和幕运算的优先惯例,画出对下列表达式求值时操作数栈和运算符栈的变化过程:A-B*C/D+EfF15【解答】OVSOPTROVSOPTROVSOPTR叩工OFTR咦生成日弋,+H=OPTRl*H、V主成ArT(2)运怪结果1(3)运毎菇果T(1)VSO?TPT(3)OVSD<+>OPTR,/1生成T心TA/ini.O运算结杲OVSOPTR为空'FET右边界fFmOPT忒右边畀第BPTR:十'生咸T+T_1L

16、1运愷结果T(4)TT(3)+运僮结杲T(5>OPTR5写一个算法,判断依次读入的一个以为结束符的字母序列,是否形如序列的字符序列。序列1和序列2中都不含&',且序列2是序列1的逆序列。例如,是属于该模式的字符序列,而1+3&31'则不是。【解答】算法如下:intIsHuiWen()OVSOPTR1&序列2''a+b&b+aStack*S;Charch,temp;InitStack(&S);Printf(n请输入字符序列:”);Ch=getchar();While(ch!=&)Push(&S,ch);

17、ch=getchar();doch=getchar();Pop(&S,&temp);if(ch!=temp)return(FALSE);printf(nNO);while(ch!=if(ch=&&return(TRUE);elsereturn(FALSE);/*lsHuiWen()*/*序列入栈*/*判断序列2是否是序列1的逆序列*/*序列2不是序列1的逆序列*/&&!lsEmpty(&S)IsEmpty(&S)printf(n“ES');printf(nNO);/*序列2是序列1的逆序列*/8要求循环队列不损失一个空间全

18、部都能得到利用,设置一个标志tag,以tag为0或1来区分头尾指针相同时的队列状态的空与满,请编写与此相应的入队与出队算法。【解答】入队算法:intEnterQueue(SeqQueue*Q,QueueElementTypex)/*将元素x入队*/*队满*/*x入队前队空,x入队后重新设置标志*/*设置队尾指针*/QueueElementType*x)/*队空*/*重新设置队头指针*/*队头元素出队后队列为空,重新设置标志域*/1设s='IAMASTUDENT't='GOOD【解答】StrLength(s)=14;SubString(sub1,s,1,7)SubStri

19、ng(sub2,s,7,1)StrIndex(s,4,'A)=6;StrReplace(s,'STUDENT,q);StrCat(StrCat(sub1,t),StrCat(sub2,q)2编写算法,实现串的基本操作【解答】算法如下:StrReplace(S,T,V)。if(Q->front=Q->front&&tag=1)return(FALSE);if(Q->front=Q->front&&tag=0)tag=1;Q->elememtQ->rear=x;Q->rear=(Q->rear+1)%M

20、AXSIZE;Return(TRUE);出队算法:intDeleteQueue(SeqQueue*Q,/*删除队头元素,用x返回其值*/if(Q->front=Q->rear&&tag=0)return(FALSE);*x=Q->elementQ->front;Q->front=(Q->front+1)%MAXSIZE;if(Q->front=Q->rear)tag=0;Return(TUUE);第四章答案q='WORKER。给出下列操作的结果:sub仁'IAMA'sub2=''s='

21、;IAMAWORKER;sub仁'IAMAGOODWORKER。/*串T的长度等于串V的长度*/*用V替换T*/*串T的长度大于串V的长度*/*将S中子串T后的所有字符前移T.len-V.len个位置*/*用V替换T*/intstrReplace(SStringS,SStringT,SStringV)/*用串V替换S中的所有子串T*/intpos,i;pos=strIndex(S,1,T);/*求S中子串T第一次出现的位置*/if(pos=0)return(O);while(pos!=0)/*用串V替换S中的所有子串T*/switch(T.len-V.len)case0:for(i=0

22、;i<=Ven;i+)S->chpos+i=V.chi;case>0:for(i=pos+t.ien;i<S->len;i-)S->chi-t.len+v.len=S->chi;for(i=0;i<=Ven;i+)S->chpos+i=V.chi;S->len=S->len-T.len+V.len;case<0:/*串T的长度小于串V的长度*/*插入后串长小于MAXLEN*/for(i=S->len-T.len+V.len;i>=pos+T.len;i-)S->chi=S->chi-T.len+V.

23、len;for(i=0;i<=V.len;i+)/*用V替换T*/S->chpos+i=V.chi;S->len=S->len-T.len+V.len;else/*替换后串长>MAXLEN,但串V可以全部替换*/if(S->len-T.len+V.len)<=MAXLEN/*将S中子串T后的所有字符后移V.len-T.len个位置*/if(pos+V.len<=MAXLEN)for(i=MAXLEN-1;i>=pos+T.len;i-)/*用V替换T*/*串V的部分字符要舍弃*/*求S中下一个子串T的位置*/S->chi=s->

24、chi-T.len+V.lenfor(i=0;i<=Ven;i+)S->chpos+i=V.chi;S->len=MAXLEN;elsefor(i=0;i<MAXLEN-pos;i+)S->chi+pos=V.chi;S->len=MAXLEN;/*switch()*/pos=Strlndex(S,pos+V.len,T);/*while()*/return(1);/*StrReplace()*/第五章数组和广义表第五章答案1.假设有6行8列的二维数组A,每个兀素占用6个字节,存储器按字节编址。已知A的基地址为1000,计算:(1)数组A共占用多少字节;(2

25、88)(2)数组A的最后一个兀素的地址;(1282)(3)按行存储时,兀素A36的地址;(1126)(4)按列存储时,兀素A36的地址;(1192)4.设有三对角矩阵Azn,将其三条对角线上的兀素逐行的存于数组B1.3n-2中,使得Bk=aj,求:(1)用i,j表示k的下标变换公式;(2)用k表示i、j的下标变换公式。【解答】(1)k=2(i-1)+j(2) i=k/3+1,j=k/3+k%3(取整,%取余)5.在稀疏矩阵的快速转置算法5.2中,将计算positioncol的方法稍加改动,使算法只占用一个辅助向量空间。【解答】算法(一)FastTransposeTSMatrix(TSMartr

26、ixA,TSMatrix*B)/*把矩阵A转置到B所指向的矩阵中去,矩阵用三元组表表示*/intcol,t,p,q;intpositionMAXSIZE;B->len=A.len;B->n=A.m;B->m=A.n;if(B->len>0)position1=1;for(t=1;t<=A.len;t+)positionA.datat.col+1+;/*positioncol存放第col-1列非零元素的个数即利用poscol来记录第col-1列中非零元素的个数*/*求col列中第一个非零元素在B.data的位置,存放在positioncol中*/for(col

27、=2;col<=A.n;col+)positioncol=positioncol+positioncol-1;for(p=1;p<Aen;p+)col=A.datap.col;q=positioncol;B->dataq.row=A.datap.col;B->dataq.col=A.datap.row;B->dataq.e=A.datap.e;Positioncol+;算法(二)FastTransposeTSMatrix(TSMartrixA,TSMatrix*B)intcol,t,p,q;intpositionMAXSIZE;B->len=A.len;B-

28、>n=A.m;B->m=A.n;if(B->len>0)for(col=1;col<=A.n;col+)positioncol=0;for(t=1;t<=A.len;t+)positionA.datat.col+;/*计算每一列的非零元素的个数*/*从最后一列起求每一列中第一个非零元素在B.data中的位置,存放在positioncol中*/for(col=A.n,t=A.len;col>0;col-)t=t-positioncol;positioncol=t+1;for(p=1;p<Aen;p+)col=A.datap.col;q=positi

29、oncol;B->dataq.row=A.datap.col;B->dataq.col=A.datap.row;B->dataq.e=A.datap.e;Positioncol+;8.画出下面广义表的两种存储结构图示:(a),b),(),d),(e,f)【解答】9.求下列广义表运算的结果:(1)HEAD(a,b),(c,d);(a,b)(2)TAIL(a,b),(c,d);(c,d)(3)TAILHEAD(a,b),(c,d);(b)(4)HEADTAILHEAD(a,b),(c,d);b(5)TAILHEADTAIL(a,b),(c,d);(d)1'1A10e0f第

30、一种存储结构第二种存储结构第六章第六章答案6.1分别画出具有3个结点的树和3个结点的二叉树的所有不同形态。【解答】具有3个结点的树具有3个结点的二叉树6.3已知一棵度为的结点,则该树中有多少个叶子结点?【解答】设树中结点总数为n,则n=n°+ni+nk,nk个度为k树中分支数目为B,则B=ni+2n2+3n3+knk因为除根结点外,每个结点均对应一个进入它的分支,所以有n=B+1即no+ni+nk=ni+2n2+3n3+knk+1由上式可得叶子结点数为:n0=n2+2n3+(k-1)nk+16.5已知二叉树有50个叶子结点,则该二叉树的总结点数至少应有多少个?【解答】no表示叶子结点

31、数,n2表示度为2的结点数,则no=n2+1所以n2=no-1=49,当二叉树中没有度为1的结点时,总结点数n=n0+n2=996.6试分别找出满足以下条件的所有二叉树:(1) 前序序列与中序序列相同;(2) 中序序列与后序序列相同;(3) 前序序列与后序序列相同。【解答】(1) 前序与中序相同:空树或缺左子树的单支树;(2) 中序与后序相同:空树或缺右子树的单支树;(3) 前序与后序相同:空树或只有根结点的二叉树。6.9假设通讯的电文仅由8个字母组成,字母在电文中出现的频率分别为:0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10请为这8个字母设计哈夫曼编码。【解

32、答】构造哈夫曼树如下:.00.320.190.210.600280.1100.050.0510n.02003Ii哈夫曼编码为:I010,070.10Li0J701:11111I5:11002:11110I6:103:1110I7:014:1101I8:00III【解答】(d)6.16分别写出算法,实现在中序线索二叉树(即T中查找给定结点*p在中序序列中的前驱与后继。在先序线索二叉树T中,查找给定结点*p在先序序列中的后继。在后序线索二叉树17中,查找给定结点*p在后序序列中的前驱。(1)找结点的中序前驱结点BiTNode*lnPre(BiTNode*p)/*在中序线索二叉树中查找p的中序前驱结

33、点,并用pre指针返回结果*/if(p->Ltag=1)pre=p->LChild;/*直接利用线索*/else/*在p的左子树中查找“最右下端”结点*/for(q=p->LChild;q->Rtag=0;q=q->RChild);pre=q;return(pre);(2)找结点的中序后继结点BiTNode*lnSucc(BiTNode*p)/*在中序线索二叉树中查找p的中序后继结点,并用succ指针返回结果*/if(p->Rtag=1)succ=p->RChild;/*直接利用线索*/else/*在p的右子树中查找“最左下端”结点*/for(q=p-

34、>RChild;q->Ltag=0;q=q->LChild);succ=q;return(succ);(3) 找结点的先序后继结点BiTNode*PreSucc(BiTNode*p)/*在先序线索二叉树中查找p的先序后继结点,并用succ指针返回结果*/if(p->Ltag=0)succ=p->LChild;elsesucc=p->RChild;return(succ);(4) 找结点的后序前驱结点BiTNode*SuccPre(BiTNode*p)/*在后序线索二叉树中查找p的后序前驱结点,并用pre指针返回结果*/if(p->Ltag=1)pre=

35、p->LChild;elsepre=p->RChild;return(pre);6.20已知二叉树按照二叉链表方式存储,利用栈的基本操作写出先序遍历非递归形式的算法。【解答】VoidPreOrder(BiTreeroot)/*先序遍历二叉树的非递归算法*/InitStack(&S);p=root;while(p!=NULL|!IsEmpty(S)if(p!=NULL)Visit(p->data);push(&S,p);p=p->Lchild;elsePop(&S,&p);p=p->RChild;6.26二叉树按照二叉链表方式存储,编

36、写算法将二叉树左右子树进行交换。【解答】算法(一)Voidexchange(BiTreeroot)p=root;if(p->LChild!=NULL|p->RChild!=NULL)temp=p->LChild;p->LChild=p->RChild;p->RChild=temp;exchange(p->LChild);exchange(p->RChild);算法(二)Voidexchange(BiTreeroot)p=root;if(p->LChild!=NULL|p->RChild!=NULL)exchange(p->LCh

37、ild);exchange(p->RChild);temp=p->LChild;p->LChild=p->RChild;p->RChild=temp;第八章第八章答案8.18.5【解答】FebMarAprJune31SepOctAugJulyDec(1AsLsucc=(1+2X2+3X3+4X3+5X2+6Nov)/12=3.5(2)排序为:Apr,Aug,Dec,Feb,Jan,July,June,Mar,May,Nov,Oct,Sep折半查找ASLsucc=(1+2X2+3X4+4X5)/12=37/128.12【解答】哈希表为:234567891001224

38、1300153461367冲突计算次数(1)旦)(2)(1)何ASLSUCC=(1X4+2X3+6)/8=2ASLCC=(2+1+8+7+6+5+4+3+2+1+1)/11=40/11f87第一章绪论一、问答题1. 什么是数据结构?2. 叙述四类基本数据结构的名称与含义。3. 叙述算法的定义与特性。4. 叙述算法的时间复杂度。5. 叙述数据类型的概念。6. 叙述线性结构与非线性结构的差别。7. 叙述面向对象程序设计语言的特点。8. 在面向对象程序设计中,类的作用是什么?9. 叙述参数传递的主要方式及特点。10. 叙述抽象数据类型的概念。二、判断题(在各题后填写或“x)”1. 线性结构只能用顺序

39、结构来存放,非线性结构只能用非顺序结构来存放。(”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)/2i=n时:1+2+3+n=(1+n)/=!/&+n2)/2x=x+1的语句频度为:f(n)=(1+2+3+n)+(12+2

40、2+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),和n,输出为Pn(x0)。通常算法的输入和输出可采用下列两种方式之一:(1) 通过参数表中的参数显式传递。(2) 通过全局变量隐式传递。试讨论这两种方法的优缺点,并在本题算

41、法中以你认为较好的一种方式实现输入和输出【解答】(1) 通过参数表中的参数显式传递优点:当没有调用函数时,不占用内存,调用结束后形参被释放,实参维持,函数通用性强,移置性强。缺点:形参须与实参对应,且返回值数量有限。(2) 通过全局变量隐式传递优点:减少实参与形参的个数,从而减少内存空间以及传递数据时的时间消耗缺点:函数通用性降低,移植性差算法如下:通过全局变量隐式传递参数PolyValue()inti,n;floatx,a,p;printf(n“n=”);scanf(“%f”,&n);printf(n“x=”);scanf(“%f”,&x);for(i=0;i<n;i+

42、)scanf(“%f”,&ai);/*执行次数:n次*/p=a0;for(i=1;i<=n;i+)p=p+ai*x;/*执行次数:n次*/x=x*x;printf(“%f”,p);算法的时间复杂度:T(n)=O(n)通过参数表中的参数显式传递floatPolyValue(floata,floatx,intn)floatp,s;inti;p=x;s=a0;for(i=1;i<=n;i+)s=s+ai*p;/*执行次数:n次*/p=p*x;return(p);算法的时间复杂度:T(n)=O(n)第二章线性表2.1 描述以下三个概念的区别:头指针,头结点,首元素结点。2.2 填空

43、:(1) 在顺序表中插入或删除一个元素,需要平均移动一半元素,具体移动的元素个数与插入或删除的位置有关。(2) 在顺序表中,逻辑上相邻的元素,其物理位置相邻。在单链表中,逻辑上相邻的元素,其物理位置相邻。(3) 在带头结点的非空单链表中,头结点的存储位置由指示,首元素结点的存储位置由指示,除首元素结点外,其它任一元素结点的存储位置由其直接前趋的next域指示。2.3 已知L是无表头结点的单链表,且P结点既不是首元素结点,也不是尾元素结点。按要求从下列语句中选择合适的语句序列。a. 在P结点后插入S结点的语句序列是:_(4)、(1)_。b. 在P结点前插入S结点的语句序列是:(7)、(11)、(

44、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;

45、(10)P=Q;(11)P=L;(12)L=S;(13)L=P;2.4 已知线性表L递增有序。试写一算法,将X插入到L的适当位置上,以保持线性表L的有序性。StatusInsert_SqList(SqList&va,intx)/把x插入递增有序表va中if(va.length+1>va.listsize)returnERROR;va.length+;for(i=va.length-1;va.elemi>x&&i>=0;i-)va.elemi+1=va.elemi;va.elemi+1=x;return103fOK;/Insert_SqList2.5 写

46、一算法,从顺序表中删除自第i个元素开始的k个元素。提示:注意检查i和k的合法性。(集体搬迁,“新房”、“旧房”)<方法1>以待移动元素下标m(旧房号”)为中心,计算应移入位置(“新房号”):for(m=i1+k;m<=L>last;m+)L>elemmk=L>elemm;<方法2>同时以待移动元素下标m和应移入位置j为中心:<方法2>以应移入位置j为中心,计算待移动元素下标:2.6 已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分

47、析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值为任意的整数)。StatusDelete_Between(Linklist&L,intmink,intmaxk)/删除元素递增排列的链表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-&g

48、t;next=q;/Delete_Between2.7 试分别以不同的存储结构实现线性表的就地逆置算法,即在原表的存储空间将线性表(a1,a2.,an)逆置为(an,an-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.提示:参

49、P.28例2-1<方法1>voidmerge(LinkListA;LinkListB;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;elsesmaller=pb;pb=pb>next;smaller>next=(*

50、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>LinkListmerge(LinkListA;LinkListB)LinkListC;pa=A>next;pb=B>next;C=A;C&g

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

52、结点也无头指针。已知某个结点的指针,试编写算法在链表中删除指针s所指结点的前趋结点。提示:设指针p指向s结点的前趋的前趋,贝Up与s有何关系?StatusDelete_Pre(CiLNode*s)删除单循环链表中结点s的直接前驱p=s;while(p->next->next!=s)p=p->next;II找至Us的前驱的前驱pp->next=s;returnOK;/Delete_Pre2.10已知有单链表表示的线性表中含有三类字符的数据元素(如字母字符、数字字符和其它字符),试编写算法来构造三个以循环链表表示的线性表,使每个表中只含同一类的字符,且利用原表中的结点空间作

53、为这三个表的结点空间,头结点可另辟空间。StatusLinkList_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->dat

54、a)p_>next=s;p=s;elseif(isdigit(s->data)q_>next=s;q=s;elser->next=s;r=s;/whilep->next=A;q->next=B;r->next=C;/完成循环链表/LinkList_Divide2.11设线性表A=(a1,a2,am,B=(b1,b2,bn)试写一个按下列规则合并A、B为线性表C的算法,使得:C=(a1,b1,am,bm,bm+1,bn当m<n时;或者C=(a1,b1,an,bn,an+1,am)当m>n时。线性表A、B、C均以单链表作为存储?103f峁梗褻表利用A表和B表中的结点空间构成。注意:单链表的长度值m和n均未显式存储。提示:voidmerge(LinkListA;LinkListB;LinkList*C)或:LinkListmerge(LinkListA;LinkListB)voidmerge1(LinkList&A,Li

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论