数据结构部分课后习题答案_第1页
数据结构部分课后习题答案_第2页
数据结构部分课后习题答案_第3页
数据结构部分课后习题答案_第4页
数据结构部分课后习题答案_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

本文格式为Word版,下载可任意编辑——数据结构部分课后习题答案第一章绪论

一、问答题

1.什么是数据结构?

2.表达四类基本数据结构的名称与含义。3.表达算法的定义与特性。4.表达算法的时间繁杂度。5.表达数据类型的概念。

6.表达线性结构与非线性结构的区别。7.表达面向对象程序设计语言的特点。

8.在面向对象程序设计中,类的作用是什么?9.表达参数传递的主要方式及特点。10.表达抽象数据类型的概念。

二、判断题(在各题后填写“√〞或“×〞)

1.线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。()2.算法就是程序。()

3.在高级语言(如C或PASCAL)中,指针类型是原子类型。()三、计算以下程序段中X=X+1的语句频度

for(i=1;inext=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的有序性。

StatusInsert_SqList(SqListva.length++;

for(i=va.length-1;va.elem[i]>xi--)va.elem[i+1]=va.elem[i];va.elem[i+1]=x;returnOK;}//Insert_SqList

2.5写一算法,从顺序表中删除自第i个元素开始的k个元素。[提醒]:注意检查i和k的合法性。(集体搬迁,“新屋〞、“旧房〞)以待移动元素下标m(“旧房号〞)为中心,计算应移入位置(“新屋号〞):

for(m=i-1+k;mlast;m++)L->elem[m-k]=L->elem[m];

同时以待移动元素下标m和应移入位置j为中心:以应移入位置j为中心,计算待移动元素下标:

2.6已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间繁杂度(注意:mink和maxk是给定的两个参变量,它们的值为任意的整数)。

StatusDelete_Between(Linklist

while(p->next->datanext;//p是最终一个不大于mink的元素if(p->next)//假使还有比mink更大的元素{

q=p->next;

while(q->datanext;//q是第一个不小于maxk的元素p->next=q;}

}//Delete_Between

2.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.

[提醒]:参P.28例2-1

voidmerge(LinkListA;LinkListB;LinkList*C){……

pa=A->next;pb=B->next;*C=A;(*C)->next=NULL;

while(pa!=NULLpa=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;}

LinkListmerge(LinkListA;LinkListB){??

LinkListC;

pa=A->next;pb=B->next;C=A;C->next=NULL;????

returnC;

while(pa||pb)

{

if(pa->datadata||!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所指结点的前趋结点。

[提醒]:设指针p指向s结点的前趋的前趋,则p与s有何关系?

StatusDelete_Pre(CiLNode*s)//删除单循环链表中结点s的直接前驱{p=s;

while(p->next->next!=s)p=p->next;//找到s的前驱的前驱pp->next=s;returnOK;}//Delete_Pre

2.10已知有单链表表示的线性表中含有三类字符的数据元素(如字母字符、数字字符和其它字符),试编写算法来构造三个以循环链表表示的线性表,使每个表中只含同一类的字符,且利用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间。

StatusLinkList_Divide(LinkList

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;}

elseif(isdigit(s->data)){

q->next=s;q=s;}

else{

r->next=s;r=s;}

}//while

p->next=A;q->next=B;r->next=C;//完成循环链表}//LinkList_Divide

2.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均以单链表作为存储结构,且C表利用A表和B表中的结点空间构成。注意:单链表的长度值m和n均未显式存储。

[提醒]:voidmerge(LinkListA;LinkListB;LinkList*C)或:LinkListmerge(LinkListA;LinkListB)

voidmerge1(LinkListq=B->next;C=A;while(pp->next=q;//将B的元素插入if(s){

t=q->next;q->next=s;//如A非空,将A的元素插入}

p=s;q=t;}//while}//merge1

2.12将一个用循环链表表示的稀疏多项式分解成两个多项式,使这两个多项式中各自仅含奇次项或偶次项,并要求利用原链表中的结点空间来构成这两个链表。[提醒]:注明用头指针还是尾指针。

voidDivide_LinkedPoly(LinkedPoly

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;}//while

pa->next=A;pb->next=B;}//Divide_LinkedPoly

2.13建立一个带头结点的线性链表,用以存放输入的二进制数,链表中每个结点的data域存放一个二进制位。并在此链表上实现对二进制数加1的运算。[提醒]:可将低位放在前面。

2.14设多项式P(x)采用课本中所述链接方法存储。写一算法,对给定的x值,求P(x)的值。[提醒]:floatPolyValue(Polylistp;floatx){……}

第三章栈和队列

1.按图3.1(b)所示铁道(两侧铁道均为单向行驶道)进行车厢调度,回复:

⑴如进站的车厢序列为123,则可能得到的出站车厢序列是什么?

⑵如进站的车厢序列为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)。

2.设队列中有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↑F

5.试写一个算法,判断依次读入的一个以@为终止符的字母序列,是否为形如‘序列1

while((e=getchar())!='

while((e=getchar())!='@'){

if(StackEmpty(s))return0;pop(s,c);

if(e!=c)return0;}

if(!StackEmpty(s))return0;return1;}//IsReverse

6.假设表达式由单字母变量和双目四则运算算符构成。试写一个算法,将一个寻常书写形

式(中缀)且书写正确的表达式转换为逆波兰式(后缀)。

voidNiBoLan(char*str,char*new)//把中缀表达式str转换成逆波兰式new{

p=str;q=new;//为便利起见,设str的两端都加上了优先级最低的特别符号

InitStack(s);//s为运算符栈while(*p){

if(*p是字母))*q++=*p;//直接输出else{

c=gettop(s);

if(*p优先级比c高)push(s,*p);else{

while(gettop(s)优先级不比*p低){

pop(s,c);*(q++)=c;}//while

push(s,*p);//运算符在栈内遵循越往栈顶优先级越高的原则}//else}//elsep++;}//while

}//NiBoLan//参见编译原理教材

7.假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设

头指针),试编写相应的队列初始化、入队列和出队列的算法。

voidInitCiQueue(CiQueueQ->next=Q;}//InitCiQueue

温馨提示

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

评论

0/150

提交评论