数据结构各章复习题 - 图文

更新时间:2023-11-19 11:15:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

数据结构期末复习题及答案全集

第1 章绪论

一.填空题

1. 数据结构被形式地定义为(D, R),其中D是的有限集合,R是D上的有限集合。 2. 数据结构包括数据的、数据的和数据的这三个方面的内容。 3. 数据结构按逻辑结构可分为两大类,它们分别是和。

4. 线性结构中元素之间存在关系,树形结构中元素之间存在关系,图形结构中元素之间 存在关系。

5.在线性结构中,第一个结点前驱结点,其余每个结点有且只有 1个前驱结点;最后一个结点后续 结点,其余每个结点有且只有1个后续结点。

6. 在树形结构中,树根结点没有结点,其余每个结点有且只有个前驱结点;叶子结点没有 结点,其余每个结点的后续结点数可以。

7. 在图形结构中,每个结点的前驱结点数和后续结点数可以。 8. 数据的存储结构可用四种基本的存储方法表示,它们分别是。 9.数据的运算最常用的有5种,它们分别是。 10. 一个算法的效率可分为效率和效率。

11.数据结构是研讨数据的_(1)_和_(2)_,以及它们之间的相互关系,并对与这种结构定义相应的_(3)_,

设计出相应的(4)_。

12. 下面程序段中带下划线的语句的执行次数的数量级是( )。

i:=1;

WHILE i

二.选择

1.应用软件是指_________.

A)所有能够使用的软件 B) 能被各应用单位共同使用的某种软件 C)所有微机上都应使用的基本软件 D) 专门为某一应用目的而编制的软件

计算机学院甘士成 Copyright ? 1992 - 2012 Gane Cheng . All Rights Reserved . 1 / 66

2. 数据结构中,与所使用的计算机无关的是数据的结构.

A) 存储 B) 物理 C) 逻辑 D) 物理和存储

3. 算法分析的目的是____________

A) 找出数据结构的合理性 B) 研究算法中的输入和输出的关系 C) 分析算法的效率以求改进 D) 分析算法的易懂性和文档性

4. 计算机算法必须具备输入、输出和等5个特性。

A) 可行性、可移植性和可扩充性 B) 可行性、确定性和有穷性 C) 确定性、有穷性和稳定性 D) 易读性、稳定性和安全性 5. 下面说法错误的是()

(1)算法原地工作的含义是指不需要任何额外的辅助空间

(2) 在相同的规模n下,复杂度O(n)的算法在时间上总是优于复杂度O(2n)的算法 (3) 所谓时间复杂度是指最坏情况下,估算算法执行时间的一个上界 (4) 同一个算法,实现语言的级别越高,执行效率就越低

A.(1) B.(1),(2) C.(1),(4) D.(3) 6.从逻辑上可以把数据结构分为()两大类。

A.动态结构、静态结构 B.顺序结构、链式结构 C.线性结构、非线性结构 D.初等结构、构造型结构

★ 7.以下与数据的存储结构无关的术语是()。

A.循环队列 B. 链表 C. 哈希表 D. 栈

★ 8. 下列数据中,()是非线性数据结构。

A.栈 B. 队列 C. 完全二叉树 D. 堆

9.连续存储设计时,存储单元的地址()。

A.一定连续 B.一定不连续

C.不一定连续 D.部分连续,部分不连续

1. 数据元素是数据的最小单位。( ) 2. 记录是数据处理的最小单位。 ( )

3. 数据的逻辑结构是指数据的各数据项之间的逻辑关系;( ) 4.算法的优劣与算法描述语言无关,但与所用计算机有关。( ) 5.健壮的算法不会因非法的输入数据而出现莫名其妙的状态。( )

计算机学院甘士成 Copyright ? 1992 - 2012 Gane Cheng . All Rights Reserved . 2 / 66

三.判断题

6.算法可以用不同的语言描述,如果用C 语言或PASCAL语言等高级语言来描述,则算法实际上就是程序了。( )

7.程序一定是算法。( )

8.数据的物理结构是指数据在计算机内的实际存储形式。( )

9. 顺序存储方式的优点是存储密度大,且插入、删除运算效率高。( )

10. 数据的逻辑结构说明数据元素之间的顺序关系,它依赖于计算机的储存结构. ( )

第2 章线性表

一、判断正误

(×)1. 链表的每个结点中都恰好包含一个指针。 (×)2. 链表的物理存储结构具有同链表一样的顺序。

(×)3. 链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动将后续各个单元向前移动。 (×)4. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。 (×)5. 顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。 (×)6. 顺序存储方式的优点是存储密度大,且插入、删除运算效率高。 (×)7. 线性表在物理存储空间中也一定是连续的。

(√)8. 线性表在顺序存储时,逻辑上相邻的元素未必在存储的物理位置次序上相邻。

计算机学院甘士成 Copyright ? 1992 - 2012 Gane Cheng . All Rights Reserved . 3 / 66

(×)9. 顺序存储方式只能用于存储线性结构。 (×)10. 线性表的逻辑顺序与存储顺序总是一致的。

二、单项选择题

( C )1.数据在计算机存储器内表示时,物理地址与逻辑地址相同并且是连续的,称之为:

(A)存储结构(B)逻辑结构(C)顺序存储结构(D)链式存储结构

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

(A)110 (B)108 (C)100 (D)120

( A )3. 在n 个结点的顺序表中,算法的时间复杂度是O(1)的操作是:

(A) 访问第i 个结点(1≤i≤n)和求第i 个结点的直接前驱(2≤i≤n) (B) 在第i 个结点后插入一个新结点(1≤i≤n) (C) 删除第i 个结点(1≤i≤n) (D) 将n 个结点从小到大排序

( B )4. 向一个有127 个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动个元素

(A)8 (B)63.5 (C)63 (D)7

( A )5. 链接存储的存储结构所占存储空间:

(A) 分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针 (B) 只有一部分,存放结点值

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

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

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

(A)必须是连续的(B)部分地址必须是连续的 (C)一定是不连续的(D)连续或不连续都可以

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

(A)需经常修改L中的结点值(B)需不断对L进行删除插入 (C)L中含有大量的结点(D)L中结点结构复杂

( C )8.单链表的存储密度

计算机学院甘士成 Copyright ? 1992 - 2012 Gane Cheng . All Rights Reserved . 4 / 66

(A)大于1;(B)等于1;(C)小于1;(D)不能确定

( B )9.设a1、a2、a3 为3 个结点,整数P0,3,4 代表地址,则如下的链式存储结构称为

P

0

a1 3 3 ?

a2 4 4 ?

A3

0 P0?

(A)循环链表(B)单链表(C)双向循环链表(D)双向链表

( B )10.下面关于线性表的叙述中,错误的是哪一个? A.线性表采用顺序存储,必须占用一片连续的存储

单元。

B.线性表采用顺序存储,便于进行插入和删除操作。 C.线性表采用链接存储,不必占用一片连续的存储单元。 D.线性表采用链接存储,便于插入和删除操作。

( C )11.线性表是具有n个________的有限序列(n>0)。

A.表元素 B.字符C.数据元素 D.数据项

( A )12.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用______ 存

储方式最节省时间。

A.顺序表 B.双链表 C.带头结点的双循环链表 D.单循环链表

( D )13.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用 _______

存储方式最节省运算时间。

A.单链表 B.仅有头指针的单循环链表 C.双链表 D.仅有尾指针的单循环链表

( B )14. 静态链表中指针表示的是________.

A.内存地址 B.数组下标 C.下一元素地址 D.左、右孩子地址( B )

15. 链表不具有的特点是_________.

A.插入、删除不需要移动元素 B.可随机访问任一元素

C.不必事先估计存储空间 D.所需空间与线性长度成正比( D )16.完成在双循环链表结点p之后插入s的操作是().

A.p^.next:=s ; s^.priou:=p; p^.next^.priou:=s ; s^.next:=p^.next;

计算机学院甘士成 Copyright ? 1992 - 2012 Gane Cheng . All Rights Reserved . 5 / 66

B. p^.next^.priou:=s; p^.next:=s; s^.priou:=p; s^.next:=p^.next; C. s^.priou:=p; s^.next:=p^.next; p^.next:=s; p^.next^.priou:=s ; D.s^.priou:=p; s^.next:=p^.next; p^.next^.priou:=s ; p^.next:=s;

( B )17.在单链表指针为p的结点之后插入指针为s的结点,正确的操作是:()。

A.p->next=s;s->next=p->next; B. s->next=p->next;p->next=s; C.p->next=s;p->next=s->next; D. p->next=s->next;p->next=s;

( B )18.对于一个头指针为head的带头结点的单链表,判定该表为空表的条件是()

A.head==NULL B.head→next==NULL C.head→next==head D.head!=NULL

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

A. (p^.llink)^.rlink:=p^.rlink (p^.rlink)^.llink:=p^.llink; B. p^.llink:=(p^.llink)^.llink (p^.llink)^.rlink:=p; C. (p^.rlink)^.llink:=p p^.rlink:=(p^.rlink)^.rlink D. p^.rlink:=(p^.llink)^.llink p^.llink:=(p^.rlink)^.rlink;

三、简答题

1.线性表有两种存储结构:一是顺序表,二是链表。试问:

(1) 如果有 n个线性表同时并存,并且在处理过程中各表的长度会动态变化,线性表的总数也会自动地改变。

在此情况下,应选用哪种存储结构?为什么?

答:在此情况下,应该使用链式存储结构.因为,链式表可以很好地处理插入删除操作,而使用顺序存 储结构则可能发生溢出,又有可能因为预分配的空间过大造成浪费.

(2) 若线性表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取线性表中的元素,那么应采

用哪种存储结构?为什么?

答:应选用顺序存储结构,因为,单链表查找元素的时间复杂度为O(1).

2 . 在单链表中设置头结点的作用是什么?

答:将空表与非空表,头尾结点与其它结点的操作统一.

计算机学院甘士成 Copyright ? 1992 - 2012 Gane Cheng . All Rights Reserved . 6 / 66

四、线性表具有两种存储方式,即顺序方式和链接方式。现有一个具有五个元素的线性表L={23,17,47,05,

31},若它以链接方式存储在下列100~119 号地址空间中,每个结点由数据(占2 个字节)和指针(占2 个字节)组成,如下所示:

05 ^ U 17

X 23 V 31 Y 47 Z

^ 120

100

其中指针X,Y,Z 的值分别为多少?该线性表的首结点起始地址为多少?末结点的起始地址为多少?

答: X 的值为116 , Y 的值为NULL , Z 的值为 100 .首结点起始地址为108,末结点的起始地址为112 .

五、编程题

1. 写出顺序创建单链表的程序,即按从a1 到an 顺序创建。

此文件名为 MyLinkList.cpp

#include s->data=a[i]; using >next=first->next; template struct Node { } T data; template Node *next; LinkList :: ~LinkList() }; {

template Node *q; class LinkList { p=first; private: while(p) Node public : LinkList(T a[],int n); ~LinkList(); void PrintList(); }; }

template void main() LinkList::LinkList(T a[],int n) {

{ int r[]={1,2,3,4,5}; first=new Node; >next=NULL; a.PrintList (); for(int i=0;i *s; } s=new Node;

namespace std;

}

s-

first->next=s;

Node *p; *first; {

q=p; p=p->next; delete q; }

LinkLista(r,5); first-system(\

计算机学院甘士成 Copyright ? 1992 - 2012 Gane Cheng . All Rights Reserved . 7 / 66

2. 已知一个带头结点的单链表L,请编程求该单链表中数据元素的个数。

由于已知一个单链表 L,所以把上一道题的代码引

{

i++; 过来

p=p->next;

#include

#include “MyLinkList.cpp” using namespace std;

}

template void main() int LinkList::getLongth()

} return i;

{

{

Node *p;

LinkList L;

p=first->next;

L.getLongth(); int i=0;

system(\

}

while(p)

3. 设有一带头结点的单链表,编程将链表颠倒过来,即(a1...an)逆置为(an...a1),要求不用另外的数组或结点完成.

#include using namespace std;

计算机学院甘士成 Copyright ? 1992 - 2012 Gane Cheng . All Rights Reserved . 8 / 66

template q=p; struct Node p=p->next; { T data; Node *next; } }; template

template int LinkList::getLongth() class LinkList { {

private: Node *first; public : LinkList() {first=new Node;first->next=NULL;} LinkList(int n); ~LinkList(); Node* getFirst() { } return this->first; template } void LinkList::TurnLinkList() void PrintList(); { int getLongth(); Node *p,*q,*r; void >next ; };

template

LinkList::LinkList(int n) { r=q->next ; first=new Node; q->next=NULL; p=q; for(int i=0;i *s; s=new Node;

}

cout<<\请输入第\个数据元素 :

}

delete q;

Node *p; int i=0;

p=first->next; while(p) { i++; p=p->next; }

return i;

TurnLinkList(); p=first-q=p->next ; while(q!=NULL) {

>next =p; first- q=r;

}

first->next->next =NULL; first->next =p;

计算机学院甘士成 Copyright ? 1992 - 2012 Gane Cheng . All Rights Reserved . 9 / 66

\ s->next=first->next; Node *p; } }

template

LinkList :: ~LinkList() { Node *q; Node *p; } p=first; void main() while(p) { { int n;

A.PrintList(); cout<<\请输入单链表需要输素依次为: \ 个数 : \

template

cin>>s->data; { first->next=s; p=first->next;

while(p != NULL) { cout<data<<\ p=p->next ; }

cout<

入的数据元素的 cout<<\颠倒之后的数据元

cin>>n;

LinkList A(n);

}

cout<<\的数据元素为 : \

A.TurnLinkList (); A.PrintList();

system(\

4.请写一个算法将顺序存储结构的线性表(a1...an)逆置为(an...a1),要求使用最少的附加空间。

Status ListReplace_Sq(SqList &L,int n) {

If(n<1||n>L.length+1)

{

Newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));

return ERROR;

if(L.length>=L.listsize)

If(!newbase) exit(OVERFLOW);

}

L.elem=newbase;

L.listsize+=LISTINCREMENT;

for(i=0;i

temp=a[n-i-1]; a[n-i-1]=a[i]; a[i]=temp; }

return OK;

}

计算机学院甘士成 Copyright ? 1992 - 2012 Gane Cheng . All Rights Reserved . 10 / 66

第3 章栈和队列

一、填空题

1.

向量、栈和队列都是线性结构,可以在向量的任意位置位置插入和删除元素;对于栈只能在表尾插入和删除元素;对于队列只能在一端插入和另一端删除元素。 2. 3. 4. 5.

栈是一种特殊的线性表,允许插入和删除运算的一端称为栈顶。不允许插入和删除运算的一端称为栈底。

队列是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。

在具有n 个单元的循环队列中,队满时共有n - 1个元素。 带表头结点的空循环双向链表的长度等于0。

二、判断正误

(×)1. 在表结构中最常用的是线性表,栈和队列不太常用。

(√)2. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。 (√)3. 对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。 (√)4. 栈和链表是两种不同的数据结构。 (×)5. 栈和队列是一种非线性数据结构。

(√)6. 栈和队列的存储方式既可是顺序方式,也可是链接方式。

(√)7. 两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底分别设在这片内存

空间的两端。

(×)8. 队是一种插入与删除操作分别在表的两端进行的线性表,是一种先进后出型结构。 (×)9. 一个栈的输入序列是12345,则栈的输出序列不可能是12345。

三、单项选择题

(B)1. 栈中元素的进出原则是

A.先进先出B.后进先出C.栈空则进D.栈满则出

(C)2. 若已知一个栈的入栈序列是1,2,3,?,n,其输出序列为p1,p2,p3,?,pn,若p1=n,则

pi 为

11 / 66

A.i B.n=i C.n-i+1 D.不确定

(B)3. 判定一个栈ST(最多元素为m0)为空的条件是

A.ST->top<>0 B.ST->top=0 C.ST->top<>m0 D.ST->top=m0

(D)4. 判定一个队列QU(最多元素为m0)为满队列的条件是

A.QU->rear - QU->front = = m0 B.QU->rear - QU->front -1= = m0 C.QU->front = = QU->rear D.QU->front = = QU->rear+1

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

(A)r-f; (B)(n+f-r)% n; (C)n+r-f; (D)(n+r-f)% n

6. 设有4 个数据元素a1、a2、a3 和a4,对他们分别进行栈操作或队操作。在进栈或进队操作时,按a1、a2、a3、a4 次序每次进入一个元素。假设栈或队的初始状态都是空。

现要进行的栈操作是进栈两次,出栈一次,再进栈两次,出栈一次;这时,第一次出栈得到的元素是 A , 第二次出栈得到的元素是 B ;类似地,考虑对这四个数据元素进行的队操作是进队两次,出队一次,再进队两次,出队一次;这时,第一次出队得到的元素是 C ,第二次出队得到的元素是 D 。经操作后,最后在栈中或队中的元素还有 E 个。

供选择的答案: A~D:①a1 ②a2 ③ a3 ④a4 E:①1 ②2 ③ 3 ④ 0 答:A、B、C、D、E分别为②、④、

①、②、②

7. 栈是一种线性表,它的特点是 A。设用一维数组A*1,…,n+来表示一个栈,A[n]为栈底,用整型变量T 指示当前栈顶位置,A[T]为栈顶元素。往栈中推入(PUSH)一个新元素时,变量T 的值 B ;从栈中弹出(POP)一个元素时,变量T 的值 C 。设栈空时,有输入序列a,b,c,经过PUSH,POP,PUSH,PUSH,POP 操作后,从栈中弹出的元素的序列是 D ,变量T 的值是 E 。

供选择的答案: 12 / 66

A:①先进先出②后进先出 B,C:①加1 ②减1 ③不变 D:① a,b ②b,c ④ n-1 ⑤ n-2

③c,a

③进优于出④出优于进⑤随机进出

④清0 ⑤加2 ⑥减2

④b,a ⑤ c,b ⑥ a,c E:① n+1 ②n+2 ③ n

答:A、B、C、D、E分别为②、①、②、⑥、①

8. 在做进栈运算时,应先判别栈是否 A ;在做退栈运算时,应先判别栈是否 B 。当栈中元素为n 个,做进栈运算时发生上溢,则说明该栈的最大容量为 C 。

为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的内存空间时,应将两栈的 D 分

别设在这片内存空间的两端,这样,只有当 E 时,才产生上溢。

供选择的答案: A,B:①空②满③上溢④下溢 C:①n-1 ② n ③ n+1 ④ n/2

D:①长度②深度③栈顶④栈底

E:①两个栈的栈顶同时到达栈空间的中心点②其中一个栈的栈顶到达栈空间的中心点

③两个栈的栈顶在达栈空间的某一位置相遇④两个栈均不空,且一个栈的栈顶到达另一个栈的栈底 答:A、B、C、D、E分别为②、①、②、④、③

四、简答求解题

1. 说明线性表、栈与队的异同点。

答: 相同点: 逻辑结构相同,都是线性的.都可以用顺序存储结构或链式存储结构.栈和队列是两种特殊的线性表,即受限的线性表(只是对插入和删除运算加以限制).

不同点: 1.运算规则不同,线性表是随机存取的,而栈是只允许在一端进行插入和删除运算的,因而

是后进先出表LIFO;队列是只允许在一端进行插入,另一端进行删除运算,因而是先进先出表FIFO.

2.用途不同,线性表比较通用,堆栈用亍函数调用,递归和筒化设计等.队列用亍离散事件模拟,多道作业处理和筒化设计等.

13 / 66

2. 设循环队列的容量为40(序号从0 到39),现经过一系列的入队和出队运算后,有

① front=11,rear=19; ② front=19,rear=11;问在这两种情况下,循环队列中各有元素多少个?答:

第一种情况下,代入公式(40+19-11)@=8 , 所以有元素8 个. 第二种情况下,代入公式(40+11-19)@=32 , 所以有元素32 个.

五、算法设计

1.假设一个数组squ[m]存放循环队列的元素。若要使这m 个分量都得到利用,则需另一个标志tag,以tag 为0 或1

来区分尾指针和头指针值相同时队列的状态是“空”还是“满”。试编写相应的入队和出队的算法。 #define MAXQSIZE 100 typedef struct {

QElemType *base;

int front;

int

rear; }SqQueue;

Status InitQueue(SqQueue &Q,int maxsize) {

Q.base=(QElemType*)malloc(maxsize*sizeof(QElemType)); if(!Q.base) exit(OVERFLOW); Q.front=Q.rear=0; tag=0; return OK; }

Status EntryQueue(Queue &Q,QElemType e) {

if(Q.rear==Q.front||tag==1) return ERROR;

Q.base[Q.rear]=e;

Q.rear=(Q.rear+1)%MAXSIZE; return

OK; }

Status DeleteQueue(Queue &Q,QElemType &Q) {

if(Q.front==Q.rear||tag==0)

return ERROR;

14 / 66

e.Q.base[Q.front]; }

Q.front=(Q.front+1)%MAXSIZE; return TRUE;

15 / 66

第4~5 章串、数组和广义表

一、填空题

1. 2. 3. 4.

称为空串;称为空白串。

设S=“A;/document/Mary.doc”,则strlen(s)=, “/”的字符定位的位置为。 子串的定位运算称为串的模式匹配;称为目标串,称为模式。

若n 为主串长,m 为子串长,则串的古典匹配算法最坏的情况下需要比较字符的总次数为。

5.

假设有二维数组A6×8,每个元素用相邻的6 个字节存储,存储器按字节编址。已知A 的起始存储位置(基地址)为1000,则数组A 的体积(存储量)为;末尾元素A57 的第一个字节地址为;若按行存储时,元素A14 的第一个字节地址为;若按列存储时,元素A47 的第一个字节地址为。

6.

设数组a[1?60, 1?70]的基地址为2048,每个元素占2 个存储单元,若以列序为主序顺序存储,则元素a[32,58] 的存储地址为。

7.

三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素

的、和。 8.

求下列广义表操作的结果:

(1) GetHead【((a,b),(c,d))】===; (2) GetHead【GetTail【((a,b),(c,d))】】===;

(3) GetHead【GetTail【GetHead【((a,b),(c,d))】】】===; (4) GetTail【GetHead【GetTail【((a,b),(c,d))】】】===; ()1. 串是一种特殊的线性表,其特殊性体现在:

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

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

()2. 设有两个串p 和q,求q 在p 中首次出现的位置的运算称作:

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

16 / 66

二、单选题

()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))的结果串是:

A.BCDEF B.BCDEFG C.BCPQRST D.BCDEFEF

()4. 假设有60 行70 列的二维数组a[1?60, 1?70]以列序为主序顺序存储,其基地址为10000,每个元素占2 个存

储单元,那么第32 行第58 列的元素a[32,58]的存储地址为。(无第0 行第0 列元素) A.16902 B.16904 C.14454 D.答案A, B, C 均不对

( ) 5. 设矩阵A 是一个对称矩阵,为了节省存储,将其下三角部分(如

放在一维数组B[ 1, n(n-1)/2 ]中,对下三角部A??

???

的值是:??? A.i(i-1)/2+j-1 B.i(i-1)/2+j C.i(i+1)/2+j-1D.i(i+1)/2+j

2,2

?a

1,1

?

?a2,1 a

?右 图所示)按行序存

?分 中任一元素ai,j(i≤j), 在一维数组B 中下标k

??an,1 an,2 ??an,n??

6. 从供选择的答案中,选出应填入下面叙述?内的最确切的解答,把相应编号写在答卷的对应栏内。

有一个二维数组A,行下标的范围是0 到8,列下标的范围是1 到5,每个数组元素用相邻的4 个字节存储。存储器按字节编址。假设存储数组元素A[0,1]的第一个字节的地址是0。

存储数组A 的最后一个元素的第一个字节的地址是 A 。若按行存储,则A[3,5]和A[5,3]的第一个字节的地址分别是 B 和 C 。若按列存储,则A[7,1]和A[2,4]的第一个字节的地址分别是 D 和 E 。供选择的答案

A~E:①28 ② 44 ③ 76 ④ 92 ⑤ 108 ⑥ 116 ⑦ 132 ⑧ 176 ⑨ 184 ⑩ 188 答案:A= B= C= D= E=

7. 从供选择的答案中,选出应填入下面叙述?内的最确切的解答,把相应编号写在答卷的对应栏内。

有一个二维数组A,行下标的范围是1 到6,列下标的范围是0 到7,每个数组元素用相邻的6 个字节存储, 存储器按字节编址。那么,这个数组的体积是 A 个字节。假设存储数组元素A[1,0]的第一个字节的地址是0,则存储数组A 的最后一个元素的第一个字节的地址是 B 。若按行存储,则A[2,4]的第一个字节的地址是 C 。 若按列存储,则A[5,7]的第一个字节的地址是 D 。 供选择的答案

17 / 66

A~D:①12 ②66 ③72 ④96 ⑤114 ⑥120 ⑦156 ⑧234 ⑨276 ⑩282 (11)283 (12)288 答案:A= B= C= D= E=

三、计算题

1. 设s=’I AM A STUDENT’, t=’GOOD’, q=’WORKER’, 求Replace (s,’STUDENT’, q) 和Concat (SubString (s,6,2), Concat (t,

SubString (s,7,8)))。

2. 用三元组表表示下列稀疏矩阵:

?00000000? ?00000000?

0? ?00000?2?

?03000800?

?

00009

? ?00000000???(2)???0?000000500 0?

(1)?

0???00060000? 0?

?

?00000000? ?000000? ? ?

? ?00000005

?00003

?

?? 20000000?

3. 下列各三元组表分别表示一个稀疏矩阵,试写出它们的稀疏矩阵。

?6 4 6?

?1 2 2?

??141515??

? ? ?2 1 12? ? ?

(1)??3 1 3 ?

?(2)??322489???

?4 4 4 ? ?

?

? ?356? ?5 3 6?

? ?

? ?18 / 66

??6 116??

?4 37?

1. 编写一个实现串的置换操作Replace (&S, T, V)的算法。

2. 写出将字符串反序的递推或递归算法,例如字符串为“abcsxw”,反序为“

wxscba”19 / 66

四、算法设计题

第六章树和二叉树

一、判断题.

()1. 若二叉树用二叉链表作存贮结构,则在n个结点的二叉树链表中只有n—1个非空指针域。 ()2.二叉树中每个结点的两棵子树的高度差等于1。 ()3.二叉树中每个结点的两棵子树是有序的。

()4.二叉树中每个结点有两棵非空子树或有两棵空子树。

()5.二叉树中每个结点的关键字值大于其左非空子树(若存在的话)所有结点的关键字值,且小于其右非空

20 / 66

6. 从供选择的答案中,选出应填入下面叙述?内的最确切的解答,把相应编号写在答卷的对应栏内。

有一个二维数组A,行下标的范围是0 到8,列下标的范围是1 到5,每个数组元素用相邻的4 个字节存储。存储器按字节编址。假设存储数组元素A[0,1]的第一个字节的地址是0。

存储数组A 的最后一个元素的第一个字节的地址是 A 。若按行存储,则A[3,5]和A[5,3]的第一个字节的地址分别是 B 和 C 。若按列存储,则A[7,1]和A[2,4]的第一个字节的地址分别是 D 和 E 。供选择的答案: A~E:①28 ② 44 ③ 76 ④ 92 ⑤ 108

116 ⑦ 132 ⑧ 176 ⑨ 184 ⑩ 188 答案:ABCDE=8, 3, 5, 1, 6

7. 有一个二维数组A,行下标的范围是1 到6,列下标的范围是0 到7,每个数组元素用相邻的6 个字节存储,存

储器按字节编址。那么,这个数组的体积是 A 个字节。假设存储数组元素A[1,0]的第一个字节的地址是0,则存储数组A 的最后一个元素的第一个字节的地址是 B 。若按行存储,则A[2,4]的第一个字节的地址是 C 。若按列存储,则A[5,7]的第一个字节的地址是 D 。 供选择的答案

A~D:①12 ② 66 ③ 72 ④ 96 ⑤ 114 ⑥ 120

156 ⑧ 234 ⑨ 276 ⑩ 282 (11)283 (12)288 答案:

ABCD=12, 10, 3, 9

三、计算题

2.设s=’I AM A STUDENT’, t=’GOOD’, q=’WORKER’, 求Replace(s,’STUDENT’,q) 和 Concat(SubString(s,6,2),

Concat(t,SubString(s,7,8)))

Replace(s,’STUDENT’,q)=’I AM A WORKER’

②因为 SubString(s,6,2)=‘A ’;SubString(s,7,8)=‘ STUDENT’ Concat(t,SubString(s,7,8))=’GOOD STUDENT’

所以Concat(SubString(s,6,2), Concat(t,SubString(s,7,8)))=‘A GOOD STUDENT’ 2. (P60 4-18)用三元组表表示下列稀疏矩阵:

?00000000?

?

00000000

?

?00000?2? ?

? ?

00009 0?

?03000800?

(1)??00000000??(2)???0?000000500 00???? ?00060000? ? ?

00000000

?

?

?00000 0? ??00003 0??

46 / 66

?00000005?

? ?

?20000000?

解:参见填空题4. 三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的行下标、列下标和元素值。 所以(1)可列表为:(2)可列表为: 8 8 5 6 6 4 3 2 3 1 6 -2 3 6 8 2 5 9 5 4 6 4 3 5 7 8 5 6 5 3 8 1 2

3. (P60 4-19)下列各三元组表分别表示一个稀疏矩阵,试写出它们的稀疏矩阵。?6 4 6?

?1 2 2?

??141515??

? ? ?2 1 12? ? ?

(1)??3 1 3 ?

?(2)??322489???

?4 4 4 ? ?

?

? ?356? ?5 3 6? ? ? ??6 116??

?4 37?

解:(1)为6×4 矩阵,非零元素有6 个。(2)为4×5 矩阵,非零元素有5 个

0 2 0 0 1 0 0 0 0 12 0 0 0 0 0 0 9 0 3 0 0 0 0 8 0 0 6 0 0 0 4 0 0 7 0 0 0 0 6 0 16 0 0 0

四、算法设计题

3.编写一个实现串的置换操作Replace(&S, T, V)的算法。 解:

47 / 66

int Replace(Stringtype &S,Stringtype T,Stringtype V);//将串S 中所有子串T 替换为 V,并返回置换次数 {

for(n=0,i=1;i<=Strlen(S)-Strlen(T)+1;i++) //注意i 的取值范围 if(!StrCompare(SubString(S,i,Strlen(T)),T)) //找到了与T 匹配的子串

{ //分别把T 的前面和后面部分保存为head 和tail StrAssign(head,SubString(S,1,i-1));

StrAssign(tail,SubString(S,i+Strlen(T),Strlen(S)-i-Strlen(T)+1)); StrAssign(S,Concat(head,V));

StrAssign(S,Concat(S,tail)); //把head,V,tail 连接为新串 i+=Strlen(V); //当前指针跳到插入串以后 n++; n++; }//if return n; }//Replace

分析:i+=Strlen(V);这一句是必需的,也是容易忽略的.如省掉这一句,则在某些情况下, 会引起不希望的后果,虽然在大多数情况下没有影响.请思考:设S='place', T='ace', V='face',则省掉i+=Strlen(V);运行时会出现什么结果?

4.写出将字符串反序的递归或递推算法,例如字符串为“abcsxw”,反序为“wxscba”(注:这也是严题集4.10③编写对串求逆的递推算法) 请注意递归和递推的区别!递推是由“小”到“大”递进;递归是由“大”到“小”嵌套。 算法思路:

① 假定用单链表结构存储字符串; if 没有到尾部字符就不停调用自身函数,直至到达末尾,再从尾部返回并打印字符;否则就打印当前字符并返回。

Invert(stringlistnode *p){ if(!p)return(0); else Invert(p->next); printf(“%c”, p->data) }

如果当前串长为0,则return(-1) 否则开始递归: if 串没有到末尾,则P=P->next; 再调用invert(s); else printf(p->data); return

递归算法的一般形式:(殷人凯题集P102) void p(参数表){ if (递归结束条件)可直接求解步骤;基本项 else p(较小的参数);归纳项 }

严题集4.10③答案:

void String_Reverse(Stringtype s,Stringtype &r)//求s 的逆串r {

StrAssign(r,''); //初始化r 为空串 for(i=Strlen(s);i;i--) {

StrAssign(c,SubString(s,i,1));

StrAssign(r,Concat(r,c)); //把s 的字符从后往前添加到r 中/这是递推算法。 }

}//String_Reverse

48 / 66

第六章树和二叉树答案

一、判断正误

(√)1. 若二叉树用二叉链表作存贮结构,则在n 个结点的二叉树链表中只有n—1 个非空指针域。 (×)2.二叉树中每个结点的两棵子树的高度差等于1。 (√)3.二叉树中每个结点的两棵子树是有序的。

(×)4.二叉树中每个结点有两棵非空子树或有两棵空子树。

(×)5.二叉树中每个结点的关键字值大于其左非空子树(若存在的话)所有结点的关键字值,且小于其右非空子树

(若存在的话)所有结点的关键字值。(应当是二叉排序树的特点)

(×)6.二叉树中所有结点个数是2k-1-1,其中k 是树的深度。(应2i-1) (×)7.二叉树中所有结点,如果不存在非空左子树,则不存在非空右子树。

(×)8.对于一棵非空二叉树,它的根结点作为第一层,则它的第i 层上最多能有2i—1 个结点。(应2i-1) (√)9.用二叉链表法(link-rlink)存储包含n 个结点的二叉树,结点的2n 个指针区域中有n+1 个为空指针。 (正确。用二叉链表存储包含n 个结点的二叉树,结点共有2n 个链域。由于二叉树中,除根结点外,每一个结点有且仅有一个双亲,所以只有n-1 个结点的链域存放指向非空子女结点的指针,还有n+1 个空指针。)即有后继链接的指针仅n-1 个。

(√)10. 〖01 年计算机系研题〗具有12 个结点的完全二叉树有5 个度为2 的结点。

最快方法:用叶子数=[n/2]=6,再求n2=n0-1=5

二、填空题

1.由3个结点所构成的二叉树有5种形态。

2. 一棵深度为6 的满二叉树有n1+n2=0+ n2= n0-1=31个分支结点和26-1 =32个叶子。 注:满二叉树没有度为1 的结点,所以分支结点数就是二度结点数。

3.一棵具有257个结点的完全二叉树,它的深度为9。 (注:用? log2(n) ?+1= ? 8.xx ?+1=9

5.设一棵完全二叉树有700个结点,则共有 350个叶子结点。

答:最快方法:用叶子数=[n/2]=350

5. 设一棵完全二叉树具有1000 个结点,则此完全二叉树有500个叶子结点,有499个度为2 的结点,有1个结点只有非空左子树,有0个结点只有非空右子树。

49 / 66

答:最快方法:用叶子数=[n/2]=500 ,n2=n0-1=499。另外,最后一结点为2i 属于左叶子,右叶子是空的,所以有1 个非空左子树。完全二叉树的特点决定不可能有左空右不空的情况,所以非空右子树数=0.

6. 一棵含有n 个结点的k 叉树,可能达到的最大深度为n,最小深度为2。

答:当k=1(单叉树)时应该最深,深度=n(层);当k=n-1(n-1 叉树)时应该最浅,深度=2(层),但不包括n=0 或1 时的特例情况。教材答案是“完全k 叉树”,未定量。)

7. 二叉树的基本组成部分是:根(N)、左子树(L)和右子树(R)。因而二叉树的遍历次序有六种。最常用的是 三种:前序法(即按N L R 次序),后序法(即按L R N次序)和中序法(也称对称序法,即按L N R 次序)。这三种方法相互之间有关联。若已知一棵二叉树的前序序列是BEFCGDH,中序序列是FEBGCHD,则它的后序序列必是F E G H D C B。

解:法1:先由已知条件画图,再后序遍历得到结果;

法2:不画图也能快速得出后序序列,只要找到根的位置特征。由前序先确定root,由中序先确定左子树。例如,前序遍历BEFCGDH 中,根结点在最前面,是B;则后序遍历中B 一定在最后面。

法3:递归计算。如B 在前序序列中第一,中序中在中间(可知左右子树上有哪些元素),则在后序中必为最后。如法对B 的左右子树同样处理,则问题得解。

8.中序遍历的递归算法平均空间复杂度为 O(n)。

答:即递归最大嵌套层数,即栈的占用单元数。精确值应为树的深度k+1,包括叶子的空域也递归了一次。

9.用5 个权值{3, 2, 4, 5, 1}构造的哈夫曼(Huffman)树的带权路径长度是 33 。

解:先构造哈夫曼树,得到各叶子的路径长度之后便可求出WPL=(4+5+3)×2+(1+2)×3=33 (15)

(9) (6) (注:两个合并值先后不同会导致编码不同,即哈夫曼编码不唯一) 4 5 3 (3) (注:合并值应排在叶子值之后)

1 2

(注:原题为选择题:A.32 B.33 C.34 D.15)

三、单项选择题

(C)1.不含任何结点的空树。

(A)是一棵树; (B)是一棵二叉树;

(C)是一棵树也是一棵二叉树; (D)既不是树也不是二叉树答:以前的标答是B,因

为那时树的定义是n≥1

50 / 66

??1 0 0 1 0 0 1??

?1 0 0 0 1 0 0? B. 0 1 3 6 5 4 2

A.0 2 4 3 1 5 6

?0?

1 1 0 0 1 1 ? C. 0 4 2 3

1 6 5

?

?1 0 1 1 0 1 0? ?

?

?0 0 0 1 1 0 1? ??1 1 0 0 0 1 0??

()9. 已知图的邻接矩阵同上题8,根据算法,则从顶点0 出发,按深度优先遍历的结点序列是

A. 0 2 4 3 1 5 6 B. 0 1 3 5 6 4 2 C. 0 4 2 3 1 6 5 D. 0 1 3 4 2 5 6

()10. 已知图的邻接矩阵同上题8,根据算法,则从顶点0 出发,按广度优先遍历的结点序列是

A.0 2 4 3 6 5 1 B. 0 1 3 6 4 2 5 C. 0 4 2 3 1 5 6 D. 0 1 3 4 2 5 6

()11. 已知图的邻接矩阵同上题8,根据算法,则从顶点0 出发,按广度优先遍历的结点序列是

A. 0 2 4 3 1 6 5 B. 0 1 3 5 6 4 2 C. 0 1 2 3 4 6 5 D. 0 1 2 3 4 5 6

()12. 已0 出发按深

知图的邻接表如下所示,根据算法,则从顶点度优先遍历的结点序列是

D. 0 3 6 1 5 4 2

A.0 1 3 2

B. 0 2 3 1

C. 0 3 2 1 D.

0 1 2 3

()13. 已知图发按广度优先遍

的邻接表如下所示,根据算法,则从顶点0 出历的结点序列是

A.0 3 2 1 B.

0 1 2 3

C. 0 1 3 2 D. 0 3 1 2

()14. 深度优先遍历类似于二叉树的

26 / 66

A.先序遍历 B. 中序遍历 C. 后序遍历 D. 层次遍历

()15. 广度优先遍历类似于二叉树的

A.先序遍历 B. 中序遍历 C. 后序遍历 D. 层次遍历

()16. 任何一个无向连通图的最小生成树

A.只有一棵 B. 一棵或多棵 C. 一定有多棵 D. 可能不存在

二、填空题

1. 2. 3. 4. 5. 6. 7. 8. 9.

图有、等存储结构,遍历图有、等方法。

有向图G 用邻接矩阵存储,其第i 行的所有元素之和等于顶点i 的。 如果n 个顶点的图是一个环,则它有棵生成树。

n 个顶点e 条边的图,若采用邻接矩阵存储,则空间复杂度为。 n 个顶点e 条边的图,若采用邻接表存储,则空间复杂度为。 设有一稀疏图G,则G 采用存储较省空间。 设有一稠密图G,则G 采用存储较省空间。 图的逆邻接表存储结构只适用于图。

已知一个图的邻接矩阵表示,删除所有从第i 个顶点出发的方法是。

10. 图的深度优先遍历序列惟一的。

11. n 个顶点e 条边的图采用邻接矩阵存储,深度优先遍历算法的时间复杂度为;若采用邻接表存储时,该算法

的时间复杂度为。

12. n 个顶点e 条边的图采用邻接矩阵存储,广度优先遍历算法的时间复杂度为;若采用邻接表存储,该算法的

时间复杂度为。

13. 图的BFS 生成树的树高比DFS 生成树的树高。

14. 用普里姆(Prim)算法求具有n 个顶点e 条边的图的最小生成树的时间复杂度为;用克鲁斯卡尔 (Kruskal)算法的时间复杂度是。

15. 若要求一个稀疏图G 的最小生成树,最好用算法来求解。 16. 若要求一个稠密图G 的最小生成树,最好用算法来求解。

17. 用Dijkstra 算法求某一顶点到其余各顶点间的最短路径是按路径长度的次序来得到最短路径的。

27 / 66

18. 拓扑排序算法是通过重复选择具有个前驱顶点的过程来完成的。

三、分析求解题

1. 已知如图所示的有向图,请给出该图的: (1) 每个顶点的入/出度; 顶点 1 2 3 4 5 6 (2) 邻接矩阵; 入度 (3) 邻接表; 出度 (4) 逆邻接表。

28 / 66

2. 请对下图的无向带权图:

(1) 写出它的邻接矩阵,并按普里姆算法求其最小生成树; (2) 写出它的邻接表,并按克鲁斯卡尔算法求其最小生成树。

29 / 66

3. 已知二维数组表示的图的邻接矩阵如下图所示。试分别画出自顶点1 出发进行遍历所得的深度优先生成树和广度优先生成树。

30 / 66

4. 试利用Dijkstra算法求图中从顶点a到其他各顶点间的最短路径,写出执行算法过程中各步的状态。

31 / 66

5.给定下列网G:

(1) 试着找出网G 的最小生成树,画出其逻辑结构图; (2) 用两种不同的表示法画出网G 的存储结构图;

(3) 用C 语言(或其他算法语言)定义其中一种表示法(存储结构)的数据类型。

32 / 66

四、算法设计题

1. 编写算法,由依次输入的顶点数目、弧的数目、各顶点的信息和各条弧的信息建立有向图的邻接表。解:Status Build_AdjList(ALGraph &G)

//输入有向图的顶点数,边数,顶点信息和边的信息,以建立邻接表 , ……………. return OK;

}//Build_AdjList

33 / 66

2. 试在邻接矩阵存储结构上实现图的基本操作:DeleteArc(G,v,w) ,即删除一条边的操作。

3. 试基于图的深度优先搜索策略写一算法,判别以邻接表方式存储的有向图中是否存在由顶点vi 到顶点vj 的路径(i ≠j)。

34 / 66

下面是答案

第1 章绪论

一.填空题

1.数据元素关系

2.逻辑结构存储结构运算 3.线性结构非线性结构 4.一对一一对多多对多 5.没有没有

6.前驱 1 个后续任意多个 7.任意多个

8.顺序、链式、索引、散列 9.插入、删除、修改、查找、排序 10.时间空间

11.逻辑结构物理/存储结构操作/运算算法 12.nlog2n

二.选择题

1——5 D C C B A 6——9 C D C A

三.判断题

1——5 × × × × √ 6——10 × × √ × ×

35 / 66

第2 章线性表

一、判断正误

(×)1. 链表的每个结点中都恰好包含一个指针。

链表中的结点可含多个指针域,分别存放多个指针。例如,双向链表中的结点可以含有两个指针域,分别存放指向其直接前趋和直接后继结点的指针。

(×)2. 链表的物理存储结构具有同链表一样的顺序。

链表的存储结构特点是无序,而链表的示意图有序。

(×)3. 链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动地将后续的各个单元向前移动。

链表的结点不会移动,只是指针内容改变。

(×)4. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。

混淆了逻辑结构与物理结构,链表也是线性表!且即使是顺序表,也能存放记录型数据。 (×)5. 顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。

正好说反了。顺序表才适合随机存取,链表恰恰适于“顺藤摸瓜” (×)6. 顺序存储方式的优点是存储密度大,且插入、删除运算效率高。

前一半正确,但后一半说法错误,那是链式存储的优点。顺序存储方式插入、删除运算效率较低,在表长为n 的顺序表中,插入和删除一个数据元素,平均需移动表长一半个数的数据元素。 (×)7. 线性表在物理存储空间中也一定是连续的。

线性表有两种存储方式,顺序存储和链式存储。后者不要求连续存放。

(×)8. 线性表在顺序存储时,逻辑上相邻的元素未必在存储的物理位置次序上相邻。

线性表有两种存储方式,在顺序存储时,逻辑上相邻的元素在存储的物理位置次序上也相邻。 (×)9. 顺序存储方式只能用于存储线性结构。

顺序存储方式不仅能用于存储线性结构,还可以用来存放非线性结构,例如完全二叉树是属于非线性结构,但其最佳存储方式是顺序存储方式。(后一节介绍) (×)10. 线性表的逻辑顺序与存储顺序总是一致的。

理由同7。链式存储就无需一致。

二、单项选择题

(C )1.数据在计算机存储器内表示时,物理地址与逻辑地址相同并且是连续的,称之为:

(A)存储结构(B)逻辑结构(C)顺序存储结构(D)链式存储结构( B )

2. 一个向量第一个元素的存储地址是100,每个元素的长度为2,则第5 个元素的地址是

(A)110 (B)108 (C)100 (D)120

(A )3. 在n 个结点的顺序表中,算法的时间复杂度是O(1)的操作是:

36 / 66

(D) 访问第i 个结点(1≤i≤n)和求第i 个结点的直接前驱(2≤i≤n) (E) 在第i 个结点后插入一个新结点(1≤i≤n) (F) 删除第i 个结点(1≤i≤n) (D)将n 个结点从小到大排序

( B )4. 向一个有127 个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动个元素

(A)8 (B)63.5 (C)63 (D)7

( A )5. 链接存储的存储结构所占存储空间:

(C) 分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针 (D) 只有一部分,存放结点值

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

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

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

(A)必须是连续的(B)部分地址必须是连续的 (C)一定是不连续的(D)连续或不连续都可以

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

(A)需经常修改L中的结点值(B)需不断对L进行删除插入 (C)L中含有大量的结点(D)L中结点结构复杂

( C )8.单链表的存储密度

(A)大于1;(B)等于1;(C)小于1;(D)不能确定

(B )9.设a1、a2、a3 为3 个结点,整数P0,3,4 代表地址,则如下的链式存储结构称为

P

0

a1 3 3 ?

a2 4 4 ?

A3

0 P0?

(A)循环链表(B)单链表(C)双向循环链表(D)双向链表

(B )10.下面关于线性表的叙述中,错误的是哪一个? A.线性表采用顺序存储,必须占用一片连续的存储单

元。

B.线性表采用顺序存储,便于进行插入和删除操作。

37 / 66

C.线性表采用链接存储,不必占用一片连续的存储单元。 D.线性表采用链接存储,便于插入和删除操作。

(C )11.线性表是具有n个________的有限序列(n>0)。

A.表元素 B.字符 C.数据元素 D.数据项

( A )12.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用______ 存储

方式最节省时间。

A.顺序表 B.双链表 C.带头结点的双循环链表 D.单循环链表

(D )13.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用 _______ 存储

方式最节省运算时间。

A.单链表 B.仅有头指针的单循环链表 C.双链表 D.仅有尾指针的单循环链表(C )

14. 静态链表中指针表示的是________.

A.内存地址 B.数组下标 C.下一元素地址 D.左、右孩子地址(B)15.

链表不具有的特点是_________.

A.插入、删除不需要移动元素 B.可随机访问任一元素

C.不必事先估计存储空间 D.所需空间与线性长度成正比(D)16.完成在双循环链表结点p之后插入s的操作是().

A.p^.next:=s ; s^.priou:=p; p^.next^.priou:=s ; s^.next:=p^.next; B. p^.next^.priou:=s; p^.next:=s; s^.priou:=p; s^.next:=p^.next; C. s^.priou:=p; s^.next:=p^.next; p^.next:=s; p^.next^.priou:=s ; D. s^.priou:=p; s^.next:=p^.next; p^.next^.priou:=s ; p^.next:=s;

( B)17.在单链表指针为p的结点之后插入指针为s的结点,正确的操作是:()。

A.p->next=s;s->next=p->next; B. s->next=p->next;p->next=s; C.p->next=s;p->next=s->next; D. p->next=s->next;p->next=s;

(B )18.对于一个头指针为head的带头结点的单链表,判定该表为空表的条件是()

A.head==NULL B.head→next==NULL C.head→next==head D.head!=NULL

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

38 / 66

A. (p^.llink)^.rlink:=p^.rlink (p^.rlink)^.llink:=p^.llink; B. p^.llink:=(p^.llink)^.llink (p^.llink)^.rlink:=p; C. (p^.rlink)^.llink:=p p^.rlink:=(p^.rlink)^.rlink D. p^.rlink:=(p^.llink)^.llink p^.llink:=(p^.rlink)^.rlink;

三、简答题

1.线性表有两种存储结构:一是顺序表,二是链表。试问:

(1) 如果有 n个线性表同时并存,并且在处理过程中各表的长度会动态变化,线性表的总数也会自动地改变。

在此情况下,应选用哪种存储结构?为什么?

(2) 若线性表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取线性表中的元素,那么应采

用哪种存储结构?为什么?

答案:(1)选链式存储结构。它可动态申请内存空间,不受表长度(即表中元素个数)的影响,插入、删除时间复

杂度为O(1)。

(2)选顺序存储结构。顺序表可以随机存取,时间复杂度为O(1)。 2 . 在单链表中设置头结点的作用是什么?

答案:在单链表的首元结点(第一个数据元素)之前附设的结点,称为头结点,其作用是为了对单链表进行操作

时,对空表和非空表的情况统一处理,对首元结点和其它结点统一处理。

四、线性表具有两种存储方式,即顺序方式和链接方式。现有一个具有五个元素的线性表L={23,17,47,05,31},若它以链接方式存储在下列100~119 号地址空间中,每个结点由数据(占2 个字节)和指针(占2 个字节)组成,如下所示:

05 ^ U 17

X 23 V 31 Y 47 Z

^ 120

100

其中指针X,Y,Z 的值分别为多少?该线性表的首结点起始地址为多少?末结点的起始地址为多少? 答:X=116 Y=0 Z=100首址=108末址=112

五、编程题

1. 已知一个带头结点的单链表L,请编程求该单链表中数据元素的个数。解:编写C 程序如下(已上机通过):全局变量及函数提前说明:

39 / 66

---------------------------------

#include #include

typedef struct liuyu{int data;struct liuyu*link;}test; liuyu *p,*q,*r,*head; int m=sizeof(test);

void main ( ) /*第一步,从键盘输入整数,不断添加到链表*/ {int i;

head=(test*)malloc(m); /*m=sizeof(test);*/ p=head; i=0; while (i!=-9999)

{ printf(\ [stop by '-9999']:\

scanf(\*/ p->link=(test*)malloc(m); /*m=sizeof(test));*/ q=p; p=p->link; }

q->link=NULL; /*原先用p->link=NULL 似乎太晚!*/

p=head; i=0; /*统计链表结点的个数并打印出来*/ while (p->link!=NULL) {printf(\ }

printf(\ i-1); /*结点的个数不包括-9999*/ }

2. 设有一带头结点的单链表,编程将链表颠倒过来,即(a1...an)逆置为(an...a1),要求不用另外的数组或结点完成.

typedef struct node

{int data;∥假定结点数据域为整型。 struct node *next; }node,*LinkedList;

LinkedList invert1(LinkedList head)/*逆置单链表*/

{ LinkedList p=head->next; /*p为工作指针*/ head->next=null; while(p!=null)

{ r=p->next; /*暂存p的后继*/ p->next=head->next; head->next=p; p=r; } return(head); }/*结束invert1函数*/

3.请写一个算法将顺序存储结构的线性表(a1...an)逆置为(an...a1),要求使用最少的附加空间。

[题目分析]顺序存储结构的线性表的逆置,只需一个变量辅助空间。算法核心是选择循环控制变量的初值和终值。 void SeqInvert(ElemType a[ ],int n)

∥a是具有n个元素用一维数组存储的线性表,本算法将其逆置。 {for(i=0;i<=(n-1)/2;i++)

40 / 66

本文来源:https://www.bwwdw.com/article/8oxv.html

Top