数据结构习题解答

数据结构习题解答
数据结构习题解答

https://www.360docs.net/doc/4018793651.html,|https://www.360docs.net/doc/4018793651.html,|https://www.360docs.net/doc/4018793651.html,|https://www.360docs.net/doc/4018793651.html,

《数据结构基础教程》习题解答(新)

第1章习题解答

一、填空

1.数据是指所有能够输入到计算机中被计算机加工、处理的符号的集合。

2.可以把计算机处理的数据,笼统地分成数值型和非数值型两大类。

3.数据的逻辑结构就是指数据间的邻接关系。

4.数据是由一个个数据元素集合而成的。

5.数据项是数据元素中不可再分割的最小标识单位,通常不具备完整、确定的实际意义,只是反映数据元素某一方面的属性。

6.数据是以数据元素为单位存放在内存的,分配给它的内存区域称为存储结点。

7.每个数据元素都具有完整、确定的实际意义,是数据加工处理的对象。

8.如果两个数据结点之间有着逻辑上的某种关系,那么就称这两个结点是邻接的。

9.在一个存储结点里,除了要有数据本身的内容外,还要有体现数据间邻接关系的内容。

10.从整体上看,数据在存储器内有两种存放的方式:一是集中存放在一个连续的内存存储区中;一是利用存储器中的零星区域,分散地存放在内存的各个地方。

11.在有些书里,数据的“存储结构”也称为数据的“物理结构”。

12.“基本操作”是指算法中那种所需时间与操作数的具体取值无关的操作。

二、选择

1.在常见的数据处理中, B 是最基本的处理。

A.删除B.查找C.读取D.插入

2.下面给出的名称中,A不是数据元素的同义词。

A.字段B.结点C.顶点D.记录

3. D 是图状关系的特例。

A.只有线性关系B.只有树型关系

C.线性关系和树型关系都不D.线性关系和树型关系都

4.链式存储结构中,每个数据的存储结点里D指向邻接存储结点的指针,用以反映数据间的逻辑关系。

A.只能有1个B.只能有2个C.只能有3个D.可以有多个5.本书将采用 C 来描述算法。

A.自然语言B.流程图(即框图)C.类C语言D.C语言6.有下面的算法段:

for (i=0; i

k++;

其时间复杂度为 B 。

A.O(1) B.O(n) C.O(log2n) D.O(n2)

三、问答

1.中国百家姓中的赵、钱、孙、李、周、吴、郑、王……等姓氏数据之间,是一种什么样的邻接关系,为什么?

答:是一种线性关系,因为这些姓氏之间符合关系的“有头有尾,顺序排列”的特点。

2.什么是数据结点?什么是存储结点?它们间有什么关系?

答:数据结点即是数据集合中的一个数据元素,存储结点是存放数据结点的内存单位。在存储结点里,不仅要存放数据结点的内容,还要(显式或隐式地)存放数据结点间的逻辑关系。

3.为什么说链式存储既提高了存储的利用率,又降低了存储的利用率?

答:由于链式存储是通过指针来体现数据元素之间的逻辑关系的,因此,存储结点可以不占用存储器的连续存储区。从这个意义上说,链式存储能够充分利用存储器中小的存储区,因此提高了存储器的利用率。另一方面,链式存储中的存储结点不仅要存放数据元素,还要占用适当的存储区来存放指针,这是一种额外的存储开销。从这个意义上说,链式存储降低了存储器的利用率。

4.列举几个数据之间具有树型结构的实际例子。

答:学校各级管理之间,是一种分支层次结构;一本书的书目,是一种分支层次结构。

5.判断如下除法过程是否是一个算法,为什么:

(1)开始;

(2)给变量m赋初值5,给变量n赋初值0;

(3)m=m/n;

(4)输出m;

(5)结束。

答:因为0不能为除数,本题第(3)步不具有有效性,所以它不是一个算法。但如果n的初值不为0,则是一个正确的算法。

四、应用

1.用类C语言中的do-while语句,描述输出整数1、2、3、……、9、10的过程。

答:算法编写如下。

void num ()

{

i=1;

do

{

printf (“i = %d\n”, i );

i = i +1;

} while (i<= 10);

}

2.用类C语言中的if-else语句,编写算法,描述当输入的数据大于等于0时,输出信息:“输入的是正数”;当输入的数据小于0时,输出信息:“输入的是负数”。

答:算法编写如下。

void judge ()

{

scanf (“%d\n”, &x);

if (x>=0)

printf (“输入的是正数”);

else

printf (“输入的是负数”);

}

3.分析算法段中标有记号“#1”和“#2”的基本操作的执行次数:

for ( i=0; i

for (j=0; j

{

#1 y=1;

for (k=0; k

#2 y=y+1;

}

答:标有记号“#1”的基本操作的执行次数是:n2;标有记号“#2”的基本操作的执行次数是:n3。

4.给出下面3个算法段的时间复杂度:

(1)x++;

(2)for (j=1; j

x++;

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

{

printf (“j=%”, j);

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

x++;

}

答:(1)的时间复杂度为O(1);

(2)的时间复杂度O(n);

(3)中“printf (“j=%”, j);”执行次数的数量级为O(n),“x++;”执行次数是:

n+(n-1)+(n-2)+……+2+1 = n(n+1)/2

其数量级为O(n2),因此整个算法段的时间复杂度应该是O(n2)。

第2章习题解答

一、填空

1.当一组数据的逻辑结构呈线性关系时,在数据结构里就称其为线性表。

2.线性表中数据元素的个数n称为线性表的长度。

3.以顺序存储结构实现的线性表,被称为顺序表。

4.以链式存储结构实现的线性表,被称为链表。

5.不带表头结点的链表,是指该链表的表头指针直接指向该链表的起始结点。

6.在一个双链表中,已经由指针ptr指向需要删除的存储结点,则删除该结点所要执行的两条操作是①ptr->Prior->Next = ptr->Next; ②ptr->Next->Prior = ptr->Prior; 。

7.设tail是指向非空、带表头结点的循环单链表的表尾指针。那么,该链表起始结点的存储位置应该表示成tail->Next->Next 。

8.在一个不带表头结点的非空单链表中,若要在指针qtr所指结点的后面插入一个值

为x的结点,则需要执行下列操作:

ptr = malloc (size);

ptr->Data = x ;

ptr->Next = qtr->Next ;

qtr->Next = ptr ;

9.顺序表Sq = (a1,a2,a3,…,a n)(n≥1)中,每个数据元素需要占用w个存储单元。若m为元素a1的起始地址,那么元素a n的存储地址是m+(n-1)*w。

10.当线性表的数据元素个数基本稳定、很少进行插入和删除操作,但却要求以最快的速度存取表中的元素时,我们应该对该表采用顺序存储结构。

二、选择

1.下面,对非空线性表特点的论述, C 是正确的。

A.所有结点有且只有一个直接前驱

B.所有结点有且只有一个直接后继

C.每个结点至多只有一个直接前驱,至多只有一个直接后继

D.结点间是按照1对多的邻接关系来维系其逻辑关系的

2.一般单链表Lk_h为空的判定条件是A。

A.Lk_h == NULL B.Lk_h->Next == NULL

C.Lk_h->Next == Lk_h D.Lk_h != NULL

3.带表头结点的单链表Lk_h为空的判定条件是 B 。

A.Lk_h == NULL B.Lk_h->Next == NULL

C.Lk_h->Next == Lk_h D.Lk_h != NULL

4.往一个顺序表的任一结点前插入一个新数据结点时,平均而言,需要移动B个结点。

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

5.在一个单链表中,已知qtr所指结点是ptr所指结点的直接前驱。现要在qtr所指结点和ptr所指结点之间插入一个rtr所指的结点,要执行的操作应该是C 。

A.rtr->Next = ptr->Next; ptr->Next = rtr;

B.ptr->Next = rtr->Next;

C.qtr->Next = rtr; rtr->Next = ptr;

D.ptr->Next = rtr; rtr->Next = qtr->Next;

6.在一个单链表中,若现在要删除ptr指针所指结点的直接后继结点,则需要执行的操作是A。

A.ptr->Next = ptr->Next->Next ;

B.ptr = ptr->Next; ptr->Next = ptr->Next->Next ;

C.ptr = ptr->Next->Next ;

D.ptr->Next ptr ;

7.在长度为n的顺序表中,往其第i个元素(1≤i≤n)之前插入一个新的元素时,需要往后移动 B 个元素。

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

8.在长度为n的顺序表中,删除第i个元素(1≤i≤n)时,需要往前移动A个元素。

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

9.设tail是指向一个非空带表头结点的循环单链表的尾指针。那么,删除链表起始结点的操作应该是 D 。

A.ptr = tail ; B.tail = tail->Next ;

tail = tail->Next ; free (tail) ;

free (ptr);

C.tail = tail->Next->Next ; D.ptr = tail->Next->Next ;

Free (tail); tail->Next->Next = ptr->Next ;

Free (ptr); free (ptr);

10.在单链表中,如果指针ptr所指结点不是链表的尾结点,那么在ptr之后插入由指针qtr所指结点的操作应该是B 。

A.qtr->Next = ptr ; B.qtr->Next = ptr->Next ;

ptr->Next = qtr ; ptr->Next = qtr ;

C.qtr->Next = ptr->Next ; D.ptr->Next = qtr ;

ptr = qtr ; qtr->Next = ptr ;

三、问答

1.试问,如下的线性表:

L = (29,25,21,17,13,11,7,5,3,1)

是有序线性表还是无序线性表?

答:L是一个有序线性表。

2.线性表L第i个存储结点a i的起始地址LOC(a i)可以通过下面的公式计算得到:LOC(a i)= LOC(a i-1)+k

其中k表示存储结点的长度。这个公式对吗?为什么?

答:这个公式是对的,因为第i个存储结点a i的起始地址LOC(a i),实际上就是等于第i-1个存储结点a i-1的起始地址LOC(a i-1)加上一个存储结点的长度k得到。

3.试说明创建顺序表算法Create_Sq ()中,Sq_max和Sq_num的不同之处。

答:Sq_max代表的是顺序表的最大长度,也就是它最多可以容纳下多少个数据元素,顺序表创建后,Sq_max是一个保持不变的常量;Sq_num代表的是顺序表内当前拥有的数据元素个数,在顺序表创建后,随着对数据元素进行的插入、删除操作,Sq_num将会不断地发生变化。

4.如何判断一个顺序表是否为空?

答:只需判定Sq_num的当前值是多少,如果Sq_num为0,则表示顺序表Sq为空,否则表示该顺序表里有数据元素存在。

5.在算法2-3里,操作“Sq_num=Sq_num -1”的作用是什么?没有它行吗?

答:该操作是非常重要的,因为顺序表里当前拥有的元素个数是通过Sq_num来记录的,删除了一个元素,Sq_num必须减1,这样才能正确反映出删除后表中元素的个数。所以,没有这个操作是不行的。

6.在算法2-9里,如果现在是把一个结点插入到单链表尾结点的后面。按照算法的描述,能够保证插入后最后一个结点的Next域为“Λ”吗?

答:能够。因为原来ptr->Next里是“Λ”,做了第1步操作:

qtr->Next = ptr->Next ;

后,就是把插入结点的Next域置为“Λ”。

7.在一个单链表中,为了删除指针ptr所指的结点,有人编写了下面的操作序列。读懂并加以理解。试问,编写者能够达到目的吗?其思想是什么?

x = ptr->Data ;

qtr = ptr->Next ;

ptr->Data = ptr->Next->Data ;

ptr->Next = ptr->Next->Next ;

free (qtr);

答:能够达到删除指针ptr所指结点的目的。编写者的思想是不去直接删除ptr所指的结点,而是在把ptr直接后继的Data域内容写入ptr所指结点的Data域之后,把它的直接后继删除。对于单链表来说,得到一个结点的直接后继容易,得到它的直接前驱难,所以这样的设计是有其可取之处的。

8.在一个单链表中,为了在指针ptr所指结点之前插入一个由指针qtr所指的结点,有人编写了下面的操作序列,其中temp是一个临时工作单元。读懂并加以理解。试问,编写者能够达到目的吗?其思想是什么?

qtr->Next = ptr->Next ;

ptr->Next = qtr ;

temp = ptr->Data ;

p->Data = qtr->Data ;

qtr->Data = temp ;

答:能够达到在指针ptr所指结点之前插入一个由指针qtr所指结点的目的。编写者的思想是考虑到在单链表中得到一个结点的前驱信息较为困难,因此在这里先把qtr所指结点插入到ptr所指结点的后面,暂时成为它的直接后继。然后通过临时工作单元temp,将ptr 及qtr所指结点的Data域内容进行交换,从而达到插入的目的。

9.打算形成一个有表头结点的循环双链表,初始时除了每个结点的Next域已经链接好外,它们的Prior域还都是空的。有人编写了下面的算法,试图完成Prior域的链接:Com_Cd (Cd_h)

{

ptr = Cd_h->Next ;

qtr = Cd_h ;

while (ptr != Cd_h)

{

ptr ->Prior = qtr ;

qtr = ptr ;

ptr = ptr->Next ;

}

Cd_h->Prior = qtr ;

}

读懂并理解它,解释为什么能够完成各结点的Prior域的链接?

答:算法中用两个指针ptr和qtr配合,从头到尾扫描这个循环双链表,以达到让每个结点的Prior域指向其直接前驱的目的。

四、应用

1.设计一个计算表头指针为Lk_h的单链表长度(即结点个数)的算法。

答:算法设计如下:

Length_Lk (Lk_h)

{

n = 0 ;

ptr = Lk_h ; /* ptr指向起始结点*/

while (ptr != NULL)

{

ptr = ptr->Next ;

n=n+1 ; /* n为结点计数单元*/

}

return (n) ;

}

2.用总是在表的头部插入整数结点的方法建立一个单链表,当输入为0时,建表过程结束。

答:算法设计如下:

Clink()

{

Lk_h = NULL;

scanf (%d, &x);

while (x != “0”)

{

ptr = malloc (size);

ptr->Data = x;

ptr->Next = Lk_h;

Lk_h = ptr;

scanf (%d, &x);

}

return Lk_h;

}

3.一个不带表头结点的循环双链表Ck的表头指针为Ck_h,要在指针ptr指向处前插入一个rtr所指结点。模仿图2-21,对一般插入位置标示出下面4个操作步骤:

①rtr->Next = ptr ;

②rtr->Prior = ptr->Prior ;

③ptr->Prior->Next = rtr ;

④ptr->Prior = rtr ;

答:4个操作步骤的具体功能体现如下图所示。

4.试设计一个算法copy (Ck_h1, Ck_h2),将一个带表头结点的、以Ck_h1为表头指针的单链表Ck1的内容,复制到一个不带表头结点的、以Ck_h2为表头指针的单链表Ck2中。

答:算法具体如下。

Copy (Ck_h1, Ck_h2)

{

ptr = Ck_h1->Next ;

qtr = Ck_h2 ;

while ( ptr != NULL)

{

rtr = malloc (size);

rtr->Data = ptr->Data ;

qtr->Next = rtr ;

qtr = rtr ;

ptr = ptr->Next ;

}

qtr->Next = NULL ;

}

5.已知一个带表头结点的递增单链表。试编写一个算法,功能是从表中去除值大于min、且值小于max的数据元素。(假定表中存在这样的元素)

答:所需算法编写如下。

Del_Sq(Lk_h, nim, max)

{

ptr = Lk_h->Next ; /* ptr指向链表的起始结点*/

while ( (ptr != NULL) && (ptr->Data <= min) ) /* 跳过所有值<=min的结点*/

{

qtr = ptr ;

ptr = ptr->Next ;

}

while ( (ptr != NULL) && (ptr->Data

p = p->Next ;

qtr->Next = ptr ; /* qtr指出第1个大于max的结点位置,完成链接*/

}

6.已知一个带表头结点的无序单链表。试编写一个算法,功能是从表中去除所有值大于min、且值小于max的数据元素。

答:所需算法编写如下,其中指针ptr总是指向当前被检查的结点,qtr总是指向被检查结点的直接前驱。

Del_Lk (Lk_h, min, max)

{

ptr = Lk_h->Next ; /* ptr指向单链表的起始结点*/

while (ptr != NULL) /* 扫视直到链尾结点*/

{

if ( (ptr->Data <= min) || (ptr->Data >= max) /* 不满足删除条件*/

{

qtr = ptr ; /* 往后移动qtr和ptr */

ptr = ptr->Next ;

}

else /* 删除ptr所指结点,往后移动ptr */

{

qtr->Next = ptr->Next ;

free (ptr);

ptr = qtr->Next ;

}

}

}

7.一个单链表Lk的表头指针为Lk_h,不同结点的Data域值有可能相同。编写一个算法,功能是计算出Data域值为x的结点的个数。

答:算法应该遍历链表的每一个结点,遇到一个结点的Data域值为x时,计数器n就加1。最后返回计数器n。

Count_Lk (Lk_h)

{

n = 0 ;

ptr = Lk_h ;

while (ptr != NULL)

{

if (ptr->Data == x)

n = n+1 ;

ptr = ptr->Next

}

return (n) ;

}

第3章习题解答

一、填空

1.限定插入和删除操作只能在一端进行的线性表,被称为是栈。

2.如果在顺序栈满时仍打算进行进栈操作,就称为发生了“上溢”出错。

3.如果在顺序栈空时仍打算进行出栈操作,就称为发生了“下溢”出错。

4.在具有n个数据结点的循环队列中,队满时共有n-1 个数据元素。

5.如果操作顺序是先让字母A、B、C进栈,做两次出栈;再让字母D、E、F进栈,做一次出栈;最后让字母G进栈,做三次出栈。最终这个堆栈从栈顶到栈底的余留元素应该是DA。

6.中缀表达式(a+b)-(c/(d+e))对应的后缀表达式是ab+cde+/- 。

7.函数的递归调用有两种形式:如果一个函数是直接调用自己,就称其为直接递归调用;如果一个函数是通过另一个函数来调用自己,就称其为间接递归调用。

8.设某栈的元素输入顺序是1、2、3、4、5,想得到4、3、5、2、1的输出顺序。那么push、pop的操作序列应该是push、push、push、push、pop、pop、push、pop、pop、pop 。

9.设链栈的栈顶指针为Ls_top,那么它非空的条件应该是Ls_top != NULL 。

10.队列中,允许进行删除的一端称为队首。

二、选择

1.一个栈的元素进栈序列是a、b、c、d、e,那么下面的C 不能做为一个出栈序列。

A.e、d、c、b、a B.d、e、c、b、a

C.d、c、e、a、b D.a、b、c、d、e

2.判定一个顺序队列Qs(最多有n个元素)为空的条件是C 。

A.Qs_rear-Qs_front == n*size B.Qs_rear-Qs_front+1 == n*size

C.Qs_front == Qs_rear D.Qs_front == Qs_rear+size 3.判定一个顺序队列Qs(最多有n个元素)真满的条件是A。

A.Qs_rear-Qs_front == n*size B.Qs_rear-Qs_front+1 == n*size

C.Qs_front == Qs_rear D.Qs_front == Qs_rear+size 4.在一个链式队列Lq中,Lq_front和Lq_rear分别为队首、队尾指针。现在由指针ptr 所指结点要进队,则插入操作应该是 B 。

A.Lq_front->Next = ptr; Lq_front = ptr;

B.Lq_rear->Next = ptr; Lq_rear = ptr;

C.ptr->Next = Lq_rear; Lq_rear = ptr;

D.ptr->Next = Lq_front; Lq_front = ptr;

5.链栈与顺序栈相比,一个较为明显的优点是 D 。

A.通常不会出现栈空的情形B.插入操作更加便利

C.删除操作更加便利D.通常不会出现栈满的情形6.向链栈插入一个结点时,操作顺序应该是 C 。

A.先修改栈顶指针,再插入结点B.无须修改栈顶指针

C.先插入结点,再修改栈顶指针D.谁先谁后没有关系

7.从链栈中删除一个结点时,操作顺序应该是A。

A.先保存被删结点的值,再修改栈顶指针

B.先修改栈顶指针,再保存被删结点的值

C.无须修改栈顶指针的值

D.谁先谁后没有关系

8.一个循环队列的最大容量为m+1,front为队首指针,rear为队尾指针。那么进队操作时求队位号应该使用公式 D 。

A.Cq_front = (Cq_front+1)%m B.Cq_front = (Cq_front+1)%(m+1)

C.Cq_rear = (Cq_rear+1)%m D.Cq_rear = (Cq_rear+1)%(m+1) 9.在一个循环顺序队列里,队首指针Cq_front总是指向B 。

A.队首元素B.队首元素的前一个队位

C.任意位置D.队首元素的后一个队位

10.若一个栈的进栈序列是1、2、3、4,那么要求出栈序列为3、2、1、4时,进、出栈操作的顺序应该是A。(注:所给顺序中,I表示进栈操作,O表示出栈操作)A.IIIOOOIO B.IOIOIOIO C.IIOOIOIO D.IOIIIOOO

三、问答

1.若元素进栈的序列是1、2、3、…、n,有一个出栈序列的第1个元素是n。那么,这个出栈序列的第i个元素是什么?

答:由于栈具有“先进后出”的特性,因此只有将1、2、3、…、n依次都进栈后,出栈序列的第1个元素才能是n。所以,在这个出栈序列里,第个i元素应该是n-i+1。

2.设元素进栈的次序是a,b,c,d,e。试问,在下面所列的6种元素序列里,哪些可以是这个栈的出栈序列?

A.c,e,a,b,d B.c,b,a,d,e C.d,c,a,b,e

D.a,c,b,e,d E.a,b,c,d,e F.e,a,b,c,d 答:对A进行分析。由于是c第1个出栈,因此b必须先于a出栈。但所给序列里,a

却先于b出栈,故A不能是该栈的出栈序列。

对C进行分析。由于是d第1个出栈,因此a、b、c三者出栈的顺序必须是c、b、a。但所给序列里,a却先于b出栈,故C不能是该栈的出栈序列。

对F进行分析。由于是e第1个出栈,因此a、b、c、d四者出栈的顺序必须是d、c、b、a。但所给序列里,它们的出栈顺序全乱了,故F不能是该栈的出栈序列。

因此,所列的6种元素序列里,只有B、D、E可以是这个栈的出栈序列。

3.有一个顺序栈Ss,其栈顶指针为Ss_top,栈底指针为Ss_bottom。阅读下面给出的算法,其中的两条prinf函数的输出结果各是什么?(算法中的Push_Ss(Ss_top, ch)表示将ch 里的元素进栈,Pop_Ss(Ss_top, ch)表示将栈顶元素出栈,存入ch中)

print ()

{

for (ch = …A?; ch <= …A?+12 ; ch++)

{

Push_Ss(Ss_top, ch) ;

printf (“%c”, ch);

}

while (Ss_top != Ss_bottom)

{

Pop_Ss(Ss_top, ch);

printf (“%c”, ch);

}

}

答:第1条printf的输出是前13个英文大写字母ABCDEFGHIJKLM,第2条printf输出的是前面输出的倒置,即MLKJIHGFEDCBA。

4.设有6个元素a1、a2、a3、a4、a5、a6,它们以此顺序依次进栈。假定要求它们的出栈顺序是a4、a3、a2、a6、a5、a1,那么应该如何安排push和pop操作序列?

答:所需的push和pop操作序列如下:

push,push,push,push,pop,pop,pop,push,push,pop,pop,pop 5.有中缀表达式a / ( b / ( c / ( d / e ) ) )。有人将其转化为相应的后缀表达式是abcde////。这一转化结果对吗?

答:转化结果是对的。

6.试述栈与队列各自具有什么样的逻辑特点?它们之间又有什么共同点?

答:对于栈来说,由于只能在栈顶处进行插入和删除操作,这就使得数据元素到达栈(即往栈里插入元素)的顺序与数据元素离开栈(即从栈里删除元素)的顺序恰好相反。所以,堆栈的逻辑特点是后进先出(LIFO),或先进后出(FILO)。而对队列来说,插入在一端进行,删除在另一端进行,这就使得数据元素到达队列(即往队列里插入元素)的顺序与数据元素离开队列(即从队列里删除元素)的顺序是完全一致的。所以,队列的逻辑特点是先进先出(FIFO)或后进后出(LILO)。它们之间的共同之处是插入和删除只能在表的端点处进行(要知道,对于线性表,可以在表的任何位置处插入和删除)。

7.有一个顺序队列,最大容量为5。初始时有Qs_front = Qs_rear = 0。画出做下列操作时队列及其首、尾指针的变化情况。若不能进队时就停止,并简述原因。

(1)d、e、b进队(2)d、e出队(3)i、j进队

(4)b出队(5)n、o、p进队

答:队列及其首、尾指针的变化情况如下图所示。

在做(5)时,由于队满(假溢出),故操作停止。

8.有一个递归函数Write(),定义如下:

Write(x)

{

if (x != 0)

{

Write (x-1) ;

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

printf (“%3d”, x);

printf (“/n”);

}

}

试问,Write(5)的输出结果是什么?

答:输出结果为:

1

2 2

3 3 3

4 4 4 4

5 5 5 5 5

四、应用

1.编写一个判顺序栈空的算法。要求是如果栈空,返回1,否则返回0。

答:算法设计如下:

Empty_Ss (Ss, Ss_top)

{

if (Ss_top == 0) /* 栈空*/

return (1) ;

else /* 栈不空*/

return (0) ;

}

2.编写一个算法,它能够输出顺序队列Qs上所有元素的值。

答:算法编写如下:

Print_Qs (Qs_front, Qs_rear)

{

if (Qs_front == Qs_rear) /* 队列空!*/

printf (“queue is empty!”);

else /* 队列非空!*/

{

qtr = Qs_front ;

while (qtr <= Qs_rear)

{

printf (“%d”, *qtr);

qtr++ ;

}

}

}

3.编写一个算法,它能够取得链式队列首元素的值。

答:取得链式队列首元素的值,只有在队列非空的前途下才有意义。算法编写如下。

Getf_Lq(Lq_front, Lq_rear)

{

if (Lq_front == Lq_rear) /* 队列空!*/

printf (“The linked queue is empty!”);

else /* 队列非空!*/

{

ptr = Lq_front->Next ;

x = ptr->Data ;

return (x) ;

}

}

4.有五个人顺序坐在一起。问第5个人多少岁,回答说比第4个人大2岁;问第4个人多少岁,回答说比第3个人大2岁;问第3个人多少岁,回答说比第2个人大2岁;问第2个人多少岁,回答说比第1个人大2岁;问第1个人多少岁,回答说是10岁。试给出该递归的公式、结束条件,并编写出相应的递归算法。

答:递归公式为:

age(n)=age(n-1)+2 2<=n<=5

递归的结束条件是:

age(1)=10

相应算法为:

Age (n)

{

if (n == 1)

return (10);

else

{

x=age(n-1)+2 ;

return (x) ;

}

}

5.将中缀表达式转化为后缀表达式的方法类似于中缀表达式求值。具体地,要开辟一个运算符栈op和一个数组st。在自左至右扫描算术表达式时,遇到操作数就直接顺序存入

st;遇到运算符时就与op栈顶元素比较,高则进栈,不高则让栈顶元素出栈,存入st,然后该运算符再次去与新的op栈顶元素比较。最后,在数组st里形成所需要的后缀表达式。试用这种方法,用图示将中缀表达式5+8*3-2转化成为相应的后缀表达式。

答:相应的后缀表达式是583*+2-,其图示如下。

6.语言编译时,总是先将中缀表达式转化成为后缀表达式,然后再计算后缀表达式的值,因为后缀表达式已经去除了括号,没有了运算符的优先级。计算后缀表达式的方法是只开辟一个对象栈ob,当从左往右扫描后缀表达式时,每遇到操作数就让其进入ob栈,每遇到运算符就从ob栈里弹出两个操作数进行当前的计算,并将计算结果进ob栈。该过程直至整个表达式结束。ob栈的栈顶值就是最终结果。试用图示计算后缀表达式583*+2-的值。

答:计算结果为27,其图示如下。

第4章习题解答

一、填空

1.字符串是一种特殊的线性表,特殊在于它的数据元素只能是字符,特殊在于串可以作为一个整体参与所需要的处理。

2.空格串是由空格组成的串,空串是不含任何字符的串,因此空格串和空串不是一个概念。

3.字符串中任意多个连续字符所组成的子序列,被称作是这个串的“子串”,这个字符串本身则称为“主串”。

4.我们说两个字符串相等,在计算机内部实际上是通过对相应位置上字符ASCII 码

的比较而得到的结论。

5.设有串s=“I am a teacher”。该串的长度是14 。

6.设有三个串:s1=“Good”,s2=“Ф”,s3=“bye!”。则s1、s2、s3连接后的结果串应该是“Good bye! ”。

7.所谓“数组”,是指n(n>1)个具有相同类型的数据的有序集合。

8.矩阵与通常所说的二维数组有关。

9.所谓“特殊矩阵”,是指那些元素在矩阵中的分布具有一定规律性的矩阵;而矩阵中的零元素个数远远多于非零元素的个数,但非零元素的分布却没有规律,这样的矩阵被称为“稀疏矩阵”。

10.在一个n阶方阵A中,若所有元素都有性质:a ij = a ji (1≤i, j≤n),就称其为对称矩阵。

二、选择

1.设有两个串s1和s2。求s2在s1中首次出现的位置的操作称为B 。

A.连接B.模式匹配C.求子串D.求串长

2.有串:“Ф”,那么它的长度是 B 。

A.0 B.1 C.2 D.3

3.设有串s1=“ABCDEFG”和s2=“PQRST”。已知:算法con(x, y)返回串x和y的连接串;subs(s, i, j)返回串s的第i个字符开始往后j个字符组成的子串;len(s)返回串s的长度。那么,con(subs(s1, 2, len(s2)), subs(s1, len(s2), 2))的操作结果是串D 。

A.BCDEF B.BCDEFG C.BCPQRST D.BCDEFEF 4.设有一个8阶的对称矩阵A,采用以行优先的方式压缩存储。a11为第1个元素,其存储地址为1,每个元素占一个地址空间。试问元素a85的地址是A。

A.33 B.30 C.13 D.23

5.一个m*m的对称矩阵,如果以行优先的方式压缩存入内存。那么所需存储区的容量应该是 C 。

A.m*(m-1)/2 B.m*m/2 C.m*(m+1)/2 D.(m+1)*(m+1)/2 6.二维数组M的每个元素含4个字符(每个字符占用一个存储单元),行下标i从1变到5,列下标j从1变到6。那么按行顺序存储时元素M[4][6]的起始地址与M按列顺序存储时元素 B 的起始地址相同。

A.M[3][5] B.M[4][5] C.M[4][6] D.M[5][5] 7.二维数组M中的每个元素占用3个存储单元,行下标i从1变到8,列下标j从1变到10。现从首地址为SA的存储区开始存放A。那么该数组以行优先存放时,元素A[8][5]的起始地址应该是 C 。

A.SA+141 B.SA+180 C.SA+222 D.SA+225 8.设有一个5阶上三角矩阵A,将其元素按列优先顺序存放在一维数组B中。已知每个元素占用2个存储单元,B[1]的地址是100。那么A[3][4]的地址是A。

A.116 B.118 C.120 D.122

(分析:把一个上三角矩阵按列优先顺序存放在一个一维数组B中,元素的顺序是:

a11a12a22a13……

A[3,4]的地址=100+a34前面的元素个数*2

=100+(前3列的个数+本列a34前面的个数)*2

=100+((1+2+3)+2)*2=116

三、问答

1.为什么可以把二维数组视为是一种线性结构?

答:实际上,二维数组是一种较为复杂的数据结构,数据元素之间的关系并不是线性的。不过,如果我们把它看作是其每个元素为一维数组的一个一维数组,那么就可以把二维数组视为是线性表的一种推广(因为一维数组即是线性表),因此可以说它的数据元素间的逻辑关系呈现出的是一种线性结构。

2.图4-34(a)所示为一个特殊矩阵A5 5,这种形式的矩阵被称作是“带状矩阵”,因为它的非零元素都分布在以主对角线为中心的一个带状区域里,其他位置上的元素全部为0。可以以行优先的方式,将其压缩存储到一个一维数组里,如图4-34(b)所示。试找出元素下标i、j与存储序号k间的对应关系。

图4-34 带状矩阵

答:压缩存储元素下标i、j与存储序号k间的对应关系是:

k = 2*i + j – 2

3.一个稀疏矩阵如图4-35所示。试问,它对应的三元组表是什么?

图4-35 稀疏矩阵示例

答:它所对应的三元组表如下。

四、应用

1.请将算法4-1改为用while循环来实现。

答:改写的算法4-1可以是如下所示。

Concat_St(St1, St2)

{

char St3[maxsize]; /* 创建一个新的顺序串为空*/

St3_len=0;

if (St1_len+St2_len>maxsize+1) /* 新串放不下两个串*/

{

printf(“两串长度之和超长!”);

return(NULL);

}

else

{

i=1;

while (i<=St1_len)

{

St3[i]=St1[i];

i++;

}

j=1;

while (j<= St2_len)

{

St3[j+St1_len]=St2[j];

j++;

}

St3_Len=St1_len+St2_len;

St3[St3_len+1]= “\0”;

return(St3);

}

}

2.算法4-2也可以这样来描述,直接核对相应位置上的字符是否相同,然后再分别情况做出判断:一是有不相同的字符出现,一是有一个字符串比另一个字符串长,最后则是两个串完全相等。按照这样的设计,改写算法4-2。

答:按照这样的设计,算法4-2的描述如下。

Equal_St(St1, St2)

{

i=1;

while (St1[i] != “\0”) /* 两串进行比较*/

{

if (St1[i] == St2[i]) /* 相等,继续比较*/

i++;

else /* 不等,强制退出*/

black;

}

if (St1[i] != St2[i]) /* 比较是由于相应位置上的字符不同而结束*/

return (0);

else

{

if (St1[i] != “\0” || St2[i] != “\0”) /* 比较是由于长度不同而结束*/

return (0);

else

return (1);

}

}

3.算法:

Trans_St(St,ch1,ch2)

{

i=1;

While(St[i]!="\0")

{

if(St[i]==ch1)

St[i]==ch2;

i++;

}

}

是通过while循环来实现将顺序串St中所有的字符ch1改为字符ch2的。请改写成用for 循环来实现相同的功能。

答:用for 循环改写的算法如下。

Trans_St(St, ch1, ch2)

{

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

if (St[i] == ch1)

St[i] = ch2;

}

4.编写一个算法,将顺序串St中所有的大写字母全部换成小写字母。(提示:大写英文字母A~Z对应的ASCII码为65~90,小写英文字母a~z对应的ASCII码为97~122,在大写字母的ASCII码上加32,就是对应小写字母的ASCII码)

答:算法编写如下。

Catosm_St(St)

{

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

if ((A<=St[i])&&(St[i]<=Z))

St[i]=St[i]+32;

}

5.已知顺序串St,编写一个算法,将其中第i个字符开始连续的j个字符删除。(提示:先要判断所给参数是否合理,然后通过将第i+j开始往后的字符全部移动j个位置,完成删除的功能)

答:算法编写如下。

Moveij(St, i, j)

{

if (i+j<=St_len)

{

for (k=i+j; k<=St_len; k++) /* 将i+j开始往后的所有字符前移j个位置*/

St[k-j]=St[k];

St_len=St_len-j; /* 修改St的长度*/

St[St_len]= “\0”; /* 安放新的串结束符*/

}

else

printf (“参数不合理,无法进行删除!”);

}

6.在算法4-12的最后,为了释放被删结点使用的存储空间,先做了操作:

ptr->Next = NULL;

把由指针ptr指向的最后一个要释放空间的结点的Next域设置为NULL,然后通过while循环完成释放。其实,由于知道要释放空间的结点共有m个,因此可以取消这一操作,改用for循环通过m来控制释放空间的结点个数。请试着按照这一思路改写那一小段算法。

答:改写一小段算法如下。

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

{

ptr=rtr;

rtr=rtr->Next;

free(ptr);

}

7.编写一个算法,功能是复制一个链串。

答:复制一个完整的链串,是一件比较容易的事情。其算法起名为Copy_Lt(),参数为Lt1。具体编写如下。

Copy_Lt(Lt1)

{

ptr=Lt1_h;

rtr=malloc(size);

rtr->Data=ptr->Data;

Lt2_h=rtr;

ptr=ptr->Next;

while (ptr != NULL)

{

qtr=malloc(size);

qtr->Data=ptr->Data;

rtr->Next=qtr;

ptr=ptr->Next;

}

rtr->Next=NULL;

return(Lt2_h);

}

算法是通过while循环,不断修改指针ptr,以便指向链串Lt1的各个结点;指针rtr总是指向当前已形成的新链串Lt2的最后一个结点;用指针qtr指向刚申请到的新存储结点,并把它链入到rtr所指结点的后面。

8.已知两个mⅹn的矩阵A和B。编写一个算法,求C=A+B。即C也是一个mⅹn的矩阵,其元素满足条件:

c ij = a ij + b ij(1≤i≤m,1≤j≤n)

答:算法名为Add_Mt(),参数为A,B,C。

Add_Mt(A, B, C)

{

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

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

C[i][j] = A[i][j] + B[i][j];

}

第5章习题解答

一、填空

1.结点数为7的二叉树的高度最矮是2 ,最高是6 。

2.给定二叉树的结点数,要使树高为最大,那么该树应该是单枝形状。

3.给定二叉树的结点数,要使树高为最矮,那么该树应该是完全二叉树形状。

4.如果一棵满二叉树的深度为6,那么它共有127 个结点,有64 个叶结点。

5.有15个结点的二叉树,最少有1 个叶结点,最多有8 个叶结点。

6.由n个带权值的叶结点生成的哈夫曼树,最终共有2n-1个结点。

7.将一棵完全二叉树按层次进行编号。那么,对编号为i的结点,如果有左孩子,则左孩子的编号应该是2i;如果有右孩子,则右孩子的编号应该是2i+1 。

8.若二叉树共有n个结点,采用二叉链表存储结构。那么在所有存储结点里,一共会有2n 个指针域,其中有n+1 个指针域是空的。

9.深度为5的二叉树,至多有31 个结点。

10.在二叉树中,有一个结点具有左、右两个孩子。那么在中序遍历序列里,它的右孩子一定排在它的右边。

二、选择

1.在所给的4棵二叉树中,C 不是完全二叉树。

2.把一棵深度为3的左单支二叉树改造成完全二叉树时,要增添D 个空结点。

A.10 B.8 C.6 D.4

3.设有一棵5个结点的二叉树,其先序遍历序列为:A-B-C-D-E,中序遍历序列为:B-A-D-C-E,那么它的后序遍历序列为 B 。

A.A-B-D-E-C B.B-D-E-C-A

C.D-E-C-A-B D.A-B-C-D-E

数据结构试题库答案

数据结构试题及答案 一、单项选择题 (1)一个算法应该就是()。 A)程序???B)问题求解步骤得描述 C)要满足五个基本属性??D) A与C (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)下列程序得时间复杂度为() i=0;s=0; while(s

经典数据结构面试题(含答案)

栈和队列的共同特点是__________________________ .栈通常采用的两种存储结构是______________________ .用链表表示线性表的优点是_______________________ 8.在单链表中,增加头结点的目的是___________________ 9.循环链表的主要优点是________________________- 12.线性表的顺序存储结构和线性表的链式存储结构分别是 __________________________ 13.树是结点的集合,它的根结点数目是_____________________ 14.在深度为5的满二叉树中,叶子结点的个数为_______________ 15.具有3个结点的二叉树有(_____________________ 16.设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为____________________ 17.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是 ____________________________ 18.已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为______________________ 19.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是_______________________ 20.数据库保护分为:安全性控制、完整性控制、并发性控制和数据的恢复。 在计算机中,算法是指_______________________ 算法一般都可以用哪几种控制结构组合而成_____________________ .算法的时间复杂度是指______________________ 5. 算法的空间复杂度是指__________________________ 6. 算法分析的目的是__________________________

2017年数据结构期末考试题及答案A

2017年数据结构期末考试题及答案 一、选择题(共计50分,每题2分,共25题) 1 ?在数据结构中,从逻辑上可以把数据结构分为 C 。 A. 动态结构和静态结构B?紧凑结构和非紧凑结构 C.线性结构和非线性结构 D .内部结构和外部结构 2?数据结构在计算机内存中的表示是指 A ° A. 数据的存储结构 B.数据结构 C.数据的逻辑结构 D .数据元 素之间的关系 3.在数据结构中,与所使用的计算机无关的是数据的 A 结构。 A. 逻辑B?存储 C.逻辑和存储 D.物理 4 .在存储数据时,通常不仅要存储各数据元素的值,而且还要存储 C ° A.数据的处理方法B?数据元素的类型 C.数据元素之间的关系 D.数据的存储方法 5. 在决定选取何种存储结构时,一般不考虑 A ° A.各结点的值如何B?结点个数的多少 C?对数据有哪些运算 D.所用的编程语言实现这种结构是否方便。 6. 以下说法正确的是D ° A. 数据项是数据的基本单位 B. 数据元素是数据的最小单位 C. 数据结构是带结构的数据项的集合 D. —些表面上很不相同的数据可以有相同的逻辑结构 7. 在以下的叙述中,正确的是B ° A. 线性表的顺序存储结构优于链表存储结构 B. 二维数组是其数据元素为线性表的线性表 C?栈的操作方式是先进先出 D.队列的操作方式是先进后出

8. 通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着 A. 数据元素具有同一特点 B. 不仅数据元素所包含的数据项的个数要相同,而且对应的数据项的类型要一致 C. 每个数据元素都一样 D. 数据元素所包含的数据项的个数要相等 9 ?链表不具备的特点是 A 。 A.可随机访问任一结点 B.插入删除不需要移动元素 C?不必事先估计存储空间 D.所需空间与其长度成正比 10. 若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一 个结点,则采用 D 存储方式最节省运算时间。 A.单链表B ?给出表头指针的单循环链表 C.双链表D ?带头结点 的双循环链表 11. 需要分配较大空间,插入和删除不需要移动元素的线性表,其存储结构是 B 。 A.单链表B .静态链表 C.线性链表 D .顺序存储结构 12 .非空的循环单链表head的尾结点(由p所指向)满足C 。 A. p—>next 一NULL B. p — NULL C. p—>next == head D. p = = head 13 .在循环双链表的p所指的结点之前插入s所指结点的操作是 D 。 A .p—> prior-> prior=s B .p—> prior-> n ext=s C.s —> prior—> n ext = s D.s —> prior—> prior = s 14 .栈和队列的共同点是C 。 A.都是先进后出 B .都是先进先出 C.只允许在端点处插入和删除元素 D .没有共同点

《数据结构》题库及答案

《数据结构》题库及答案 一、选择题 1.线性表的顺序存储结构是一种 的存储结构,线性表的链式存储结构是一种 的存储结构。 a. 随机存储; b.顺序存储; c. 索引存取; d. HASH 存取 2.一个栈的入栈序列是a,b,c,d,e ,则栈的不可能的输出序列是 。 a. edcba; b. decba; c. dceab; d.abcde 3.一个队列的入队序列是1,2,3,4,则队列的输出序列是 。 a. 4,3,2,1; b. 1,2,3,4; c. 1,4,3,2; d.3,2,4,1 4.在一个单链表中,已知p 结点是q 结点的直接前驱结点,若在p 和q 之间插入结点s ,则执行的操作是 。 a. s->nxet=p->next; p->next=s; b. p->next=s->next; s->next=p; c. q->next=s; s->next=p; d. p->next=s; s->next=q; 5.设有两个串p,q ,求q 在p 中首次出现的位置的运算称作 。 a.联接 b.模式匹配 c.求子串 d.求串长 6.二维数组M 的成员是6个字符(每个字符占一个存储单元)组成的串,行下标i 的范围从0到8,列下标j 的范围从1到10,则存放M 至少需要 个字节。 a. 90 b.180 c.240 d.540 7.在线索二叉树中,结点p 没有左子树的充要条件是 。 a. p->lch==NULL b. p->ltag==1 c. p->ltag==1且p->lch=NULL d. 以上都不对 8.在栈操作中,输入序列为(A ,B ,C ,D ),不可能得到的输出序列为:______ A 、(A , B , C , D ) B 、(D ,C ,B ,A ) C 、(A ,C ,D ,B ) D 、(C ,A ,B ,D ) 9.已知某二叉树的后序序列是dabec ,中序序列是debac ,则它的先序序列是 。 A 、acbed B 、decab C 、deabc D 、cedba 10.设矩阵A 是一个对称矩阵,为了节省存储空间,将其下三角部分(见下图)按行序存放在一维数组B[1..n(n-1)/2]中,对任一上三角部分元素)(j i a ij ,在一维数组B 的存放位置是 。

数据结构模拟卷(含答案)经典习题培训讲学

数据结构模拟卷(含答案)经典习题

练习题 一、单项选择题 1. 若将数据结构形式定义为二元组(K,R),其中K是数据元素的有限集合,则R是K上( ) A. 操作的有限集合 B. 映象的有限集合 C. 类型的有限集合 D. 关系的有限集合 2. 在长度为n的顺序表中删除第i个元素(1≤i≤n)时,元素移动的次数为( ) A. n-i+1 B. i C. i+1 D. n-i 3. 若不带头结点的单链表的指针为head,则该链表为空的判定条件是( ) A. head==NULL B. head->next==NULL C. head!=NULL D. head->next==head 4. 引起循环队列队头位置发生变化的操作是( ) A. 出队 B. 入队 C. 取队头元素 D. 取队尾元素 5. 若进栈序列为1,2,3,4,5,6,且进栈和出栈可以穿插进行,则不.可能出现的出栈序列是( ) A. 2,4,3,1,5,6 B. 3,2,4,1,6,5 C. 4,3,2,1,5,6 D. 2,3,5,1,6,4

6. 字符串通常采用的两种存储方式是( ) A. 散列存储和索引存储 B. 索引存储和链式存储 C. 顺序存储和链式存储 D. 散列存储和顺序存储 7. 数据结构是() A.一种数据类型 B.数据的存储结构 C.一组性质相同的数据元素的集合 D.相互之间存在一种或多种特定关系的数据元素的集合 8. 算法分析的目的是() A.辨别数据结构的合理性 B.评价算法的效率 C.研究算法中输入与输出的关系 D.鉴别算法的可读性 9. 在线性表的下列运算中,不.改变数据元素之间结构关系的运算是 () A.插入B.删除 C.排序D.定位10. 下列图示的顺序存储结构表示的二叉树是( )

数据结构考试题库

数据结构考试题库

绪论 一、填空题 1.数据的逻辑结构被分为集合、(线性结构)、(树形结构)和(图状结构)四种。 2.物理结构是数据结构在计算机中的表示,又称为(存储结构)。 3.数据元素的逻辑结构包括( 线性)、(树)和图状结构3种类型,树形结构和图状结构合称为(非线性结构)。 4.(数据元素)是数据的基本单位,(数据项)是数据不可分割的最小单位。 5.线性结构中元素之间存在(一个对一个)关系,树形结构中元素之间存在(一个对多个)关系,图状结构中元素之间存在(多个对多个)关系。 ?6.数据结构是一门研究非数值计算的程序设计问题中:计算机的(数据元素)以及它们之间的(关系)和(运筹)等的学科。 7.算法的五个重要特性为有穷性、确定性、(输入)、(输出)和(可行性)。 二、选择题 1.数据的不可分割的基本单位是(D)。 A.元素 B.结点 C.数据类型 D.数据项 *2.线性表的逻辑顺序与存储顺序总是一致的,这种说法(B)。 A.正确 B.不正确 C.不确定 D.无法选择 3.线性结构是指数据元素之间存在一种(D)。 精心整理,用心做精品2

A.一对多关系 B.多对多关系 C.多对一关系 D.一对一关系 4.在数据结构中,从逻辑上可以把数据结构分成(A)。 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 5.线性表若采用链式存储结构时,要求内存中可用存储单元的 地址( D)。 A.必须是连续的 B.部分地址必须是连续的 C.一定是不连续的 D.连续不连续都可以 三、简答题 1.算法的特性是什么。 答:有穷性确定性可行性有0或多个输入有1或多个输出线性结构 一、填空题 1.在一个长度为n的线性表中删除第i个元素(1≤i≤n)时,需向前移动(n-i)个元素。 2.从循环队列中删除一个元素时,其操作是(先移动队首指针,后取出元素)。 3.在线性表的单链接存储中,若一个元素所在结点的地址为p,则其后继结点的地址为(p->next)。 4.在一个单链表中指针p所指向结点的后面插入一个指针q所指向的结点时,首先把(p->next)的值赋给q->next,然后(q->date)的值赋给p->next。 5.从一个栈删除元素时,首先取出(栈顶元素),然后再使(栈顶指针)减1。 6.子串的定位操作通常称做串的(模式匹配)。 精心整理,用心做精品3

数据结构试题及答案(10套最新)

单选题(每题2分,共20分) 1. 1. 对一个算法的评价,不包括如下(B )方面的内容。 A .健壮性和可读性 B .并行性 C .正确性 D .时空复杂度 2.2. 在带有头结点的单链表HL 中,要向表头插入一个由指针 p 指向 的结点,则执行(A )。 A. p->next=HL->next; HL->next=p; B. p->next=HL; HL=p; 都具有相同的(A )。 A.行号 B .列号 C .元素值 D .非零元素个数 9. 快速排序在最坏情况下的时间复杂度为(D )。 A. O(log 2n) B . O(nlog 2n) C . 0(n) D 10.10. 从二叉搜索树中查找一个元素时,其时间复杂度大致 为 A. O(n) B. O(1) C. O(log 2 n) D. O(n 二、 运算题(每题6分,共24分) 1. 1. 数据结构是指数据及其相互之间的 _________________ 。当结点之 间存在M 对N (M N)的联系时,称这种结构为 __________________________ 。 2. 2. 队列的插入操作是在队列的_ _尾 ________ 行,删除操作是在队 列的 ____ 首 _____ 行。 3. 3. 当用长度为N 的数组顺序存储一个栈时,假定用top==N 表示栈 C. p->next=HL; p=HL; 3. 3. A. C. D. HL=p; p-> next=HL; 对线性表,在下列哪种情况下应当采用链表表示? 经常需要随机地存取元素 B. 表中元素需要占据一片连续的存储空间 一个栈的输入序列为1 2 3, 4. 4. 列的是(C ) A. 2 3 1 C. 3 1 2 AOV 网 是一种(D ) 有向 图 B .无向图 (B ) 经常需要进行插入和删除操作 D.表中元素的个数不变 则下列序列中不可能是栈的输出序 B. 3 2 1 5. 5. 6. .无向无环图 D .有向无环图 采用 开放定址法处理散列表的冲突时,其平均查找长度( B. 高于链接法处理冲突 D .高于二分查找 7. 8. 6. A.低于链接法处理冲突 .与链接法处理冲突相同 7. 参数。 A.值 8. B)。 若需要利用形参直接访问实参时,应将形参变量说明为( B .函数 C .指针 D .引用 在稀疏矩阵的带行指针向量的链接存储中,每个单链表中的结点 9. .0(n 2) (C )。 2 )

数据结构模拟卷(含答案)经典习题

练习题 一、单项选择题 1. 若将数据结构形式定义为二元组(K,R),其中K是数据元素的有限集合,则R是K上( ) A. 操作的有限集合 B. 映象的有限集合 C. 类型的有限集合 D. 关系的有限集合 2. 在长度为n的顺序表中删除第i个元素(1≤i≤n)时,元素移动的次数为( ) A. n-i+1 B. i C. i+1 D. n-i 3. 若不带头结点的单链表的指针为head,则该链表为空的判定条件是( ) A. head==NULL B. head->next==NULL C. head!=NULL D. head->next==head 4. 引起循环队列队头位置发生变化的操作是( ) A. 出队 B. 入队 C. 取队头元素 D. 取队尾元素 5. 若进栈序列为1,2,3,4,5,6,且进栈和出栈可以穿插进行,则不.可能出现的出栈序列是( ) A. 2,4,3,1,5,6 B. 3,2,4,1,6,5 C. 4,3,2,1,5,6 D. 2,3,5,1,6,4 1

6. 字符串通常采用的两种存储方式是( ) A. 散列存储和索引存储 B. 索引存储和链式存储 C. 顺序存储和链式存储 D. 散列存储和顺序存储 7. 数据结构是() A.一种数据类型 B.数据的存储结构 C.一组性质相同的数据元素的集合 D.相互之间存在一种或多种特定关系的数据元素的集合 8. 算法分析的目的是() A.辨别数据结构的合理性 B.评价算法的效率 C.研究算法中输入与输出的关系 D.鉴别算法的可读性 9. 在线性表的下列运算中,不.改变数据元素之间结构关系的运算是 () A.插入B.删除 C.排序D.定位 10. 下列图示的顺序存储结构表示的二叉树是( ) 2

数据结构期末考试试题及答案

数据结构期末考试试题及答案 、选择题 评价一个算法时间性能的主要标准是()。1. A、算法易于调试 B、算法易于理解 C、算法的稳定性和正确性 D、算法的时间复杂度 )等五个特性。计算机算法具备有输入、输出、 2. A、可行性、可移植性和可扩充性 B、可行性、确定性和有穷性 C、确定性、有穷性和稳定性 D、XX、稳定性和XX 。带头结点的单链表head为空的判定条件是()3. A、h ead==NULL B、h ead->next==NULL C、head->next==head D、head!=NULL 以下关于线性表的说法不正确的是()。4. A、线性表中的数据元素可以是数字、字符、记录等不同类型。 B、线性表中包含的数据元素个数不是任意的。

C、线性表中的每个结点都有且只有一个直接前趋和直接后继。 D、存在这 样的线性表:表中各结点都没有直接前趋和直接后继。 在顺序表中,只要知道(),就可在相同时间内求出任一结点的存储地址。 5.A、基地址 B、结点大小 C、向量大小 D、基地址和结点大小 ()运算中,使用顺序表比链表好。6. A、插入 B、删除 C、根据序号查找 D、根据元素值查找一个长度为n的顺序表中,向第i个元素之前插入一个新元素时,需要向后移动()个元素7.A、n-i B、n-i+1 C、n-i-1 D、i ()适合作为经常在首尾两端操作线性表的存储结构。8. A、顺序表 B、单链表 C、循环链表 D、双向链表

栈和队列的共同点是() 9. A、都是先进后出 B、都是先进先出 C、只允许在端点处插入和删除元素 D、没有共同点 一个队列的入列序列是1234,则队列的输出序列是()。10. A 、4321 B 、12 3 4 C 、1432 D 、 3241队列与一般的线性表的区别在于()。11. A、数据元素的类型不同 B、运算是否受限制 C、数据元素的个数不同 D、逻辑结构不同 假上溢”现象会出现在()中。12. A、循环队列 B、队列 C、链队列 、顺序队列D.二、填空

数据结构题库教材

2013-2014学年二学期数据结构期末考试模拟试卷(1~6卷) 一、应用题(3小题,共24分) 1已知某字符串S中共有8种字符,各种字符分别出现2次、1次、4次、5次、7次、3 次、4次和9次,对该字符串用[0,1]进行前缀编码,问该字符串的编码至少有多少位。 【解答】以各字符出现的次数作为叶子结点的权值构造的哈夫曼编码树如图所示。其带权路 径长度=2X 5+1X 5+3X 4+5X 3+9X 2+4X 3+4X 3+7X 2=98,所以,该字符串的编码长度至少为98位。 2.已知关键码序列为(Ja n, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec), 散列表的地址空间为0~16,设散列函数为H(x)= [i/2」(取下整数),其中i为关键码 中第一个字母在字母表中的序号,采用链地址法处理冲突构造散列表,并求等概率情况下查找成功的平均查找长度。 【解答】H(Ja n)=10/2=5, H(Feb)=6/2=3, H(Mar)=13/2=6, H(Apr)=1/2=0 H(May)=13/2=6, H(Ju n)=10/25, H(Jul)=10/25, H(Aug)=1/2=0 H(Sep)=19/2=8, H(Oct) =15/2=7, H(Nov) =14/2=7, H(Dec) =4/2=2 采用链地址法处理冲突,得到的开散列表如下: 平均查找长度=(1 X 7+2X 4+3X 1)/12=18/12

3.分析下面各程序段的时间复杂度 (1)s1(int n) { int p=1,s=0; for (i=1;iv=n;i++) { p*=i;s+=p; } return(s); } ——0(n) (2)s2(int n) x=0;y=0; For (k=1;kv=n;k++) x++; For (i=1;iv=n;i++) For (j=1;jv=n;j++) y++; ——0(n) 1?下述算法的功能是什么? ListNode *Demo l(LinkList L P ListNode *p) ("L是有头结蛊的单链表 ListNodc *q=L->rLCxt P (1) V ‘V … 」(1 )返回结点*p的直接前趋结点地址。 q=q->nest; if (q) return q, else ?ro< #*p not in L"); I ⑵ i/oid Demo2(LisINode *p ,ListNode +q) 〔//p t*q*8S 表中的 两个结点 (2)交换结点*p和结点*q (p和q的值不变)。 DataTypetemp; temp=p->data, p->data=q->data; q-x^ata^emp, 1.对给定的一组权值W=( 5, 2, 9, 11, 8, 3, 7),试构造相应的哈夫曼树,并计算它的带权路径长度。【解答】构造的哈夫曼树如图所示。

算法与数据结构题库与答案

一、单项选择题 1 某算法的时间复杂度是O(n 2 ) ,表明该算法()。 A 问题规模是n2 B 问题规模与n2成正比 C 执行时间等于n2 D 执行时间与n2成正比 2、关于数据结构的描述,不正确的是()。 A数据结构相同,对应的存储结构也相同。 B数据结构涉及数据的逻辑结构、存储结构和施加其上的操作等三个方面。 C数据结构操作的实现与存储结构有关。 D定义逻辑结构时可不考虑存储结构。 3、按排序策略分来,起泡排序属于()。 A插入排序B选择排序C交换排序D归并排序 4、利用双向链表作线性表的存储结构的优点是()。 A便于进行插入和删除的操作 B 提高按关系查找数据元素的速度 C节省空间D便于销毁结构释放空间 5、一个队列的进队顺序为1,2,3,4,则该队列可能的输出序列是()。 A 1,2,3,4 B 1,3,2,4 C 1,4,2,3 D 4,3,2,1 6、 Dijkstra算法是按()方法求出图中从某顶点到其余顶点最短路径的。 A按长度递减的顺序求出图的某顶点到其余顶点的最短路径 B按长度递增的顺序求出图的某顶点到其余顶点的最短路径 C通过深度优先遍历求出图中从某顶点到其余顶点的所有路径 D通过广度优先遍历求出图的某顶点到其余顶点的最短路径 7、字符串可定义为n( n≥ 0)个字符的有限()。其中,n是字符串的长度,表明字符串中字符的个数。 A集合B数列C序列D聚合 8、在二维数组A[9][10]中,每个数组元素占用 3 个存储单元,从首地址SA 开始按行连续存放。在这种情况下,元素A[8][5]的起始地址为()。 A SA+141 B SA+144 C SA+222 D SA+255 9、已知广义表为L(A(u,v,(x,y),z),C(m,(),(k,l,n),(())),((())),(e,(f,g),h)),则它的长度是()。 A2B3C4D5 10.对于具有n(n>1)个顶点的强连通图,其有向边条数至少有_____。 A. n+1 B. n C. n-1 D. n-2 11.一个递归算法必须包括 __________ 。 A. 递归部分 B . 结束条件和递归部分 C. 迭代部分 D. 结束条件和迭代部分 12.从逻辑上看可以把数据结构分为__________两大类。 A.动态结构、静态结构B.顺序结构、链式结构 C.线性结构、非线性结构D.初等结构、构造型结构 13、若在长度为n 的顺序表的表尾插入一个新元素的渐进时间复杂度为()。 A O(n) B O(1) C O(n 2) D O(log 2n) 14.采用顺序搜素方式搜索长度为 n 的线性表时,在等概率情况下,搜索成功时的平均搜索 长度为 __________。 A. n B. n/2 C . (n+1)/2 D. (n-1)/2 15、非空的循环单链表first的链尾结点(由p 所指向)满足()。 A p->link==NULL; B P==NULL;

经典数据结构上机题_答案解析

数据结构上机实验题目 实验一线性表的顺序存储结构 实验学时 2学时 背景知识:顺序表的插入、删除及应用。 目的要求: 1.掌握顺序存储结构的特点。 2.掌握顺序存储结构的常见算法。 实验容 1.输入一组整型元素序列,建立顺序表。 2.实现该顺序表的遍历。 3.在该顺序表中进行顺序查找某一元素,查找成功返回1,否则返回0。4.判断该顺序表中元素是否对称,对称返回1,否则返回0。 5.实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数。 6.输入整型元素序列利用有序表插入算法建立一个有序表。 7.利用算法6建立两个非递减有序表并把它们合并成一个非递减有序表。 8. 利用该顺序结构实现循环队列的入队、出队操作。 8.编写一个主函数,调试上述算法。 #include #include

#define OVERFLOW 0 #define MAXSIZE 100 typedef int ElemType; typedef struct list {ElemType elem[MAXSIZE]; int length; }Sqlist; void Creatlist(Sqlist &L) {int i; printf("请输入顺序表的长度:"); //输入一组整型元素序列,建立一个顺序表。 scanf("%d",&L.length); for(i=0;i

《数据结构》期末考试题及答案

2011-2012学年第一学期期末考查 《数据结构》试卷 (答案一律写在答题纸上,在本试卷上做答无效) 一、选择(每题1分,共10分) 1.长度为n的线性表采用顺序存储结构,一个在其第i个位置插入新元素的算法时间复杂度为(D) A.O(0) B.O(1) C.O(n) D.O(n2) 2.六个元素按照6,5,4,3,2,1的顺序入栈,下列哪一个是合法的出栈序列?(D) A.543612 B.453126 C.346512 D.234156 3.设树的度为4,其中度为1、2、3、4的结点个数分别是4、2、1、2,则树中叶子个数为(B ) A.8 B.9 C.10 D.11 4.设森林F对应的二叉树B有m个结点,B的右子树结点个数为n,森林F中第一棵树的结点个数是( B ) A. m-n B.m-n-1 C.n+1 D.m+n 5.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是(B) A.9 B.11 C.15 D.不确定 6.下列哪一个方法可以判断出一个有向图是否有环。(A) A.深度优先遍历 B.拓扑排序 C.求最短路径 D.求关键路径 7.第7层有10个叶子结点的完全二叉树不可能有(B )个结点。 A.73 B.234 C.235 D.236 8.分别用以下序列构造二叉排序树,与用其他三个序列构造的结果不同的是(B) A.(100,80,90,60,120,110,130) B.(100, 120, 110,130,80, 60,90) C.(100,60,80,90,120,110,130) D.(100,80, 60,90, 120, 130,110) 9.对一组数据(84,47,25,15,21)排序,数据的排列次序在排序过程中变化如下:(1)84 47 25 15 21 (2)15 47 25 84 21 (3)15 21 25 84 47(4)15 21 25 47 84则采用的排序方法是(B ) A.选择排序 B.起泡排序 C.快速排序 D.插入排序 10.对线性表进行折半查找时,要求线性表必须(D) A.以顺序方式存储 B.以顺序方式存储,且数据元素有序

数据结构相关题库及答案

第三章栈和队列 一、判断题: 1、栈和队列都是限制存取点的线性结构(易) 2、栈和队列是两种重要的线性结构。(易) 3、带头结点的单链表形式的队列,头指针F指向队列的头结点,尾指针R指向队列的最后一个结点(易) 4、在对不带头结点的链队列作出队操作时,不会改变头指针的值。(易) 答案:1-4 √√×× 二、选择题: 1、一个栈的入栈序列a,b,c,d,e,则栈的不可能的输出序列是C____。 A、 edcba B、 decba C、 dceab D、 abcde 2、若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi 为_C___。 A、 i B、 n=i C、 n-i+1 D、不确定 3、栈结构通常采用的两种存储结构是_A___。 A、顺序存储结构和链式存储结构 B、散列方式和索引方式 C、链表存储结构和数组 D、线性存储结构和非线性存储结构 4、判定一个顺序栈ST(最多元素为m0)为空的条件是_B___。A、top !=0 B、top= =0 C、top !=m0 D、top= =m0-1 5、判定一个顺序栈ST(最多元素为m0)为栈满的条件是D。A、top!=0 B、top= =0 C、top!=m0 D、top= =m0-1 6、队列操作的原则是( A ) A、先进先出 B、后进先出 C、只能进行插入 D、只能进行删 除 7、向一个栈顶指针为HS的链栈中插入一个s所指结点时,则执行__ _C_。(不带空的头结点) (易) A、HS—>next=s;9 B、s—>next= HS—>next; HS—>next=s; C、s—>next= HS; HS=s; D、s—>next= HS; HS= HS—>next

数据结构经典题目c语言代码

《数据结构》课程设计题目 (程序实现采用C语言) 题目1:猴子选王(学时:3) 一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。 要求:m及n要求从键盘输入,存储方式采用向量及链表两种方式实现该问题求解。 //链表 #include #include // 链表节点 typedef struct _RingNode { int pos; struct _RingNode *next; }RingNode, *RingNodePtr; // 创建约瑟夫环,pHead:链表头指针,count:链表元素个数 void CreateRing(RingNodePtr pHead, int count) { RingNodePtr pCurr = NULL, pPrev = NULL; int i = 1; pPrev = pHead; while(--count > 0)

{ pCurr = (RingNodePtr)malloc(sizeof(RingNode)); i++; pCurr->pos = i; pPrev->next = pCurr; pPrev = pCurr; } pCurr->next = pHead; // 构成环状链表 } void KickFromRing(RingNodePtr pHead, int n) { RingNodePtr pCurr, pPrev; int i = 1; // 计数 pCurr = pPrev = pHead; while(pCurr != NULL) { if (i == n) { // 踢出环 printf("\n%d", pCurr->pos); // 显示出圈循序 pPrev->next = pCurr->next; free(pCurr); pCurr = pPrev->next; i = 1; } pPrev = pCurr;

数据结构考试及答案()

数据结构考试及答案()

作者: 日期: 2

数据结构试题 一、单选题 1、在数据结构的讨论中把数据结构从逻辑上分为(C) A 内部结构与外部结构 B 静态结构与动态结构 C 线性结构与非线性结构 D 紧凑结构与非紧凑结构。 2、采用线性链表表示一个向量时,要求占用的存储空间地址(D) A 必须是连续的B部分地址必须是连续的 C 一定是不连续的D可连续可不连续 3、采用顺序搜索方法查找长度为n的顺序表时,搜索成功的平均搜索长度为 (D )。 An B n/2 C (n-1)/2 D (n+1)/2 4、在一个单链表中,若q结点是p结点的前驱结点,若在q与p之间插入结点s,则执行(D )o A s—link = p—link ;p—link = s; B p—link = s; s—link = q; C p—link = s—link ;s—link = p; D q—link = s; s—link = p; 5、如果想在4092个数据中只需要选择其中最小的5个,采用(C )方法最好。 A 起泡排序 B 堆排序C锦标赛排序 D 快速 排序 6、设有两个串t和p,求p在t中首次出现的位置的运算叫做(B )o A 求子串B模式匹配C 串替换 D 串连接 7、在数组A中,每一个数组元素A[i][j] 占用3个存储字,行下标i从1到8,

列下标j从1到10。所有数组元素相继存放于一个连续的存储空间中,则存放 该数组至少需要的存储字数是( C )。 A 80 B 100 C 240 D 270 8、将一个递归算法改为对应的非递归算法时,通常需要使用( A )。 A 栈B队列C循环队列D优先队列 9、一个队列的进队列顺序是1,2, 3, 4 ,则出队列顺序为(C )。 10、在循环队列中用数组A[0.. m-1]存放队列元素,其队头和队尾指针分别为front和rear,则当前队列中的元素个数是( D )。 A ( front - rear + 1) % m B (rear - front + 1) %m C ( front - rear + m) % m D ( rear - front + n) % m 11、一个数组元素a[i]与(A )的表示等价。 A * (a+i) B a+i C *a+i D &a+i 12、若需要利用形参直接访问实参,则应把形参变量说明为( B )参数 A指针 B 引用C值 D 变量 13、下面程序段的时间复杂度为(C) for (i nt i=0;i

数据结构试题及答案(10套最新)

一、单选题(每题 2 分,共20分) 1. 1.对一个算法的评价,不包括如下(B )方面的内容。 A.健壮性和可读性B.并行性C.正确性D.时空复杂度 2. 2.在带有头结点的单链表HL中,要向表头插入一个由指针p指向的结 点,则执行(A )。 A. p->next=HL->next; HL->next=p; B. p->next=HL; HL=p; C. p->next=HL; p=HL; D. HL=p; p->next=HL; 3. 3.对线性表,在下列哪种情况下应当采用链表表示?( B ) A.经常需要随机地存取元素 B.经常需要进行插入和删除操作 C.表中元素需要占据一片连续的存储空间 D.表中元素的个数不变 4. 4.一个栈的输入序列为1 2 3,则下列序列中不可能是栈的输出序列的是 ( C ) A. 2 3 1 B. 3 2 1 C. 3 1 2 D. 1 2 3 5. 5.AOV网是一种(D )。 A.有向图B.无向图C.无向无环图D.有向无环图 6. 6.采用开放定址法处理散列表的冲突时,其平均查找长度(B)。 A.低于链接法处理冲突 B. 高于链接法处理冲突 C.与链接法处理冲突相同D.高于二分查找 7.7.若需要利用形参直接访问实参时,应将形参变量说明为(D )参数。 A.值B.函数C.指针D.引用 8.8.在稀疏矩阵的带行指针向量的链接存储中,每个单链表中的结点都具 有相同的( A )。 A.行号B.列号C.元素值D.非零元素个数 9.9.快速排序在最坏情况下的时间复杂度为(D )。 A.O(log2n) B.O(nlog2n) C.0(n) D.0(n2) 10.10.从二叉搜索树中查找一个元素时,其时间复杂度大致为( C )。 A. O(n) B. O(1) C. O(log2n) D. O(n2) 二、运算题(每题 6 分,共24分) 1. 1.数据结构是指数据及其相互之间的______________。当结点之间存在M 对N(M:N)的联系时,称这种结构为_____________________。 2. 2.队列的插入操作是在队列的_ _尾______进行,删除操作是在队列的____ 首______进行。 3. 3.当用长度为N的数组顺序存储一个栈时,假定用top==N表示栈空,则 表示栈满的条件是___top==0___(要超出才为满)_______________。 4. 4.对于一个长度为n的单链存储的线性表,在表头插入元素的时间复杂度 为_________,在表尾插入元素的时间复杂度为____________。

数据结构经典例题

数据结构经典例题 1.设计一个算法将L拆分成两个带头节点的单链表L1和L2。 void split(LinkList *&L,LinkList *&L1,LinkList *&L2) { LinkList *p=L->next,*q,*r1; //p指向第1个数据节点 L1=L; //L1利用原来L的头节点 r1=L1; //r1始终指向L1的尾节点 L2=(LinkList *)malloc(sizeof(LinkList));//创建L2的头节点 L2->next=NULL; //置L2的指针域为NULL while (p!=NULL) { r1->next=p; //采用尾插法将*p(data值为ai)插入L1中 r1=p; p=p->next; //p移向下一个节点(data值为bi) q=p->next; //由于头插法修改p的next域,故用q保存*p的后继节点 p->next=L2->next; //采用头插法将*p插入L2中 L2->next=p; p=q; //p重新指向ai+1的节点 } r1->next=NULL; //尾节点next置空 } 2.查找链表中倒数第k个位置上的节点(k为正整数)。若查找成功,算法输出该节点的data域的值,并返回1;否则,只返回0。 typedef struct LNode {int data; struct LNode *link; } *LinkList; int Searchk(LinkList list,int k) { LinkList p,q; int count=0; p=q=list->link; while (p!=NULL) { if (countlink; p=p->link; } if (count

2015年数据结构期末考试题及答案

2012年数据结构期末考试题及答案 一、选择题 1.在数据结构中,从逻辑上可以把数据结构分为C。 A.动态结构和静态结构B.紧凑结构和非紧凑结构 C.线性结构和非线性结构D.内部结构和外部结构 2.数据结构在计算机内存中的表示是指A。 A.数据的存储结构B.数据结构C.数据的逻辑结构D.数据元素之间的关系 3.在数据结构中,与所使用的计算机无关的是数据的A结构。 A.逻辑B.存储C.逻辑和存储D.物理 4.在存储数据时,通常不仅要存储各数据元素的值,而且还要存储C。 A.数据的处理方法B.数据元素的类型 C.数据元素之间的关系D.数据的存储方法 5.在决定选取何种存储结构时,一般不考虑A。 A.各结点的值如何B.结点个数的多少 C.对数据有哪些运算D.所用的编程语言实现这种结构是否方便。 6.以下说法正确的是D。 A.数据项是数据的基本单位 B.数据元素是数据的最小单位 C.数据结构是带结构的数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 7.算法分析的目的是C,算法分析的两个主要方面是A。 (1)A.找出数据结构的合理性B.研究算法中的输入和输出的关系 C.分析算法的效率以求改进C.分析算法的易读性和文档性 (2)A.空间复杂度和时间复杂度B.正确性和简明性 C.可读性和文档性D.数据复杂性和程序复杂性 8.下面程序段的时间复杂度是O(n2)。

s =0; for(I =0;i<n;i++) for(j=0;j<n;j++) s +=B[i][j]; sum =s ; 9.下面程序段的时间复杂度是O(n*m)。 for(i =0;i<n;i++) for(j=0;j<m;j++) A[i][j] =0; 10.下面程序段的时间复杂度是O(log3n)。 i =0; while(i<=n) i =i * 3; 11.在以下的叙述中,正确的是B。 A.线性表的顺序存储结构优于链表存储结构 B.二维数组是其数据元素为线性表的线性表 C.栈的操作方式是先进先出 D.队列的操作方式是先进后出 12.通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着B 。 A.数据元素具有同一特点 B.不仅数据元素所包含的数据项的个数要相同,而且对应的数据项的类型要一致 C.每个数据元素都一样 D.数据元素所包含的数据项的个数要相等 13.链表不具备的特点是A。 A.可随机访问任一结点B.插入删除不需要移动元素 C.不必事先估计存储空间D.所需空间与其长度成正比 14.不带头结点的单链表head为空的判定条件是A。

相关文档
最新文档