数据结构复习资料doc.docx

上传人:b****6 文档编号:8325180 上传时间:2023-01-30 格式:DOCX 页数:51 大小:107.89KB
下载 相关 举报
数据结构复习资料doc.docx_第1页
第1页 / 共51页
数据结构复习资料doc.docx_第2页
第2页 / 共51页
数据结构复习资料doc.docx_第3页
第3页 / 共51页
数据结构复习资料doc.docx_第4页
第4页 / 共51页
数据结构复习资料doc.docx_第5页
第5页 / 共51页
点击查看更多>>
下载资源
资源描述

数据结构复习资料doc.docx

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

数据结构复习资料doc.docx

数据结构复习资料doc

数据结构复习题

第1章绪论

习题

选择题

(1)在数据结构中,从逻辑上可以把数据结构分成(C)。

A.动态结构和静态结构

C.线性结构和非线性结构

B.紧凑结构和非紧凑结构

D.内部结构和外部结构

(2)与数据元素本身的形式、

内容、相对位置、个数无关的是数据的(C

)o

A.存储结构

B.存储实现

C.逻辑结构

D.运算实现

(3)通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着(B)。

A.数据具有同一特点

B.不仅数据元素所包含的数据项的个数要相同,而且对应数据项的类型要一致

C.每个数据元素都一样

D.数据元素所包含的数据项的个数要相等

(4)以下说法正确的是(D)。

A.数据元素是数据的最小单位

B.数据项是数据的基本单位

C.数据结构是带有结构的各数据项的集合

D.一些表血上很不相同的数据可以有相同的逻辑结构

(5)以下与数据的存储结构无关的术语是(C)。

A.顺序队列B.链表C.有序表D.链栈

(6)以下数据结构屮,(A)是非线性数据结构

A.树B.字符串C.队D.栈

第2章线性表

1.选择题

(1)一个向量第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是(B)。

A.110B.108C.100D.120

(2)在n个结点的顺序表中,算法的时间复杂度是0

(1)的操作是(A)。

A.访问第i个结点(lWiWn)和求第i个结点的直接前驱(2WiWn)

B.在第i个结点后插入一个新结点(lWiWn)

C.删除第i个结点(lWiWn)

D.将n个结点从小到大排序

(3)向一个有127个元素的顺序表中插入一个新元素并保持原來顺序不变,平均要移动—元素个数为(B)o

A.8B.63.5

C.63D.7

(4)链接存储的存储结构所占存储空间(A)o

A.分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针

B.只有一部分,存放结点值

C.只有一部分,存储表示结点间关系的指针

D.分两部分,一部分存放结点值,另一部分存放结点所占单元数

(5)线性表若采用链式存储结构时,要求内存中可用存储单元的地址(D)。

A.必须是连续的B.部分地址必须是连续的

C.一定是不连续的D.连续或不连续都可以

(6)线性表L在(B)情况下适用于使用链式结构实现。

A.需经常修改L屮的结点值

C.L中含有大量的结点

(7)单链表的存储密度(C)。

A.大于1B.等于1

B.需不断对L进行删除插入

D.L中结点结构复杂

C.小于1D.不能确定

(8)将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是(A)0

A.n

B・2n-l

C.2nD.n-1

(9)在一个反度为n的顺序表中,

在第i个元素(lWiWn+1)之前插入一个新元素时

须向后移动(B)个元素。

A.n-i

B.n-i+1

C.n-i-1

D.i

(10)线性表L=(apa2,an),下列说法正确的是(D)。

A.每个元素都有一个直接前驱和一个直接后继

B.线性表中至少有一个元素

C.表中诸元素的排列必须是由小到大或由大到小

D.除笫一个和最后一个元素外,其余每个元素都有一个且仅有一个直接前驱和直接后继。

(11)若指定有n个元素的向量,则建立一个有序单链表的时间复杂性的量级是(C)。

A.0

(1)B.O(n)C・O(『)D.O(nlog2n)

(12)以下说法错误的是(D)。

A.求表长、定位这两种运算在采用顺序存储结构时实现的效率不比采用链式存储结构时实现的效率低

B.顺序存储的线性表可以随机存取

C.由于顺序存储要求连续的存储区域,所以在存储管理上不够灵活

D.线性表的链式存储结构优于顺序存储结构

(13)在单链表中,要将s所指结点插入到p所指结点之后,其语句应为(D)。

A.s->next=p+1;p->next=s;

B.(*p).next=s;(*s).next=(*p).next;

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

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

(14)在双向链表存储结构中,删除p所指的结点时须修改指针(A)。

A•p->next->prior=p->prior;p->prior->next=p->next;

B・p->next=p->next->next;p->next->prior=p;

C・p->prior->next=p;p->prior=p->prior->prior;

D・p->prior=p->next->next;p->next=p->prior->prior;

(15)在双向循坏链表中,在p指针所指的结点后插入q所指向的新结点,其修改指针的操作是(C)o

A.p->next=q;q->prior=p;p->next->prior=q;q->next=q;

B・p->next=q;p->next->prior=q;q->prior=p;q->next=p->next;

C・q->prior二p;q->next=p->next;p->next->prior=q;p->next=q;

D.q->prior=p;q->next=p->next;p->next=q;p->next->prior=q;

2.算法设计题

(1)将两个递增的有序链表合并为一个递增的有序链表O

要求结果链表仍使用原来两个链表的存储空间,不另外占

用其它的存储空间。

表中不允许有重复的数据。

&La,LinkList

voidMergeList_L(LinkList

&Lb,LinkList&Lc){

pa=La->next;pb=Lb->next;

Lc二pc二La;//用La的头结点作为Lc的

头结点

while(pa&&pb){

if(pa->datadata){pc->next=pa;pc=pa;pa=pa~〉next;}

elseif(pa->data>pb->data){pc->next=pb;

pc=pb;pb=pb->next;}

else{//相等时取La的元素,删除Lb的元素

pc~>next=pa;pc=pa;pa=pa->next;

q=pb~>next;deletepb;pb二q;}

pc->next=pa?

pa:

pb;//插入剩余段

deleteLb;//释放Lb的头结点}

(2)将两个非递减的有序链表合并为一个非递增的有序链表。

要求结果链表仍使用原来两个链表的存储空间,不另外占用其它的存储空间。

表中允许有重复的数据。

voidunion(LinkList&La,LinkList&Lb,LinkList&Lc,){

pa二La->next;pb二Lb->next;//初

始化

Lc=pc=La;//用La的头结点作为Lc的头结点

Lc->next二NULL;

while(pa||pb){

if(!

pa){q二pb;pb二pb->next;}

elseif(!

pb){q=pa;pa=pa~>next;}

elseif(pa->data<=pb->data){q=pa;

pa二pa~>next;}

else{q=pb;pb=pb~>next;}

q->next二Lc->next;Lc~>next二q;//插入

deleteLb;

//释放Lb的头结点}

(3)已知两个链表A和B分别表示两个集合,其元素递增排列。

请设计算法求出A与B的交集,并存放于A链表中。

voidMix(LinkList&La,LinkList&Lb,LinkList&Lc,){

pa=la->next:

pb=lb->next;〃设工作指针pa和pb;

Lc=pc=La;//用La的头结点作为Lc的头结点while(pa&&pb)

if(pa->data~pb->data)〃交集并入结果表中。

{pc->next二pa;pc二pa;pa二pa-〉next;

u二pb;pb=pb->next;deleteu;}

elseif(pa~>data〈pb->data)

{u=pa;pa=pa->next;deleteu;}

else{u=pb:

pb=pb->next;deleteu;}

while(pa){u=pa;pa=pa->next:

deleteu;}〃释放结点空间

while(pb){u=pb;pb=pb->next;deleteu;}〃

释放结点空间

pc->next=null;〃置链表尾标记。

deleteLb;〃注:

本算法中也可对B表不作

释放空间的处理

(4)已知两个链表A和B分别表示两个集合,其元素递增排列。

请设计算法求出两个集合A和B的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。

voidDifference(LinkedListA,B,*n)

〃人和8均是带头结点的递增有序的单链表,分别存储了一个集合,本算法求两集合的差集,存储于单链表A中,*n是结果集合中元素个数,调用时为0

{p=A->next;〃p和q分别是链表A和

B的工作指针。

q二B->next;pre二A;//pre为A中p所指结点

的前驱结点的指针。

while(p!

=null&&q!

二null)

if(p->datadata){pre=p;p=p->next;*n++;}//

A链表中当前结点指针后移。

elseif(p->data>q->data)q二q-〉next;〃B链表

中当前结点指针后移。

else{pre->next=p->next;〃处理A,B中元

素值相同的结点,应删除。

u二p;p=p->next;deleteu;}〃删除结点

(5)设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表氏C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点(链表A的元素类型为整型,要求B、C表利用A表的结点)。

(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。

ElemTypeMax(LinkListL){+

if(L->next—NULL)returnNULL;

pmax=L->next;//假定第一个结点中数据具有最大值

p=L->next->next;

while(p!

=NULL){//如果下一个结点存在

if(p->data>pmax->data)pmax=p;

p=p->next;

}

returnpmax->data;

(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。

voidinverse(LinkList&L){

//逆置带头结点的单链表L

p=L->next;L->next二NULL;

while(p){

q=p->next;//q指向*p的后继

p->next二L~>next;

L->next=p;//*p插入在头结点之后

P二q;

(8)设计一个算法,删除递增有序链表中值大于mink且小于maxk的所有元素(mink和maxk是给定的两个参数,其值可以和表中的元素相同,也可以不同)o

voiddelete(LinkList&L,intmink,intmaxk){

p二L—〉next;//首元结点

while(p&&p->data<=mink)

{pre=p;

p=p->next

}//查找第一个值>mink

的结点

if(p){

while(p&&p->data

//查找第一个值2maxk的结

八、、

q=pre->next;pre->next=p;//修改扌旨针while(q!

=p)

{s二q-〉next;deleteq;q二s;}//释放结点空间

}//if

(9)已知p指向双向循环链表中的一个结点,其结点结构为data、prior、next三个域,写出算法change(p),交换P所指向的结点和它的前缀结点的顺序。

知道双向循环链表中的一个结点,与前驱交换涉及到四个结点(p结点,前驱结点,前驱的前驱结点,后继结点)六条链。

voidExchange(LinkedListp)

〃P是双向循环链表中的一个结点,本算法将P所指结点与其前驱结点交换。

{q=p->llink;

q->llink->rlink=p;〃p的前驱的前驱之后继为p

p->llink=q->llink;〃p的前驱指向其前驱的前驱。

q->rlink=p->rlink;〃p的前驱的后继为p的后继。

q->llink=p;〃p与其前驱交换

p->rlink->llink=q;〃p的后继的前驱指向原p的

前驱

p->rlink=q;〃p的后继指向其原来的前驱

}〃算法exchange结束。

(10)已知长度为n的线性表A采用顺序存储结构,请写

时间复杂度为O(n)、空间复杂度为0

(1)的算法,该算法删除线性表中所有值为item的数据元素。

[题目分析]在顺序存储的线性表上删除元素,通常要涉及到一系列元素的移动(删第i个元素,第1+1至第n个元素要依次前移)。

本题要求删除线性表中所有值为item的数据元素,并未要求元素间的相对位置不变。

因此可以考虑设头尾两个指针(i=l,j=n),从两端向中间移动,凡遇到值item的数据元素时,直接将右端元素左移至值为item的数据元素位置。

voidDelete(ElemTypeA[],intn)

〃A是有n个元素的一维数组,本算法删除A中所有值为

item的元素。

{i=l;j=n;〃设置数组低、高端指针(下标)。

while(i

{wh订e(i〈j&&A[i]!

二item)i++;〃若值

不为item,左移指针。

if(i

if(i

}

[算法讨论]因元素只扫描一趟,算法时间复杂度为0(n)。

删除元素未使用其它辅助空间,最后线性表中的元素个数是

第3章栈和队列

习题

1.选择题

(1)若让元素1,2,3,4,5依次进栈,则出栈次序不可能出现在(C)种情况。

A.5,4,3,2,1B.2,1,5,4,3C.4,3,1,2,5D.2,3,5,4,

(2)若己知一个栈的入栈序列是1,2,3,…,n,其输出序列为pl,p2,p3,…,pn,若pl=n,则pi为(C)o

A.iB.n-iC.n-i+1D.不确定

(3)数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,『为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素个数的公式为(D)。

A.r-fB.(n+f-r)%nC.n+r-fD.(n+r-f)%n

(4)链式栈结点为:

(dala,link),top指向栈顶.若想摘除栈顶结点,并将删除结点的值保存到x中,则应执行操作(A)。

A.x=top->data;top=top->link;

B.top=top->link;x=top->link;

C.x=top;top=top->link;D.x=top->link;

(5)设有一个递归算法如下

intfact(intn){//n大于等于()

if(n<=0)return1;

elsereturnn*fact(n-l);}

则计算fact(n)^要调用该函数的次数为(A)。

A.n+lB.n-1C.n

(6)栈在(D)屮有所应用。

A.递归调用

B.函数调用

C.表达式求值

D.n+2

D.前三个选项都有

(7)为解决计算机主机与打印机间速度不匹配问题,通常设一个打印数据缓冲区。

机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。

该缓冲区的逻辑结构应该是(A)。

A.队列B.栈C.线性表D.有序表

(8)设栈S和队列Q的初始状态为空,元素el、e2、e3、e4、e5和e6依次进入栈S,一个元素出栈后即进入Q,若6个元素11!

队的序列是e2、e4、e3、e6、e5和el,则栈S的容量至少应该是(B)。

A.2B.3C.4D.6

(9)在一个具有n个单元的顺序栈中,假设以地址高端作为栈底,以lop作为栈顶指针,贝!

]当作进栈处理时,top的变化为(C)。

A.top不变B.top=0C.top—D.top++

(10)设计一个判别表达式中左,右括号是否配対出现的算法,采用(D)数据结构最佳。

C.线性表的链式存储结构D.栈

(11)用链接方式存储的队列,在进行删除运算时(D)。

A.仅修改头指针B.仅修改尾指针

C.头、尾指针都要修改D.头、尾指针可能都要修改

(12)循坏队列存储在数组中,则入队时的操作为(D)。

A.rear=rear+lB.rear=(rear+1)%(m-1)

C.rcar=(rcar+l)%mD.rear=(rear+l)%(m+l)

(13)最大容量为n的循环队列,队尾指针是rear,队头是front,则队空的条件是

(B)。

B.rear==front

D.(rear-1)%n~front

B.都是先进后出

D.没有共同点

B.终止条件和递归部分

D.终止条件和迭代部分

A.(rear+1)%n==front

C.rear+l==front

(14)栈和队列的共同点是(C)。

A.都是先进先出

C.只允许在端点处插入和删除元素

(15)—个递归算法必须包插(B)。

A.递归部分

C.迭代部分

第4章串、数组和广义表

习题

1.选择题

(1)串是一种特殊的线性表,其特殊性体现在(B)0

A.可以顺序存储B.数据元素是一个字符

C.可以链式存储D.数据元素可以是多个字符若

(2)串下面关于串的的叙述中,(B)是不正确的?

A.串是字符的有限序列B.空串是由空格构成的串

C.模式匹配是串的一种重要运算D.串既可以采用顺序存储,也可以采用链式存储

(3)串"ababaaababaa”的next数组为(C)。

A.012345678999B.012121111212C.011234223456D.0123012322345

(4)串“ababaabab”的nextval为(A)。

A.010104101B.010102101C.010100011D.010101011

(5)串的长度是指(B)。

A.串中所含不同字母的个数B.串中所含字符的个数

C.串中所含不同字符的个数D.串中所含非空格字符的个数

(6)假设以行序为主序存储二维数组A=array[l..100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=(B)o

A.808B・818C.1010D.1020

(7)设有数组A[i,j],数组的每个元素长度为3字节,i的值为1到8,j的值为1到10,数组从内存首地址BA开始顺序存放,当用以列为主存放吋,元素A[5,8]的存储首地址为

(B)。

A.BA+141B.BA+180C.BA+222D.BA+225

(8)设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,为第一元素,其存储地址为1,每个元素占一个地址空间,则a&5的地址为(B)o

A.13B.33C.18D.40

(9)若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[l..(n(n+l))/2冲,则在B中确定夠(i

(B)o

A.i*(i・l)/2+jB.j*(j・l)/2+iC・i*(i+l)/2+jD.j*(j+l)/2+i

(10)A[N,N]是对称矩阵,将下血三角(包括对角线)以行序存储到一维数组T[N(N+1)⑵中,则对任一上三角元素a[i][j]对应T[k]的下标k是(B)。

A.i(i・l)/2+jB.j(j・l)/2+iC.i(j・i)/2+lD.j(i-l)/2+1

(11)设二维数组A[l..m,1..n](即m行n列)按行存储在数组B[l..m*n]屮,则二维数组元素A[i,j]在一维数组B中的下标为(A)。

A.(i-l)*n+jB.(i-l)*n+j-lC.i*(j-l)D.j*m+i-l

(12)数组A[0..4,・l..・3,5..7]中含有元素的个数(B)。

A.55B.45C.36D.16

(13)广义表A=(a,b,(c,d),(e,(f,g))),则Head(Tail(Head(Tail(Tail(A)))))的值为(D)。

A.(g)

B.(d)

C.c

D.d

(14)广义表((a,b,c,d))的表头是(

),表尾是(C)o

A.a

B.()

C.(a,b,c,d)

D.(b,c,d)

(15)设广义表L=((a,b,c)),则L的长度和深度分别为(

C)o

A.1和1

B.1和3

C.1和2

D・2和3

(1)已知模式串t=4abcaabbabcabf写出用KMP法求得的每个字符对应的next和nextval函数值。

模式串t的next和nextval值如下:

■J

1

2

3

4

5

6

7

8

9

101112

t串

a

b

c

a

a

b

b

a

b

c

a

b

next|jj

0

1

1

1

2

2

3

1

2

3

4

5

nextval[jl

0

1

1

0

2

1

3

0

1

1

0

5

(2)设目标为t=wabcaabbabcabaacbacbaw,模式为p="abcabaa”

1计算模式P的na

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

当前位置:首页 > PPT模板 > 节日庆典

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

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