数据结构 习题.docx

上传人:b****8 文档编号:29628653 上传时间:2023-07-25 格式:DOCX 页数:81 大小:234.49KB
下载 相关 举报
数据结构 习题.docx_第1页
第1页 / 共81页
数据结构 习题.docx_第2页
第2页 / 共81页
数据结构 习题.docx_第3页
第3页 / 共81页
数据结构 习题.docx_第4页
第4页 / 共81页
数据结构 习题.docx_第5页
第5页 / 共81页
点击查看更多>>
下载资源
资源描述

数据结构 习题.docx

《数据结构 习题.docx》由会员分享,可在线阅读,更多相关《数据结构 习题.docx(81页珍藏版)》请在冰豆网上搜索。

数据结构 习题.docx

数据结构习题

第一章概论1

第二章线性表7

第三章栈和队列15

第四章串24

第五章数组和广义表30

第六章树37

第七章图48

第八章查找60

第九章排序71

第一章概论

一、选择题

1.算法指的是

A.计算机程序B.解决问题的计算方法

C.排序方法案D.解决问题步骤的有限序列

2.平均时间复杂度是指所有可能的输入实例均以

A.等概率出现的情况下,算法的期望运行时间

B.不等概率出现的情况下,算法的期望运行时间

C.最坏情况下,算法的期望运行时间

D.最好情况下,算法的期望运行时间

3.通过建立结点的关键字与存储地址之间的映像关系所实现的存储方法是

A.顺序存储B.链式存储

C.索引顺序存储   D.散列存储方法

4.数据的运算是数据结构不可分割的一个方面,根据运算集合及运算的性质不同

A.可以形成不同的数据结构 B.不会导致不同的数据结构

C.逻辑结构将发生变化 D.逻辑结构、存储结构都将会发生变化

5.数据的基本单位是

A.数据对象 B.数据元素

C.数据项D.数据类型

6.线性结构是一种(  )

A  一对一的关系          B  一对多的关系

C  多对一的关系          D  多对多的关系

7.链式存储结构存储元素的存储单元的地址(  )

A  必须是连续的          B  必须是不连续的

C  可以连续也可以不连续      D  与顺序存储结构相同

8.评价一个算法优劣除了要考虑正确性、易读性和健壮性外,还应考虑(  )

A  时间效益和空间效率       B  空间效率

C  时间效益            D  软硬件环境

9.设计算法时,应辟免使算法的时间复杂度为(  )

A  常量阶             B  线性阶

C  二次阶             D  指数阶

10.程序段如下

for(i=1;i

{for(j=1;j

y++;

该算法的时间复杂度为(  )

A  O

(1)               B  O(n)

C  O(n2)               D  O(lgn)

二、填空题

1.数据的逻辑结构与数据元素本身的和形式无关。

2.数据结构包含三方面的内容,分别是、、。

3.数据元素是数据的基本单位,数据项是数据的。

4.算法的时间复杂度不仅与问题的规模n有关,还与有关。

5.顺序存储结构中逻辑上相邻的元素在物理位置上。

6.数据的逻辑结构是从逻辑关系上描述数据,它与数据的无关,是独立于计算机的。

7.最坏情况下算法的时间复杂度是算法在任何输入实例上运行时间的。

8.算法具有的五个重要特性是有效性、、输入和输出。

9.数据的存储结构的基本存储方法是顺序存贮、链式存储、和。

10.设有三个函数f,g,h分别是

f(n)=100n3+n2+1000g(n)=25n3+5000n2h(n)=

+5000nlgn

请判断下列关系式成立的是。

(1)f(n)=O(g(n))

(2)g(n)=O(f(n)(3)h(n)=O(

)(4)h(n)=O(nlgn)

三、阅读程序题

1.估计下列程序段的时间复杂度。

temp=I

i=j

j=temp

2.分析下列程序段的间复杂度。

x=0;y=0;

for(k=1;k<=n;k++)

x=x+1;

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

y++;

3.阅读程序题,估计时间复杂度

x=0;

for(i=1,j=1;i+j<=n;i++,j++)

x++;

4.阅读程序题,估计时间复杂度

x=1;

for(i=1;i<=n;i++)

for(j=1;j<=i;j++)

for(k=1,k<=j;k++)

x++;

习题答案

一、选择题  

1.D 2.A 3.D 4.A 5.B 6.A 7.C 8.A 9.D 10.C

二、填空题

1.内容  2.逻辑结构、存储结构和定义在其上的运算。

3.最小单位。

4.输入实例的初始状态。

5.也相邻 6.存储 7.上界 8. 确定性、有穷性 

9.索引存储、散列存储 10.

(1)

(2)(3)成立,(4)不成立。

三、阅读程序题

1.【答案】O

(1)

【分析】算法的执行时间是一个常数,不会随着问题规模的增大而变化,不论语句多少算法的时间复杂度均为常数阶。

2.【答案】O(n2)

【分析】一般情况下,对步进循环语句只需考虑循环体中语句的执行次数,而忽略循环控制语句等成分。

因此,算法中y++;语句的频度为n2,所以该序段的时间复杂度是平方阶。

O(

3.【答案】循环体x++;语句的执行频度n/2,

算法的时间复杂度T(n)=O(f(n))=O(n)

4.【答案】循环体x++;语句的执行频度

f(n)=

[n(n+1)(2n+1)/6+n(n+1)/2]/2

算法的时间复杂度T(n)=O(

第二章线性表

一、选择题

1.单链表表示线性表的优点是()

A.便于随机存取B.节省存储空间

C.数据元素的逻辑顺序和物理顺序相同D.便于插入和删除

2.在长度为n的顺序表中插入元素平均移动元素的个数是()

A.n/2B.(n+1)/2

C.nD.(n-1)/2

3.线性表采用顺序存储结构,设存储空间的基地址是b,每个元素占k个存储单元,第i个元素的存储位置是()

A.b+iB.b+i*k

C.b+(i-1)*kD.b+i-1

4.在链式存储结构中引入头结点的作用是()

A.对空表和非空表可按同一模式处理B.便于插入

C.便于随机访问D.便于删除

5.顺序存储结构的优点是()

A.便于插入B.便于删除

C.便于随机访问D.存储密度低

6.在链式存储结构中,删除工作指针P所指结点,要求时间复杂度为O

(1),选择哪种存储结构()

A.单循环链表或双循环链表B.双向链表

C.单链循环链表D.单链表

7.两个循环单链表,只有尾指针指向表末结点,表长分别为n和m,将两个表依此链接为一个表的时间复杂度是()

A.O

(1)B.O(n+m)

C.O(n)D.O(m)

8.已知带头结点的循环单链表的头指针为head,当head->next=head时,()

A.是非空表C.是空表

C.上溢出错D.表中有一个表结点

9.在长度为n的顺序表中删除第i个元素,须移动元素的个数是()

A.iB.n

C.n-i+1D.n-i

10.已知p指向单链表中的某个结点,执行语句:

q=p->next;p->data=q->data;p->next=q->next;free(q);

的功能是()

A.删除p所指结点B.删除p所指结点的后继结点

C.删除p所指结点的前趋结点D.p所指结点与后继结点值互换

11.线性表采用链式存储时,结点的存储地址( )

A.必须是不连续的       B.连续与否均可

C.必须是连续的        C.和头结点的存储地址连续 

12.在长度为n的顺序表的第i(1≤i≤n+1)个位置上插入一个元素,元素的移动次数为(  )

  A.n-i+1         B.n-i

13.对于只在表的首、尾两端进行插入操作的线性表,宜采用的存储结构为(  )

  A.顺序表                B.用头指针表示的单循环链表

  C.用尾指针表示的单循环链表       D.单链表

14.在单链表中,指针p指向元素为x的结点,实现“删除x的后继”的语句是(      )

A.p=p->next;            B.p->next=p->next->next;

C.p->next=p;           D.p=p->next->next;

15.在头指针为head且表长大于1的单循环链表中,指针p指向表中某个结点,若p->next->next=head,则(      )

A.p指向头结点                 B.p指向尾结点

C.*p的直接后继是头结点      D.*P的直接后继是尾结点

二、填空题

1.在线性表的顺序存储结构上,逻辑上相邻的元素在物理位置上。

2.顺序表是一种,存取速度快,但不便于进行和操作。

3.在n个元素的顺序表中进行插入操作,需平均移动个结点,。

具体的移动次数取决于和。

4.删除p所指结点,在双向链表中的时间复杂度为,在单链表中的时间复杂度为。

5.在单循环链表中设置尾指针,其优点是便于在和操作,其时间复杂度均

为。

6.在如图所示的链表中,若在指针p所指的结点之后插入数据域值为a结点,则可用下列

两个语句实现该操作,它们依次是________和。

7.在循环链表中,可根据某一结点的地址遍历整个链表,在单链表中,需要知道,才能遍历。

8.结点数据本身所占的存储量和整个结点结构所占的存储量之比称为存储密度,顺序表存储密度为,链表的存储密度。

9.在线性表中频繁进行插入和删除,应选择存储结构,否则应选择。

10.求一个单链表的长度的时间复杂度为。

三、阅读程序题

1.阅读程序指出程序功能

voidtrans(linklist*la,linklist*lb,inta[],intn)

{intk;

linknode*p;

*la=(linknode*)malloc(sizeof(linknode));

(*la)->next=NULL;

*lb=(linknode*)malloc(sizeof(linknode));

(*lb)->next=NULL;

k=0;

while(k

{p=(linknode*)malloc(sizeof(linknode));

p->data=a[k];

if(k%2){p->next=(*la)->next;(*la)->next=p;}

else{p->next=(*lb)->next;(*lb)->next=p;}

k++;}}

2.阅读程序指出程序功能

voiddelnode(linknode*p)

{//p指向带头结点循环链表中某结点

linknode*q;

q=p->next;

while(q->next!

=p)

q=q->next;

q->data=p->data;

q->next=p->next;

free(p);

}

3.阅读程序指出程序功能,并指出循环体执行次数。

voiddelseqlist(seqlist*S,inti,intk)

{intj,n=0;

for(j=i+k;j<(*S)->len;j++)

{*S->data[j-k]=(*S)->data[j];n++;}

(*S)->len=(*S)->len-n;

}

4.下述算法的功能是什么?

Linklistdemo(LinklistL)

{//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;

}

returnL;

}//demo

四、算法设计题

1.设有一个带头结点的单链表,试设计统计链表中值为k的结点个数的算法。

2.设线性表采用顺序存储结构,将表分拆成两个线性表,使小于x的元素作为一个表,使其它元素作为另一个表。

3.数序列(元素数大于2)以单链表存储,试遍写算法,判断序列是否为等差数列。

4.是分别用顺序表和单链表作为存储结构,实现将线性表(a0,a1,…,an-1)就地逆置的操作,所谓“就地”是指辅助空间应为O

(1)。

5.设顺序表L是一个递增有序表,试写一算法将x插入L中,并使L仍是一个有序表。

6.设单链表L是一个递减有序表,试写一算法将x插入L中,并使L仍保持有序性。

7.已知L1和L2分别指向的两个单链表的头结点,且已知其长度分别为m和n。

试写一算法将这两个单链表连接在一起,并分析你的算法的时间复杂度。

8.设A和B是两个单链表,其表中元素递增有序。

试写一个算法将A和B归并成一个按元素值递减有序的单链表,并要求辅助空间为O

(1),请分析算法的时间复杂度。

9.已知单链表L是一个递增有序表,试写一高效算法,删除表中值大于min且小于的max结点(若表中有这样的结点),同时释放被删除结点的空间,这里max和nin是两个给定的参数。

请分析你的算法的时间复杂度。

10.写一算法将单链表中值重复的结点删除,是所得的结果表中各结点值均不相同。

11.假设在长度大于1的单循环链表中,既无头结点也无头指针。

s为指向链表中某个结点的指针,是编写算法删除结点*s的直接前趋结点。

习题答案

一、选择题

1.D2.A3.C 4.A 5.C 6.B 7.A 8.C 9.D 10.A11.B12.A13.C14.B15.D

二、填空题

1.也相邻; 2.随机存取结构、插入、删除; 3.n/2,表长,插入位置;

4.0

(1),O(n);5.表头,表尾,O

(1);    6.S->next=p->next;p->next=s;

7.头指针; 8.1,<1; 9.链式,顺序存储结构;10.O(n); 

三、阅读程序题

1.【答案】将数组a[]中元素按奇、偶分类,分别建成单链表la和lb。

2.【答案】删除循环链表中p所指结点的前趋结点。

3.【答案】在顺序表上删除从第i个元素起连续k个元素。

4.【答案】当单链表为空表或只有一个结点时,其结构不变,若多于一个结点时,将第一个结点移至表末作为最后一个结点,而原来第二个结点作为链表的第一个结点。

第三章栈和队列

一、选择题

1.若一个栈的输入序列是1,2,3,…,n,输出序列的第一个元素是n,则第i个输出的元素是()

A.n-iB.n-i+1

C.iD.i-1

2.栈具有()

A.先进先出的特点B.后进先出的特点

C.进出次序是随机的D.操作与线性表相同

3.入栈序列为a,b,c,d,不可能得到的出栈序()

A.abcdB.dcba

C.cdbaD.adbc

4.支持递归算法的数据结构是()

A.队列B.线性表

D.栈D.树

5.容量为maxsize的循环队列Q队满的判定条件是()

A.Q.rear==(Q.front+1)%maxsizeB.Q.front==Q.rear

C.Q.front==(Q.rear+1)%maxsizeD.Q.front==Q.rear+1

6.长度为n的链队列用单循环链表表示设置头指针,入队的时间复杂度是()

A.O

(1)B.O(n)

C.O(n2)D.O(lgn)

7.设有一顺序栈S,元素1,2,3,4,5,6一次入栈,出栈序列为:

2,3,4,6,5,1,则栈的容量至少应该是()

A.2B.3

C.5D.6

8.向一个栈顶指针为top的链栈插入s所指结点的操作是()

A.s->next=top;top=s;B.top=s->next;

C.s->next=top->next;top=s;D.top->next=s;top=s;

9.容量为maxsize的循环队列Q的长度是()

A.(Q.rear-Q.front+maxsize)&maxziseB.Q.rear-Q.front

C.Q.rear-Q.front+maxsizeD.Q.front-Q.rear

10.由两个栈共享一个向量空间的好处是(   )

A.减少存取时间,降低下溢发生的机率   B.节省存储空间,降低上溢发生的机率

C.减少存取时间,降低上溢发生的机率   D.节省存储空间,降低下溢发生的机率

二、填空题

1.队列的逻辑特点是,栈的逻辑特点是。

2.栈结构中,允许插入和删除的一端称为,不允许进行插入和删除的一端称为。

3.循环队列为空的判定条件是。

4.设长度为n的链队列用单循环链表表示,若只设尾指针,则入队操作的时间复杂度是,出队操作的时间复杂度是。

若只设头指针,则入队操作的时间复杂度是,出队操作的时间复杂度是。

5.栈和队列是操作受限制的。

6.子程序嵌套调用和递归调用依靠实现。

7.在循环队列Q中,设置时队头指针Q.front指向队头元素和队列长度Q.len,则入队操作的语句序列是;;。

8.两个栈共享一个向量空间,这样做可节省,避免。

9.出栈操作的时间复杂度是,入栈操作的时间复杂度是。

10.顺序栈中,出栈操作的语句序列是;;。

11.栈顶的位置是随着     操作而变化

12.假设以S和X分别表示进栈和退栈操作,则对输入序列a,b,c,d,e进行一系列栈操作SSXSXSSXXX之后,得到的输出序列为________。

13.如图两个栈共享一个向量空间,top1和top分别为指向两个栈顶元素的指针,则“栈满”的判定条件是____________。

三、阅读程序题

1.阅读程序指出程序功能

voidstackexp1(linklistla)

{linknodep,q;

SeqstackS;

Initstack(&S);

p=la->next;

while(p)

{push(&S,p->data);

p=p->next;}

p=la->next;

while(!

stackempty(S))

{p->data=pop(&S);

p=p->next;}

}

2.阅读程序指出程序功能

voidstackexp2(Seqstack*S)

{datatypex;

CirqueueQ;

Initqueue(&Q);

while(!

Stackempty(S))

{x=pop(&S);Enqueue(&Q,x);}

while(!

Queueempty(S))

{x=Delqueue(&Q);push(&S,x);}}

3.阅读程序

voidexmple3(Seqstack*S,linklist*La,datatypex)

{linknode*p;

datatypet;

SeqstackS1;

*La=NULL;Initstack(&S1);

while(!

Stackempty(S))

{t=Pop(&S);

if(t

Push(&S1,t);

else

{p=(linknode*)malloc(sizeof(linknode));

p->data=t;p->next=la;la=p;}

}

while(!

Stackempty(S1))

Push(&S,Pop(&S1));

}

指出程序功能;

若栈S初始状态为:

(3,18,23,9,20),右端为栈顶,x为18,算法运行后,La和S的状态。

4.如图所示,利用同一循环向量空间实现两个队列,其类型Queue2定义如下:

typedefstruct{

    DataTypedata[MaxSize];

    intfront[2],length[2];

}Queue2;

对于i=0或1,front[i]和length[i]分别为第i个队列的头指针和长度域。

请在空缺处填入合适的内容,实现第i个循环队列的入队操作。

intEnQueue(Queue2*Q,inti,DataTypex)

{//若第i个队列不满,则元素x入队列,并返回1,否则返回0

 if(i<0||i>1)return0;

 if(  

(1)  )

   return0;

 Q->data[

(2)]=x;

 Q->length[ (3)  ]++;

 return1;

}

5.设栈S=(1,2,3,4,5,6,7),其中7为栈顶元素。

请写出调用algo(&s)后栈S的状态。

  voidalgo(Stack*S)

  {

    inti=0;

    QueueQ;StackT;

    InitQueue(&Q);InitStack(&T);

    while(!

StackEmpty(S))

    {

      if((i=!

i)!

=0)Push(&T,Pop(&S));

      elseEnQueue(&Q,Pop(&S));

     }

     while(!

QueueEmpty(Q))

       Push(&S,DeQueue(&Q));

     while(!

StackEmpty(T))

       Push(&S,Pop(&T));

    }

四、算法设计题

1.利用栈实现队列逆置。

2.两个栈共享一个向量Sa[0..m-1],栈底设在两端,已知一个栈顶指针和另一栈的元素数。

写出入栈操作算法;

写出出栈操作算法。

3.回文是指正读和反读均相同的字符序列,例如“abba”和“abdba”均是回文,但“good”不是回文。

试写一个算法判定给定的字符向量是否为回文(提示:

将一半字符入栈)。

4.利用栈的基本操作,写一个返回栈S中结点个数的算法intstacksize(SeqstackS),并说明S为何不用作为指针参数?

5.设计算法判断一个算术表达式的圆括号是否正确配对。

(提示:

凡遇‘(‘就进栈,遇‘)’就退掉栈顶的‘(‘,表达式扫描完毕,栈应为空)

6.一个双向栈S是在同一向量空间里实现的两个栈,它们的栈底分别设在向量空间的两端。

试为此双向栈设计初始化Initstack(S)、入栈push(S,x,i)和出栈pop(i)算法,其中,i为0或1用于指示栈号。

7.Ackerman函数的定义如下:

n+1当m=0时

AKM(m,n)=AKM(m-1,1)当m≠0,n=0时

AKM(m-1,AKM(m,n-1)) 当m≠0,n≠0时

请写出递归算法。

8.用第二种方法,既少用一个元素空间的方法来区别循环队列的空和满,试为其设计置队空、判断队空、判断队满、出队、入队、取队头元素等六个基本操作的算法。

9.假设以带头结点的循环链表表示队列,并且只是一个指针指向队尾元素结点,试编写相应的置队空、判断队空、出队和入队等算法。

10.对于循环向量中的循环队列,写出求队列长度的公式。

11.假设循环队列中只设rear和quelen来分别指示队尾元素的位置和队中元素的个数,试给出循环队列的队满条件

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 研究生入学考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1