数据结构习题集及答案

合集下载

数据结构习题(含答案)

数据结构习题(含答案)

数据结构习题(含答案)数据结构习题(含答案)1. 题目描述:请实现一个栈,要求支持以下操作:push(x)将元素x 入栈;pop()弹出栈顶元素;top()返回栈顶元素;empty()判断栈是否为空。

解答:我们可以使用数组来实现栈的功能。

首先定义一个数组stack来存储栈中的元素,同时定义一个整型变量top来表示栈顶的索引位置。

初始时,将top设置为-1,表示栈中没有元素。

1.1 push(x)操作:当要将元素x入栈时,我们先将top的值加1,然后将x赋值给stack[top],即将x放入栈顶位置。

1.2 pop()操作:当调用pop()操作时,我们首先判断栈是否为空,即判断top的值是否为-1。

如果top等于-1,说明栈为空,无法进行pop()操作。

如果不为空,则将top的值减1,同时返回stack[top],即弹出栈顶元素。

1.3 top()操作:top()操作与pop()操作类似,只需在操作完成后不弹出栈顶元素,而是直接返回stack[top]即可。

1.4 empty()操作:empty()操作用来判断栈是否为空,只需判断top的值是否为-1即可。

如果top等于-1,则返回true,表示栈为空;否则返回false,表示栈不为空。

综上所述,我们可以用数组实现一个栈,满足push、pop、top和empty等操作。

2. 题目描述:请实现一个队列,要求支持以下操作:push(x)将元素x入队;pop()将队首元素出队;peek()返回队首元素;empty()判断队列是否为空。

解答:我们可以使用两个栈来实现一个队列的功能。

首先定义两个栈stack1和stack2,其中stack1用来存储新加入队列的元素,stack2用来存储队列中已经处理过的元素。

定义两个整型变量top1和top2,分别表示stack1和stack2的栈顶索引位置。

初始时,top1和top2均设置为-1,表示两个栈均为空。

2.1 push(x)操作:当要将元素x入队时,我们直接将x加入到stack1中,同时将top1的值加1。

数据结构各章习题及答案

数据结构各章习题及答案

数据结构习题及解答第1章 概述【例1-1】分析以下程序段的时间复杂度。

for(i=0;i<n;i++)for(j=0;j<m;j++) A[i][j]=0;解:该程序段的时间复杂度为O (m*n )。

【例1-2】分析以下程序段的时间复杂度。

i=s=0; ①while(s<n){ i++; ②s+=i; ③}解:语句①为赋值语句,其执行次数为1次,所以其时间复杂度为O (1)。

语句②和语句③构成while 循环语句的循环体,它们的执行次数由循环控制条件中s 与n 的值确定。

假定循环重复执行x 次后结束, 则语句②和语句③各重复执行了x 次。

其时间复杂度按线性累加规则为O (x )。

此时s 与n 满足关系式:s ≥n ,而s=1+2+3+…+x 。

所以有:1+2+3+…+x ≥n ,可以推出:x=n n 241212811+±-=+±-x 与n 之间满足x=f(n ),所以循环体的时间复杂度为O (n ),语句①与循环体由线性累加规则得到该程序段的时间复杂度为O (n )。

【例1-3】分析以下程序段的时间复杂度。

i=1; ①while(i<=n) i=2*i; ②解:其中语句①的执行次数是1,设语句②的执行次数为f (n ),则有:n n f ≤)(2。

得:T(n)=O(n2 log)【例1-4】有如下递归函数fact(n),分析其时间复杂度。

fact(int n){ if(n<=1) return(1); ①elsereturn(n*fact(n-1)); ②}解:设fact(n)的运行时间函数是T(n)。

该函数中语句①的运行时间是O(1),语句②的运行时间是T(n-1)+ O(1),其中O(1)为常量运行时间。

由此可得fact(n)的时间复杂度为O(n)。

习题1一、单项选择题1.数据结构是指(1. A )。

A.数据元素的组织形式B.数据类型C.数据存储结构D.数据定义2.数据在计算机存储器内表示时,物理地址与逻辑地址不相同的,称之为(2. C )。

数据结构试题集(包含答案-完整版)

数据结构试题集(包含答案-完整版)

数据结构试题集(包含答案-完整版)数据结构试题集(包含答案-完整版)1. 单选题1) 数据结构是一种()。

a) 存储结构b) 算法c) 数据模型d) 网络答案:c) 数据模型解析:数据结构是一种用于组织和存储数据的方式,描述了数据之间的关系以及对数据的操作。

2) 以下哪种数据结构可以通过索引直接访问元素?a) 链表b) 队列c) 栈d) 数组答案:d) 数组解析:数组是一种线性数据结构,可以通过索引直接访问指定位置的元素。

2. 多选题1) 哪些数据结构属于非线性结构?()a) 队列b) 树c) 栈d) 图答案:b) 树d) 图解析:线性结构中的元素存在一对一的关系,非线性结构中的元素存在一对多或多对多的关系,树和图属于非线性结构。

2) 下列哪些操作可以在栈上进行?()a) 入栈b) 出栈c) 查找d) 删除答案:a) 入栈b) 出栈解析:栈是一种后进先出(LIFO)的数据结构,只能在栈顶进行插入和删除操作。

3. 简答题1) 请简要介绍线性表和非线性表。

答案:线性表是数据元素的一个有限序列,元素之间存在一对一的关系。

非线性表是指元素之间存在一对多或多对多的关系,如树和图。

2) 请解释什么是时间复杂度和空间复杂度。

答案:时间复杂度是衡量算法执行效率的度量,表示算法的运行时间随输入规模增长的速度。

空间复杂度是指算法执行过程中所需的存储空间随输入规模增长的速度。

4. 编程题题目:实现一个栈,包含push、pop和getMin三个操作,要求时间复杂度为O(1)。

答案:class MinStack:def __init__(self):self.stack = []self.min_stack = []def push(self, x):self.stack.append(x)if not self.min_stack or x <= self.min_stack[-1]:self.min_stack.append(x)def pop(self):if self.stack.pop() == self.min_stack[-1]:self.min_stack.pop()def getMin(self):return self.min_stack[-1]解析:在栈的基础上,使用一个辅助栈min_stack来记录当前栈中的最小值。

数据结构习题集(答案)

数据结构习题集(答案)

数据结构习题第一章绪论数据结构是一门研究非数值计算的程序设计问题中计算机的___①__以及它们之间的__②_ 和运算等的学科。

①A.数据元素 B.计算方法 C.逻辑存储 D.数据映像②A.结构 B.关系 C.运算 D.算法算法分析的目的是___①__ ,算法分析的两个主要方面是__②___ 。

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

② A.空间复杂度和时间复杂度 B.正确性和简明性C.可读性和文档性D.数据复杂性和程序复杂性计算机算法指的是__①__ ,它必须具备输入、输出和__②_ 等5个重要特性。

① A.计算方法 B.排序方法C.解决问题的有限运算序列D.调度方法② A.可读性、可移植性和可扩展性 B. 可读性、可移植性和有穷性C.确定性、有穷性和可行性D.易读性、稳定性和安全性数据元素是数据处理的基本单位;数据项是数据处理的_最小单位。

数据结构是研究数据的逻辑结构___和__物理结构__,并对这种结构定义相适应的运算,设计出相应的算法,分析算法的效率。

算法的效率包括时间和空间两个方面,分别称为_空间复杂度和时间复杂度。

数据的逻辑结构是指_数据元素之间的关系__;包括线性结构、树形结构和图形结构三种类型,其中树形结构和图状结构合称为__非线性结构__。

线性结构中元素之间存在_一对一___ 关系,树形结构中元素之间存在_一对多___ 关系,图状结构中元素之间存在__多对多__ 关系。

|数据结构在计算机中的表示称为数据的物理(或存储)结构,数据的物理结构可以采用_顺序存储和_链式存储__两种存储方法。

顺序存储方法是把逻辑上相邻的元素存储在物理位置相邻的内存单元中;链式存储方法中元素间的关系是由__指针来表示_的。

第二章线性表链表不具备的特点是____ 。

A.可随机访问任一结点B.插入删除不需移动元素C.不必事先估计存储空间D.所需空间与其长度成正比不带头结点的单链表head 为空的判定条件是____。

《数据结构》习题集答案(C语言版)严蔚敏

《数据结构》习题集答案(C语言版)严蔚敏

第1章 绪论1.1 简述下列术语:数据,数据元素、数据对象、数据结构、存储结构、数据类型和抽象数据类型。

解:数据是对客观事物的符号表示。

在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。

数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。

数据对象是性质相同的数据元素的集合,是数据的一个子集。

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

存储结构是数据结构在计算机中的表示。

数据类型是一个值的集合和定义在这个值集上的一组操作的总称。

抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。

是对一般数据类型的扩展。

1.2 试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别。

解:抽象数据类型包含一般数据类型的概念,但含义比一般数据类型更广、更抽象。

一般数据类型由具体语言系统内部定义,直接提供给编程者定义用户数据,因此称它们为预定义数据类型。

抽象数据类型通常由编程者定义,包括定义它所使用的数据和在这些数据上所进行的操作。

在定义抽象数据类型中的数据部分和操作部分时,要求只定义到数据的逻辑结构和操作说明,不考虑数据的存储结构和操作的具体实现,这样抽象层次更高,更能为其他用户提供良好的使用接口。

1.3 设有数据结构(D,R),其中{}4,3,2,1d d d d D =,{}r R =,()()(){}4,3,3,2,2,1d d d d d d r =试按图论中图的画法惯例画出其逻辑结构图。

解:1.4 试仿照三元组的抽象数据类型分别写出抽象数据类型复数和有理数的定义(有理数是其分子、分母均为自然数且分母不为零的分数)。

解:ADT Complex{数据对象:D={r,i|r,i 为实数}数据关系:R={<r,i>}基本操作:InitComplex(&C,re,im)操作结果:构造一个复数C ,其实部和虚部分别为re 和imDestroyCmoplex(&C)操作结果:销毁复数CGet(C,k,&e)操作结果:用e 返回复数C 的第k 元的值Put(&C,k,e)操作结果:改变复数C 的第k 元的值为eIsAscending(C)操作结果:如果复数C 的两个元素按升序排列,则返回1,否则返回0 IsDescending(C)操作结果:如果复数C 的两个元素按降序排列,则返回1,否则返回0 Max(C,&e)操作结果:用e返回复数C的两个元素中值较大的一个Min(C,&e)操作结果:用e返回复数C的两个元素中值较小的一个}ADT ComplexADT RationalNumber{数据对象:D={s,m|s,m为自然数,且m不为0}数据关系:R={<s,m>}基本操作:InitRationalNumber(&R,s,m)操作结果:构造一个有理数R,其分子和分母分别为s和mDestroyRationalNumber(&R)操作结果:销毁有理数RGet(R,k,&e)操作结果:用e返回有理数R的第k元的值Put(&R,k,e)操作结果:改变有理数R的第k元的值为eIsAscending(R)操作结果:若有理数R的两个元素按升序排列,则返回1,否则返回0 IsDescending(R)操作结果:若有理数R的两个元素按降序排列,则返回1,否则返回0 Max(R,&e)操作结果:用e返回有理数R的两个元素中值较大的一个Min(R,&e)操作结果:用e返回有理数R的两个元素中值较小的一个}ADT RationalNumber1.5 试画出与下列程序段等价的框图。

数据结构习题和答案

数据结构习题和答案

数据结构习题和答案习题课填空1、对于⼀棵⼆叉树,若⼀个结点的编号为i,则它的左孩⼦结点的编号为,双亲结点的编号为。

2、向⼀个长度为n的向量中删除第i个元素(1≤i≤n)时,需向前移动个元素。

3、在⼀棵⼆叉树中,若双分⽀结点数为5个,单分⽀结点数为6个,则叶⼦结点数为个。

4、为了实现折半查找,线性表必须采⽤⽅法存储。

顺序5、⼀种抽象数据类型包括数据对象和。

6、在以L为表头指针的带表头附加结点的单链表和循环单链表中,判断链表为空的条件分别为__________和_______。

7、数据结构被形式地定义为(D, R),其中D是的有限集合,R是D上的有限集合。

8、队列的插⼊操作在进⾏,删除操作在进⾏。

9、⼆叉搜索树的中序遍历得到的结点序列为____ ____。

10、在顺序表中插⼊或删除⼀个元素,需要平均移动元素,具体移动的元素个数与有关。

11、栈的特点是。

12、在单链表中,除了⾸元结点外,任⼀结点的存储位置由。

13、在⼀个具有n个顶点的⽆向图中,要连通所有顶点则⾄少需要条边。

14、深度为k(设根的层数为1)的完全⼆叉树⾄少有个结点,⾄多有个结点。

15、⼀棵深度为6的满⼆叉树有个分⽀结点和个叶⼦结点。

16、⼀个算法的效率可分为效率和效率。

17、队列的特点是。

18、⼀棵深度为5的满⼆叉树中的结点数为个。

19、在⼀个具有n个顶点的⽆向完全图中,包含有________条边,在⼀个具有n个顶点的有向完全图中,包含有________条边。

简答题1、已知⼀组元素为(38,26,62,94,35,50,28,55),画出按元素排列顺序输⼊⽣成的⼀棵⼆叉搜索树。

答:2、假设有⼆维数组A[0..5,0..7],每个元素⽤相邻的6个字节存储,存储器按字节编址。

已知A的起始存储位置(基地址)为1000,计算:(1)末尾元素A57的第⼀个字节地址为;(2)若按列存储时,元素A47的第⼀个字节地址为。

(3) 数组A的体积(存储量);(4) 若按⾏存储时,元素A14的第⼀个字节地址为。

数据结构习题及答案(3)

数据结构习题及答案(3)第九章排序⼀、选择题1.在所有排序⽅法中,关键字⽐较的次数与记录得初始排列次序⽆关的是()(A)希尔排序(B)起泡排序(C)插⼊排序(D)选择排序参考答案:D2.设有1000个⽆序的元素,希望⽤最快的速度挑选出其中前10个最⼤的元素,最好()排序法。

(A)起泡排序(B)快速排序(C)堆排序(D)基数排序参考答案:C3.在待排序的元素序列基本有序的前提下,效率最⾼的排序⽅法是()(A)插⼊排序(B)选择排序(C)快速排序(D)归并排序参考答案:A4.⼀组记录的排序码为(46,79,56,38,40,84),则利⽤堆排序的⽅法建⽴的初始推为()。

(A)79,46,56,38,40,80 (B)84,79,56,38,40,46(C)84,79,56,46,40,38 (D)84,56,79,40,46,38参考答案:B5.⼀组记录的关键码为(46,79,56,38,40,84),则利⽤快速排序的⽅法,以第⼀个记录为基准得到的⼀次划分结果为()。

(A)38,40,46,56,79,84(B)40,38,46,79,56,84(C)40,38,46,56,79,84(D)40,38,46,84,56,79参考答案:C6.⼀组记录的排序码为(25,48,16,35,79,82,23,40,36,72),其中含有5个长度为2的有序表,按归并排序的⽅法对该序列进⾏⼀趟归并后的结果为()。

(A)16,25,35,48,23,40,79,82,36,72(B)16,25,35,48,79,82,23,36,40,72(C)16,25,48,35,79,82,23,36,40,72(D)16,25,35,48,79,23,36,40,72,82参考答案:A7.排序⽅法中,从未排序序列中依次取出元素与⼰排序序列(初始时为空)中的元素进⾏⽐较,将其放⼊⼰排序序列的正确位置上的⽅法,称为()(A)希尔排序(B)起泡排序(C)插⼊排序(D)选择排序参考答案:C8.排序⽅法中,从未排序序列中挑选元素并将其依次放⼊⼰排序序列(初始为空)的⼀端的⽅法,称为()(A)希尔排序(B)归并排序(C)插⼊排序(D)选择排序参考答案:D9.⽤某种排序⽅法对线性表(25,84,21,47,15,27,68,35,20)进⾏排序时,元素序列的变化情况如下:(1)25,84,21,47,15,27,68,35,20 (2)20,15,21,25,47,27,68,35,84(3)15,20,21,25,35,27,47,68,84 (4)15,20,21,25,27,35,47,68,845则所采⽤的排序⽅法是()。

数据结构18习题集(含答案)

数据结构习题集一、选择题1.下面关于串的叙述中,哪一个是不正确的?( B )A.串是字符的有限序列B.空串是由空格构成的串C.模式匹配是串的一种重要运算D.串既可以采用顺序存储,也可以采用链式存储2.设无向图的顶点个数为n,则该图最多有(B)条边。

A.n-1 B.n(n-1)/2 C.n(n+1)/2 D.03.以下数据结构中,( A )是非线性数据结构。

A.树B.字符串C.队列D.栈4.下面关于线性表的叙述中,错误的是哪一个?(B )A.线性表采用顺序存储,必须占用一片连续的存储单元。

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

C.线性表采用链接存储,不必占用一片连续的存储单元。

D.线性表采用链接存储,便于插入和删除操作。

5.假设以数组A[m]存放循环队列的元素,其头尾指针分别为front和rear,则当前队列中的元素个数为(A )。

A.(rear-front+m)%m B.rear-front+1C.(front-rear+m)%m D.(rear-front)%m6.在单链表指针为p的结点之后插入指针为s的结点,正确的操作是(B )。

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;7.设栈的输入序列是1,2,3,4,则(D )不可能是其出栈序列。

A.1,2,4,3 B.2,1,3,4 C.1,4,3,2 D.4,3,1,2,8.栈和队都是(C )A.顺序存储的线性结构B.链式存储的非线性结构C.限制存取点的线性结构D.限制存取点的非线性结构9.从逻辑上可以把数据结构分为( C )两大类。

A.动态结构、静态结构B.顺序结构、链式结构C.线性结构、非线性结构D.初等结构、构造型结构10.下列四个序列中,哪一个是堆( C )。

数据结构习题及标准答案

数据结构习题及标准答案一、栈和队列1. 栈(Stack)是一种后进先出(Last-In-First-Out,LIFO)的数据结构。

栈的简单实现可以使用数组或链表,下面是一个使用数组实现的栈的示例代码:```pythonclass Stack:def __init__(self):self.stack = []def is_empty(self):return len(self.stack) == 0def push(self, item):self.stack.append(item)def pop(self):if self.is_empty():return Nonereturn self.stack.pop()def peek(self):if self.is_empty():return Nonereturn self.stack[-1]```2. 队列(Queue)是一种先进先出(First-In-First-Out,FIFO)的数据结构。

队列的简单实现也可以使用数组或链表,下面是一个使用链表实现的队列的示例代码:```pythonclass Queue:def __init__(self):self.queue = []def is_empty(self):return len(self.queue) == 0def enqueue(self, item):self.queue.append(item)def dequeue(self):if self.is_empty():return Nonereturn self.queue.pop(0)def peek(self):if self.is_empty():return Nonereturn self.queue[0]```二、链表1. 链表(Linked List)是一种常见的线性数据结构。

链表由节点组成,每个节点包含数据和指向下一个节点的指针。

数据结构习题集(包含全部答案)之欧阳道创编

数据结构习题集(自编)第一章绪论一、选择题1.数据结构是一门研究非数值计算的程序设计问题中的操作对象以及它们之间的()和运算的学科。

A.结构B.关系 C.运算 D.算法2.在数据结构中,从逻辑上可以把数据结构分成()。

A.动态结构和静态结构 B.紧凑结构和非紧凑结构C.线性结构和非线性结构D.逻辑结构和存储结构3.线性表的逻辑顺序和存储顺序总是一致的,这种说法()。

A.正确B.不正确 C.无法确定 D.以上答案都不对4.算法分析的目的是()。

A.找出算法的合理性 B.研究算法的输人与输出关系C.分析算法的有效性以求改进 D.分析算法的易懂性5. 算法的时间复杂度取决于()A.问题的规模B待处理数据的初态 C. A和B6.一个算法应该是()。

A.程序B.问题求解步骤的描述C.要满足五个基本特性 D.A和C.7. 下面关于算法说法错误的是()A.算法最终必须由计算机程序实现B.为解决某问题的算法与为该问题编写的程序含义是相同的C. 算法的可行性是指指令不能有二义性D. 以上几个都是错误的8.以下与数据的存储结构无关的术语是()。

A.循环队列 B. 链表 C. 哈希表 D. 栈9.在下面的程序段中,对x的赋值语句的频度为()for(i=0;i<n;i++)for(j=0;j<n;j++)x=x+1;A. 2n B.n C.n2 D.log2n10.以下数据结构中,()是非线性数据结构A.树 B.字符串 C.队列 D.栈11. 下列数据中,()是线性数据结构。

A.哈夫曼树 B.有向无环图 C. 二叉排序树D. 栈12.以下属于逻辑结构的是()。

A.顺序表 B. 哈希表 C.有序表 D. 单链表二、填空题1、_______是信息的载体,是对客观事物的符号表示,它能够被计算机识别、存储、加工和处理,________是对能够有效的输人到计算机中并且能够被计算机处理的符号的总称。

(数据、数据)2、数据元素是数据的______,有些情况下也称为元素、结点、顶点、记录等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第一章 一、填空题 1 数据元素是数据的基本单位,..数据项.......是具有独立含义的最小标识单位。 3 数据之间的关系(逻辑结构)有四种 集合、线性结构、树形结构、网状结构或图状结构,可分为....................... ....、...................两大类。 4 数据的存储结构包括..顺序存储结构.....................、..链式存储结构.......................... 二、问答题 1. 什么是数据结构?什么是数据类型? 答:数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及他们之间的关系和操作等的学科。 数据类型是一个值的集合和定义在这个值集上的一组操作的总称。 2. 叙述算法的定义与特性。 答:算法是对待定问题求解步骤的一种描述,他是指令的有限序列,其中每一条指令表示一个或多个操作。 一个算法具有以下5个重要特性: 1)、有穷性 2)、确定性3)、 可行性 4)、输入 5)、输出 3. 叙述算法的时间复杂度。 答:算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时量度,记作 T(n)=O(f(n)) 他表示随着问题规模n的增大,算法执行时间增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。 三、判断题(在各题后填写“√”或“×”) 1. 线性结构只能用顺序结构来存放,非线性结构只能用非顺序结构来存放。( × ) 2. 下列几种数量级从小到大的排列顺序为: O(1) 、O(logn)、O(n) 、O(nlogn) 、O(n2) 、O(n3 ) 、O(2n) 。( √ ) 四、1. 计算机执行下面的语句时,语句s的执行频度(重复执行的次数)为 _______ 。 FOR(i=l;i FOR(j=n;j>=i;j--) s; 2.有下列运行时间函数: (1)T1 (n)=1000; (2)T2(n)=n2+1000n; (3)T3(n)=3n3+100n2+n+1; 分别写出相应的大O表示的运算时间。(1)_______ (2)_______ (3)_______ 3. 设n为正整数,利用大O记号,将该程序段的执行时间表示为n的函数,则下列程序段的时间复杂度可表示为 (1) ( O (n.) ) (2) ( O(n2 ) ) 1)float sum1(int n){ /* 计算1!+2!+…+n! */ p=1; sum1=0; for (i=1; i<=n; ++i){ p=p*i; sum1=sum1+p } }/* sum1 */

(2) float sum2(int n){ /* 计算1!+2!+…+n! */ sum2=0; for (i=1; i<=n; ++i){ p=1; for (j=1; j<=i; ++j) p=p*j; sum2=sum2+p;} }/* sum2 */ 第二章 一、判断 1. 线性表在顺序存储时,逻辑上相邻的元素未必在存储的物理位置次序上相邻。( × ) 2. 顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。( × ) 二、填空 1.在单链表中,指针p所指结点为最后一个结点的条件是p->next=NULL。 2.在单链的循环链表中,指针p所指结点为最后一个结点的条件是p->next=头指针。 三、选择 1.、在一个长度为n的顺序表的表尾插入一个新元素的渐进时间复杂度为( B ) A.O (n) B.O (1) C.O (n2 ) D.O (log2 n)

2.线性链表不具有的特点是( A )。 A.随机访问 B.不必事先估计所需存储空间大小 C.插入与删除时不必移动元素 D.所需空间与线性表长度成正比 3.线性表采用链式存储时,其地址( D )。 A 必须是连续的 B 一定是不连续的 C 部分地址必须是连续的 D 连续与否均可以. 4、下列哪一个程序片段是在链表中间插入一个结点。(假设新结点为NEW,欲插入在Pointer结点之后) ( B ) A NEW->next=Pointer B NEW->next=Pointer->next Pointer=NEW Pointer->next=NEW C Pointer->next=NEW->next D 以上皆非 NEW->next=Pointer 5. 在单链表中,增加头结点的目的是 ( C ) A. 使单链表至少有一结点 B. 标志表中首结点位置 C. 方便运算的实现 D.说明单链表是线性表的链式存储实现

6. 线性表L在 情况下适用于使用链式结构实现。( B ) (A)需经常修改L中的结点值 (B)需不断对L进行删除插入 (C)L中含有大量的结点 (D)L中结点结构复杂 7、向一个有127个元素原顺序表中插入一个新元素并保存原来顺序不变,平均要移动( B )个元素。 A、8 B、63.5 C、63 D、7

三、算法设计 1 设顺序表 L中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。 1. Status Insert_SqList(SqList &va,int x)//把x插入递增有序表va中 {if(va.length+1>va.listsize) return ERROR; va.length++; for(i=va.length-1;va.elem[i]>x&&i>=0;i--) va.elem[i+1]=va.elem[i]; va.elem[i+1]=x; return OK; }//Insert_SqList

2 分别写出算法将单链表和顺序表就地逆置(用尽可能少的附加空间在原存储出空间内将将线性表a1,a2,a3,…an逆置为an…a3,a2,a1)。

2. 1 void reverse(SqList &A)//顺序表的就地逆置 {for(i=0,j=A.length-1;i A.elem[i]<->A.elem[j]; }//reverse 2.2 void LinkList_reverse(Linklist &L)//链表的就地逆置;为简化算法,假设表长大于2 {p=L->next;q=p->next;s=q->next;p->next=NULL; while(s->next) {q->next=p;p=q; q=s;s=s->next; //把L的元素逐个插入新表表头 } q->next=p;s->next=q;L->next=s; }//LinkList_reverse 分析:本算法的思想是,逐个地把L的当前元素q插入新的链表头部,p为新表表头.

*3删除元素递增排列的链表L中所有值相同的元素。 3. Status Delete_Equal(Linklist &L)//删除元素递增排列的链表L中所有值相同的元素 { p=L->next;q=p->next; //p,q指向相邻两元素 while(p->next) {if(p->data!=q->data) {p=p->next;q=p->next; //当相邻两元素不相等时,p,q都向后推一步} else { while(q->data==p->data) {free(q); q=q->next; } p->next=q;p=q;q=p->next; //当相邻元素相等时删除多余元素 }//else }//while }//Delete_Equal

第三章 作业 1.栈和队列都是特殊线性表,简述其相同点和差异处? 答:1)、相同点:栈和队列都是特殊线性表,对栈和队列的操作是对线性表操作的子集,他们是操作受限的线性表。 2)、不同点:栈是限定仅在表尾进行插入和删除操作的线性表;表尾端称为栈底,相应的表头端称为栈底:另外,栈的修改是按LIFO原则进行的。 队列则是一种FIFO的线性表,它只允许在表的一端进行插入,而在表的另一端进行删除;允许插入的一端叫做队尾,允许删除的一端叫做队头。 2.在初始为空的队列中插入元素a,b,c,d以后,紧接着作了两次删除操作,此时的队尾元素是 [ d ] *3.对于顺序存储的队列,存储空间大小为n,头指针为F,尾指针为R。若在逻辑上看一个环,则队列中元素的个数为 [ (4) ] (1).R-F ⑵.n+R-F ⑶.(R-F+1)mod n ⑷.(n+R-F)mod n 4. 若一个序列的进栈顺序为1,2,3,4, 那么不可能的出栈序列是 [ A ] A. 4,2,3,1 B. 3,2,1,4 C. 4,3,2,1 D. 1,2,3,4 5、一个递归的定义可以用递归过程求解,也可以用非递归过程求解,但单从运行时间来看,通常递归过程比非递归过程( B ) A.较快 B.较慢 C.相同 D 不确定 6.简述以下算法的功能(栈和队列的元素类型均为int) (1) Void alog1(stack &S,int e) { Stack T; int d; InitStack(T); while(!StackEmpty(S)){ Pop(S,d) ; if (d!=e) Push(T,d); } while(!StackEmpty(T)){ Pop(T,d); Push(S,d); } } //删除栈S中所有等于e的元素 (2)void proc_1(Stack S) { int i, n, A[255]; n=0; while(!EmptyStack(S)) {n++; Pop(S, A[n]);} for(i=1; i<=n; i++) Push(S, A[i]); //将栈S逆序 (3) void alog3(Queue &Q) {Stack S; int d; InitStack(S); while(!QueueEmpty(Q)){ DeQueue(Q,d);Push(S,d); } while(!StackEmpty(S)){ Pop(S,d); EnQueue(Q,d); } } //将队列Q逆序 *7.假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的队列初始化、入队和出队的算法。 解: typedef Linklist CLQuene; int InitQueue (CLQueue *Q) int EnterQueue (CLQueue Q,QueueElementType X) int DeleteQuene (CLQueue Q,QueueElementType *X) void InitCiQueue(CiQueue &Q)//初始化循环链表表示的队列Q { Q=(CiLNode*)malloc(sizeof(CiLNode)); Q->next=Q; }//InitCiQueue void EnCiQueue(CiQueue &Q,int x)//把元素x插入循环链表表示的队列Q,Q指向队尾元素,Q->next指向头结点,Q->next->next指向队头元素 { p=(CiLNode*)malloc(sizeof(CiLNode)); p->data=x; p->next=Q->next; //直接把p加在Q的后面 Q->next=p; Q=p; //修改尾指针 } Status DeCiQueue(CiQueue &Q,int x)//从循环链表表示的队列Q头部删除元素x { if(Q==Q->next) return ERROR;//队列已空 p=Q->next->next; x=p->data; Q->next->next=p->next; free(p);

相关文档
最新文档