第二章 线性表
数据结构第二章线性表
线性表
数据结构:是相互之间存在一种或多种特 定关系的数据元素的集合。
A.线性结构
栈 队列
1.数据的逻辑结构 B.非线性结构 数 据 结 构 2、数据的存储结构
树
图
存储结构:是数据结构在计算机中的表示(又称映像)。
算法2:在线性表中指定位置前插入一个元素
插入元素时,线性表的逻辑结构由(a1, …, ai-1, ai, …, an)改变为(a1, …, ai-1, e, ai, …, an),在第i-1个数据元素和 第i个数据元素之间插入新的数据元素。 算法思想: 1) 检查i值是否超出所允许的范围(1≤i≤n+1),若超 出,则进行“超出范围”错误处理; 2) 将线性表的第i个元素和它后面的所有元素均向后 移动一个位置; 3) 将新元素写入到空出的第i个位置上; 4) 使线性表的长度增1。
•类型四:加工型操作 ListInsert(&L,i,e) 初始条件:线性表L已存在,1≤i≤ListLength(L)+1 操作结果:在L的第i个位置之前插入新的元素e,L的 长度增1。 ListDelete(&L,i,&e) 初始条件:线性表L已存在且非空,1≤i≤ListLength(L) 操作结果:删除L的第i个元素,并用e返回其值,L的 长度减1。 ClearList(&L) 初始条件:线性表L已存在。 操作结果:将L重置为空表。 }
第2章线性表
L.elem=newbase;
L.listsize+=LISTINCREMENT; } //原表空间不够
q=&(L.elem[i-1];
for ( p=&(L.elem[L.length–1]; p>=q; --p )
*(p+1)=*p; // i-1位置以后的所有结点后移
*q=e;
// 在i-1位置插入结点
2.1 线性表的逻辑结构
2.1.1 线性表的定义
线性表(Linear List) :是由n(n≧0)个数据元素(结 点)a1,a2, …an组成的有限序列。该序列中的所有结 点具有相同的数据类型。其中数据元素的个数n称为线 性表的长度。 当n=0时,称为空表。 当n>0时,将非空的线性表记作: (a1,a2,…an) a1称为线性表的第一个(首)结点,an称为线性表的最后 一个(尾)结点。
◆ 删除时平均移动次数:Edelete=∑pi*(n-i) (1≦i≦n) ∴ Edelete=(n-1)/2 。
平均时间复杂度:Ecompare+Edelete=n ,即为O(n)
2.3 线性表的链式存储
2.3.1 线性表的链式存储结构
链式存储 :用一组任意的存储单元存储线性表
中的数据元素。用这种方法存储的线性表简称线性链 表。
2 顺序线性表的插入
第2章 线性表(链表)
数据类型的构造
每个结点数据类型:用LinkList表示
它的成员:
数据域:用data表示,其类型通用类型标识符ElemType
指针域:这里用next表示。
LinkList类型的定义如下:
typedef struct LNode /*定义单链表结点类型*/
{ ElemType data; struct LNode *next; /*指向后继结点*/
(b)p->next=q ->next
p
… a (c) 删除后 …
(9) 删除数据元素ListDelete(&L,i,&e) 思路:先在单链表L中找到第i-1个结点*p,若存在这 样的结点,且也存在后继结点,则删除该后继结点。
int ListDelete(LinkList *L,int i,ElemType e) { int j=0; LinkList *p=L,*q; while (j<i-1 && p!=NULL) /*查找第i-1个结点*/ { p=p->next; j++;
{
i++;
p=p->next;
} return(i); }
6. 求 线 性 表 L 中 指 定 位 置 的 某 个 数 据 元 素 GetElem(L,i,&e) 思路:在单链表L中从头开始找到第 i个结点,若 存在第i个数据结点,则将其data域值赋给变量e。 函数有返回值: 0---非法位序 1---合法位序,并将找到的元素置变量e中
数据结构(C语言版)第2章线性表
0 1
a0 a1
Loc(A[0]) Loc(A[0]) +d
A[0] A[1]
n -1
空闲空间
…
i
…
…
ai
a n-1
…
Loc(A[0])+i*d
A[i]
…
图2-2 一维数组存储示意图
… …
Loc(A[n-1])
MAXNUM-1
…
…
A[n-1]
…
由于线性表的长度可变,且所需最大存储空间随问题不同而不 同,则在C语言中可用动态分配的一维数组,如下描述: //-----线性表的动态分配顺序存储结构----#define LIST_INIT_SIZE 100
在计算机内,线性表有两种基本的存储结构: 顺序存储结构和链式存储结构。 下面我们分别讨论这两种存储结构以及对应 存储结构下实现各操作的算法。
2.2 线性表的顺序存储结构
• 在计算机中用一组地址连续的存储单元依次存储线性表的 各个数据元素,称作线性表的顺序存储结构。
2.2.1 线性表的顺序存储结构
GetElem(Lb,i,&e);
if(! LocateElem(La,e,equal)) ListInsert(La,++La-len,e); } }
时间复杂性为:O(La表长*Lb表长)
第2章 线性表 (数据结构教程PPT课件)
ai为组成该线性表的数据元素,习惯用小写书写;
特点:除了a1 , an 外,ai(2<=i<=n-1)都有一个 前驱和后继。(ai-1 , ai+1)。例如:26个英文字母。
LOC(ai+1)=LOC(a1)+(i-1)*L
顺序存储结构的特点
(1)利用数据元素的存储位置表示线性表中相邻
数据元素之间的前后关系,即线性表的逻辑结构与存 储结构(物理结构)一致;
存储地址 d d+L d+2L ... d+(i-1)L ... d+(n-1)L ...
内存单元 ... a1 a2 a3 ai an ...
单链表的存储映象
头结点 在链表的第一个结点之前附设一个结点,头指 针指向头结点。设置头结点的目的是统一空表 与非空表的操作,简化链表操作的实现。 第一个结点 链表中存储线性表中第一个数据元素的结点。
H (a) 带头结点的空单链表 H a1 a2 … an
(b) 带头结点的单链表
链式存储结构的特点 (1)线性表中的数据元素在存储单元中的 存放顺序与逻辑顺序不一定一致; (2)在对线性表操作时,只能通过头指针 进入链表,并通过每个结点的指针域向后扫描 其余结点,这样就会造成寻找第一个结点和寻 找最后一个结点所花费的时间不等,具有这种 特点的存取方式被称为顺序存取方式。
数据结构第二章线性表详解
第二章线性表
一、描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。
并说明头指针和头结点的作用。
答:头指针是一个指针变量,里面存放的是链表中首结点的地址,并以此来标识一个链表。如链表H,链表L等,表示链表中第一个结点的地址存放在H、L中。
头结点是附加在第一个元素结点之前的一个结点,头指针指向头结点。当该链表表示一个非空的线性表时,头结点的指针域指向第一个元素结点,为空表时,该指针域为空。
开始结点指第一个元素结点。
头指针的作用是用来惟一标识一个单链表。
头结点的作用有两个:一是使得对空表和非空表的处理得以统一。二是使得在链表的第一个位置上的操作和在其他位置上的操作一致,无需特殊处理。
二、填空题
1、在顺序表中插入或删除一个元素,需要平均移动(表中一半)元素,具体移动的元素个数与(表长和该元素在表中的位置)有关。
2、顺序表中逻辑上相邻的元素的物理位置(必定)相邻。单链表中逻辑上相邻的元素的物理位置(不一定)相邻。
3、在单链表中,除了首元结点外,任一结点的存储位置由(其直接前驱结点的链域的值)指示。
4、在单链表中设置头结点的作用是(插入和删除元素不必进行特殊处理)。
三、何时选用顺序表、何时选用链表作为线性表的存储结构为宜?
答:在实际应用中,应根据具体问题的要求和性质来选择顺序表或链表作为线性表的存储结构,通常有以下几方面的考虑:
1.基于空间的考虑。当要求存储的线性表长度变化不大,易于事先确定其大小时,为了节约存储空间,宜采用顺序表;反之,当线性表长度变化大,难以估计其存储规模时,采用动态链表作为存储结构为好。
第二章 线性表(Lists)
应用举例
例. 己知两个线性表La, Lb按非递减序排列, 将其合并为一个 新的仍按非递减序排列的线性表。 La = (3, 5,34, 56) Lb = (1, 5, 12) Lc = (1,3,5,5,12,34,56) 基本思想: 顺序比较La与Lb的元素,将较小的元素插入Lc的 尾部。
void mergeList(List La, List Lb, List &Lc) { // La与Lb的元素按非递减序排列, 将其合并为按非递减序排列的Lc initList(Lc); i = j =1; k=0; // i,j为两个分别指向La,Lb未插入元素的指针 LaLen = listLength(La); LbLen = listLength(Lb); while ((i<=LaLen) && (j<=LbLen)){ //当两个线性表均未完成插入时 getElem(La, i, a); getElem(Lb, j, b); //取出当前元素 if (a <= b) {listInsert(Lc, ++k,a); i++;}//插入较小元素并移动相应的指针 else {listInsert(Lc, ++k, b); j++;} } while (i<=LaLen) { //将La的剩余元素依次插入Lc getElem(La, i++, a); listInsert(Lc, ++k, a); } while(j<=LbLen) {//将Lb的剩余元素依次插入Lc getElem((Lb, j++,b); listInsert(Lc, ++k, a); }
第2章 线性表
表中ai-1领先于ai,称ai-1是ai的直接前驱,ai+1是 ai的直接后继。
线性表的抽象数据类型定义 (参见教材)
返回本章目录
2.2 线性表的顺序存储结构
线性表的顺序存储是指在内存中用地址连续的一块存储空间 依次存放线性表的数据元素,用这种存储形式存储的线性表 称其为顺序表。 假设每个数据元素占d个存储单元,且将ai的存储地址表示为 Loc(ai),则有如下关系: Loc(ai)=Loc(a1)+(i-1)*d Loc(a1)是线性表的第一个数据元素a1的存储地址,通常 称作线性表的基地址。
if (i<1 || i> ListLength(h)) return NULL; //i值不合法
while (j<i) //从第1个结点开始,查找第i个结点 {
p=p->next; j++;
} return p; // 返回第i个结点的指针 } ◆本算法的时间复杂度为O(n)。
(4)按值查找 LNode *LocateElem(LinkList h,ElemType e) { LNode *p=h->next; while (p!=NULL && p->data!=e)
◆MAXSIZE为顺序表的容量,表示线性表实际可能达到的 最大长度。 ◆len表示顺序表当前的长度。
2-线性表
线性表基本操作的实现
课堂练习:
1)实现void remove(int i)
2)实现void clear() 3)实现void traverse() const 思考: 1)clear干了什么?
2)访问这里是指什么意思?
28
doubleSpace 操作的实现
doubleSpace操作扩大数组的空间,常用的比 例是扩大一倍。
//if exists return index, otherwise return -1 elemType visit(int i) const;
void insert(int i, const elemType &x);
void remove(int i); void clear() ; void traverse() const ; };
访问线性表的第i个元素visit(i):返回线 性表中第i个数据元素的值;
5
在第i个位置插入一个元素insert(i, x):使线性 表从(a0,a1,…ai-1,ai, …an-1)变成
(a0,a1,…ai-1,x,ai, …an-1),参数i的合法取
值范围是0到n;
删除第i个位置的元素remove(i):使线性表从
15
顺序表类的说明
研究的这组数据和数据上的操作,用类定
第二章线性表
s=(struct LNode *)malloc(sizeof(struct LNode)); s->data=x; s->next=p->next; p->next=s;
return OK; }
L ai-1 S P x
a1 ai
a2 an ∧
单链表的插入运算
Status ListInsert_L(LinkList &L,int i, ElemType x){ p=L; j=0; while( p&&j<i-1)
Typedef struct Lnode
{ Elem Type data; data next
struct Lnode *next;
} Lnode,*linklist;
L
a1
a2
带头结点的线性链表
a3
…..
an ∧
单链表的插入运算
Status ListInsert_L(LinkList &L,int i, ElemType x){ p=L; j=0; while( p&&j<i-1)
Linklist creat() {linklist head,p1,p2;
Head p1 p2
n=0;p1=p2=(struct lnode*)malloc(LEN); scanf(“%d”,&p1->data);head->next=NULL;
第2章 线性表
第2章 线性表 (3) 数据元素在线性表中的位置仅取决于它们自 己在表中的序号,并由该元素的数据项中的关键字KEY 加以标识。 (4) 线性表中所有数据元素的同一数据项,其属 性相同,它们的数据类型也是一致的。如表2-1所示的
学生单科成绩表中不同学生有不同记录,但数据项
“姓名”的属性是相同的,都是字符类型。不同的数 据项可以具有不同的属性,如数据项“姓名”和课程
i i 1
Y
i≤n? Y 查找成功 N 查找失败
结束
图2-7 无序线性表的查找算法框图
第2章 线性表 无序线性表的查找算法如下: /* 无序线性表的查找算法 */
ESEARCH(v[],n,t)
/* v是无序线性表,n是线性表的长度,t是被查找的记 录 */
{ int i;
v[n+1]=t; /* 建立无序查找的结束标志 */ i=1; while(v[i]!=t) i++;
第2章 线性表 2.3.3 线性表元素定位操作 图2-6(a)所示的是无序线性表,其数据元素在线
性表中的存放是任意的;图2-6(b)所示的是有序线性
表,其数据元素的排列按英文字母的字母顺序从小到 大存放。有序线性表有如下特点,设V为有序线性表,
数据元素ai值的相邻关系为ai-1≤ai≤ai+1。
图2-7所示是在无序线性表上进行查找的流程图。
数据结构2第二章:线性表
构造一个空顺序表图例
销毁线性表的函数
• Status DestroyList(SqList &L) • { // 初始条件:顺序线性表L已存在。操作结果:销毁顺序线
性表L
• free(L.elem); • L.elem=NULL; • L.length=0; • L.listsize=0; • return OK; • }
逆序建立一个带头的链表
void createList_L(LinkList &l,int n){//算法2.11
//逆序输入n个元素的值,建立带头结点的单链线性表L)
L=(LinkList)malloc(sizeof(Lnode)); L->next=NULL;//先建立一个带头结点的单链表。 for(i=n;i>0;--i){ P=(LinkList)malloc(sizeof(Lnode));//生成新结点。 scanf(&p->data); p->next=L->next; L->next=p;//插入到表头 }
销毁一个线性表
线性表的操作函数
Status ClearList(SqList &L) { // 初始条件:顺序线性表L已存在。操作结果:将L 重置为空表 L.length=0; return OK; } Status ListEmpty(SqList L) { // 初始条件:顺序线性表L已存在。操作结果:若L 为空表,则返回TRUE,否则返回FALSE if(L.length==0) return TRUE; else return FALSE; }
《数据结构(C++版)》第2章 线性表
2.2.2 顺序存储结构基本操作的实现
初始化:顺序表的初始化即构造一个空表,操作比较简单, 代码(算法2–1)如下所示: Template <class T> Line_ListSqu <T> :: Line_ListSqu(int MaxListSize) //线性表的构造函数 { MaxSize=MaxListSize; elem=new T[MaxSize]; length=0; }
Loc (a1)+(MaxSize- 1)*sizeof(ElemType)
图2.1 线性表的顺序存储
• Loc(a1)通常称作线性表的起始位置或基地址。只要确定了 存储线性表的起始位置,线性表中的任意一个数据元素都 可以随机存取。因此,线性表的顺序存储结构是一种随机 存取的存储结构。 • 线性表的这种机内表示称为线性表的顺序存储结构或顺序 映射。通常,称这种存储结构的线性表为顺序表。 • 其特点是以数据元素在计算机内“物理位置相邻”来表示 线性表中数据元素之间的逻辑关系。
线性表的抽象数据类型
Clear_List(&L) //清空线性表 输入:线性表L。 返回结果:将线性表L重置为空表。 List_Empty(&L) //判断线性表是否为空 输入:线性表L。 返回结果:若线性表L为空表,则返回TRUE,否则返回 FALSE。 List_Length(&L) //求线性表的长度 输入:线性表L。 返回结果:线性表L中的数据元素个数。
数据结构导论 第2章 线性表
单链表中每个结点的存储地址是存放在其前趋 结点next域中。 而开始结点无前趋,故应设头指针head 头指针head 头指针head指向开 始结点。 终端结点无后继,故终端结点的指针域为空, 即NULL(图示中也可用^表示)。
通常在单链表的第一个数据元素结点之前附设一个 结点,称之头结点 头结点。 头结点
void insert (sqlist *L, datatype x, int i ) { if (i<1 || i>L->last+1) error (“插入位置错误”); else if (L->last==maxsize) error (“溢出”); else { for (j=L->last-1; j>=i-1; j--) //往后移动元素 //往后移动元素 L->data[j+1]=L->data[j]; L->data[i-1]=x; //插入x L->last++; //修改表长 } }
a1 a2 a3 ……
b b+L b+2L b+(i-1)L
L
ai …… an
顺序表的第i个数据元素 的存储位置为: 顺序表的第 个数据元素ai的存储位置为: 个数据元素 LOC(ai)=LOC(a1)+(i-1)*L
2.2.2顺序表基本运算的实现
第2章 线性表
算法思想:① 依次从LB中取出一个DE; ② 判在LA中是否存在; ③ 若不存在,则插入到LA中。
void unionList(List LA,List LB,List &LC)
{ int lena,lenc,i; ElemType e; InitList(LC); for (i=1;i<=ListLength(LA);i++)
当n=0时,表示线性表是一个空表,即表中不包 含任何元素。设序列中第i(i表示位序)个元素为 ai(1≤i≤n)。
线性表是n个数据元素的有限序列,记为: L=(a1,a2, …,an)
•例1、26个英文字母组成的字母表 • (A,B,C、…、Z) •例2、某校从1978年到1983年各种型号的计算机 拥有量的变化情况。 • (6,17,28,50,92,188) •例3、一副扑克的点数 • (2,3,4,…,J,Q,K,A)
存储地址 LOC(A) LOC(A)+sizeof(ElemType) LOC(A)+(i-1)*sizeof(ElemType) LOC(A)+(n-1)*sizeof(ElemType)
LOC(A)+(MaxSize-1)*sizeof(ElemType)
顺序表示意图
由于C语言中的一维数组也是采用顺序存储表示,故 可以用数组类型来描述顺序表。又因为除了用数组 来存储线性表的元素之外,顺序表还应该用一个变 量来表示线性表的长度属性,所以用结构类型来定 义顺序表类型。 假定数组用data[MaxSize]表示,长度整型变量用 length表示,并采用结构体类型表示,则元素类型为通 用类型标识符ElemType的线性表的顺序存储类型可 描述如下:
数据结构导论(第二章线性表)
数据结构导论(第二章线性表)
一、线性表的基本概念
线性表的逻辑结构线性表是一种最简单、最常见的数据结构
线性表是由n(n≥0)个数据元素(结点)a1,a2,a3,……an组成的有限序列。数据元素的个数n定义为表的长度。当n=0时,称为空表
将非空的线性表(n>0)记作:L=(a1,a2,a3,……,an) a1:起始结点,an:终端结点。 a1称为a2的直接前
驱,a3称为a2的直接后继
线性表的特点:
线性表中只有1个起始结点,1个终端结点,起始结点没有直接前驱,有1个直接后继。
终端结点有1个直接前驱,没有直接后继。
除这2个结点外,每个结点都有且只有1个直接前驱和1个直接后继
二、线性表的顺序存储
线性表顺序存储的方法:将表中的结点依次存放在计算机内存中的一组连续存储单元中。
数据元素在线性表中的邻接关系决定其在存储空间中的存储位置;即逻辑结构中相邻的结点,其存储位置也相邻。
用顺序存储实现的线性表称为顺序表。
顺序表上的基本运算:插入(Insert)、删除(Delete)、定位(Locate)
=======================插入=========================
线性表的插入运算:是指在表的位置i上,插入一个新结点x,使长度为n的线性表(a1,a2,……,ai,……,an)变为长度为n+1的线性表(a1,……,x,……,an)
插入时的主义事项:
当表空间已满,不可再做插入操作。
当插入位置是非法位置,不可做正常的插入操作。
顺序表插入操作过程
将表中位置为n ,n-1,…,i上的结点,依次后移到位置n+1,n,…,i+1 上,空出位置i。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二章线性表练习题
一、单选题
1.在一个长度为n的顺序存储线性表中,向第i个元素(1≤i≤
n+1)之前插入一个新元素时,需要从后向前依次后移( )个
元素。
A、n-i
B、n-i+1
C、n-i-1
D、i
2.在一个长度为n的顺序存储线性表中,删除第i个元素(1≤i ≤n+1)时,需要从前向后依次前移( )个元素。
A、n-i
B、n-i+1
C、n-i-1
D、i
3.在一个长度为n的线性表中顺序查找值为x的元素时,查找时的平均查找长度(即x同元素的平均比较次数,假定查找每
个元素的概率都相等)为( )。
A、n
B、n/2
C、(n+1)/2
D、(n-1)/2
4.在一个单链表HL中,若要向表头插入一个由指针p指向的结点,则执行( )。
A、HL = p; p->next = HL;
B、p->next = HL; HL = p;
C、p->next = HL; p = HL;
D、p->next = HL->next; HL->next = p;
5.在一个单链表HL中,若要在指针q所指的结点的后面插入一个由指针p所指的结点,则执行( )。
A、q->next = p->next ; p->next = q;
B、p->next = q->next; q = p;
C、q->next = p->next; p->next = q;
D、p->next = q->next ; q->next = p;
6.在一个单链表HL中,若要删除由指针q所指向结点的后继结点,则执行( )。
A、p = q->next ; p->next = q->next;
B、p = q->next ; q->next = p;
C、p = q->next ; q->next = p->next;
D、q->next = q->next->next; q->next = q;
7. 下面关于线性表的叙述错误的是()。
(A) 线性表采用顺序存储必须占用一片连续的存储空间
(B) 线性表采用链式存储不必占用一片连续的存储空间
(C) 线性表采用链式存储便于插入和删除操作的实现
(D) 线性表采用顺序存储便于插入和删除操作的实现
8、设指针变量p指向单链表中结点A,若删除单链表中结点A,则需要修改指针的操作序列为()。
(A) q=p->next;p->data=q->data;p->next=q->next;free(q);
(B) q=p->next;q->data=p->data;p->next=q->next;free(q);
(C) q=p->next;p->next=q->next;free(q);
(D) q=p->next;p->data=q->data;free(q);
9、设一个有序的单链表中有n个结点,现要求插入一个新结点后使
得单链表仍然保持有序,则该操作的时间复杂度为()。
(A) O(log2n) (B) O(1) (C) O(n2) (D) O(n)
10、设一条单链表的头指针变量为head且该链表没有头结点,则其判空条件是()。
(A) head==0(B) head->next==0
(C) head->next==head (D) head!=0
11.通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着( )。
A.数据元素具有同一特点
B.不仅数据元素所包含的数据项的个数要相同,而且对应的数据项的类型要一致
C.每个数据元素都一样
D.数据元素所包含的数据项的个数要相等
12.链表不具备的特点是( )。
A.可随机访问任一结点B.插入删除不需要移动元素
C.不必事先估计存储空间D.所需空间与其长度成正比13.在一个长度为n(n>1)的单链表上,设有头和尾两个指针,执行( )操作与链表的长度有关。
A.删除单链表中的第一个元素
B.删除单链表中的最后一个元素
C.在单链表第一个元素前插入一个新元素
D.在单链表最后一个元素后插入一个新元素
14.下述哪一条是顺序存储结构的优点?( )。
A插入运算方便B可方便地用于各种逻辑结构的存储表示
C存储密度大D删除运算方便
15.下面关于线性表的叙述中,错误的是哪一个?( )。
A线性表采用顺序存储,必须占用一片连续的存储单元
B线性表采用顺序存储,便于进行插入和删除操作。
C线性表采用链式存储,不必占用一片连续的存储单元
D线性表采用链式存储,便于进行插入和删除操作。
16.线性表是具有n个( )的有限序列。
A.字符B.数据元素C.数据项D.表元素17.在n个结点的线性表的数组实现中,算法的时间复杂度是O(1)的操作是( )。
A.访问第i(1<=i<=n)个结点和求第i个结点的直接前驱(1
C.删除第i(1<=i<=n)个结点
D.以上都不对
18.下面关于线性表的叙述错误的是()。
(A) 线性表采用顺序存储必须占用一片连续的存储空间
(B) 线性表采用链式存储不必占用一片连续的存储空间
(C) 线性表采用链式存储便于插入和删除操作的实现
(D) 线性表采用顺序存储便于插入和删除操作的实现
19.用无头结点链接方式存储的队列,在进行插入运算时( ).
A. 仅修改头指针
B. 头、尾指针都要修改
C. 仅修改尾指针
D.头、尾指针可能都要修改
20.设指针变量p指向单链表中结点A,若删除单链表中结点A,则需要修改指针的操作序列为()。
(A) q=p->next;p->data=q->data;p->next=q->next;free(q);
(B) q=p->next;q->data=p->data;p->next=q->next;free(q);
(C) q=p->next;p->next=q->next;free(q);
(D) q=p->next;p->data=q->data;free(q);
21.设一个有序的单链表中有n个结点,现要求插入一个新结点后使
得单链表仍然保持有序,则该操作的时间复杂度为()。
(A) O(log2n) (B) O(1) (C) O(n2) (D) O(n)
22. 设一条单链表的头指针变量为head且该链表没有头结点,则其判空条件是()。
(A) head==0 (B) head->next==0
(C) head->next==head (D) head!=0
23.建立一个长度为n的有序单链表的时间复杂度为()
(A) O(n) (B) O(1) (C) O(n2)(D) O(log2n)
24. 设顺序线性表中有n个数据元素,则删除表中第i个元素需要移
动()个元素。