第二章 线性表
第二章 线性表

(7)已知顺序表L中的元素有序递增,设计算法将元素x插入到L 种,并依旧保持其有序递增;设计一个高效的算法,删除顺序表 中所有值为x的元素,要求空间复杂度为O(1)。(基于顺序表基本 操作的运算) (8)(2010年13分)设将n(n>1)个整数存放到一维数组R中。试 设计一个在时间和空间两方面尽可能有效的算法,将R中保有的 序列循环左移P(0<p< n)个位置,即将R中的数据由(X0 X1 ……Xn-1)变换为(Xp Xp+1 ……Xn-1 X0 X1……Xp-1) 要求: (1)给出算法的基本设计思想。 (2)根据设计思想,采用C或C++或JAVA语言描述算法,关键之处 给出注释。 (3)说明你所设计算法的时间复杂度和空间复杂度
2 3 4 5 6
30 60 20 40
6 -1 3 1
h
10
20Βιβλιοθήκη 304050
60∧
8、例题: (1)链表不具有的特点是( )。 A.可随机访问任一元素 B.插入删除不需要移动元素 C.不必事先估计存储空间 D.所需空间与线性表长度成正比 (2)在具有n个结点的单链表中插入一个新结点并使链表仍然有 序的时间复杂度是( )。 A. O(1) B. O(n) C. O(nlog2n) D. O(n2) (3)对于由n个元素组成的线性表,创建一个有序单链表的时间 复杂度是( )。 A. O(1) B. O(n) C. O(nlog2n) D. O(n2)
(4)设A是一个线性表,采用顺序存储结构。在等概率情况下, 平均插入一个元素需要移动多少个元素?若元素插在ai和ai+1之 间的概率为(n-i)/n(n-1)/2,则平均插入一个元素需要移动多少 个元素? (5)以顺序表作为存储结构,实现线性表的就地逆置;判断回 文;设计一个时间复杂度为O(n)的算法,将顺序表中所有元素循 环左移k位;设计一个时间复杂度为O (n)的算法,将顺序表中所 有元素循环右移k位;(基于逆置操作的运算) (6)将顺序表中的元素调整为左右两部分,左边元素为奇数, 右边元素为偶数,要求算法的时间复杂度为O (n);将顺序表A拆 分为B 和C,其中B中的元素小于0,C中的元素大于0;将有序表A和 有序表B合并为C,合并后C依然是有序的。(基于对顺序表的拆分 和合并操作的运算)
线性表栈和队列

while( p !=NULL && j < i ) { p=p->link; j++; } // 指向第i结点,i=0,1,…,当链表 //中结点数小于i时返回NULL return p; }
单链表插入算法
// 插入数据内容为value的新结点,为第i个 结点。 ListNode * Insert(ELEM value, int i) { ListNode *p,*q; q = new ListNode; p = FindIndex(i-1); if(p == NULL ) return NULL;
}
2.2.2
Байду номын сангаас
向量的运算
插入元素运算
void insert( item) ELEM remove( )
删除元素运算
插入算法
/*(设元素的类型为ELEM,nodelist是存储顺序表的 向量, msize 是此向量的最大长度, curr_len 是此向 量的当前长度,curr为此向量当前下标)*/ #include <assert.h> viod insert(ELEM item) { //需要检查当前长度不能等于msize,当前游标指针 //curr不能小于0,也不能大于当前长度
q->link = p->link; q->data = value; p->link = q; if(q->link == NULL ) last=q; return q;
}
插入过程
单链表删除算法
//删除由参数link所指定的结点
void RemoveAfter(ListNode * link) { ListNode *newlink=link; if(link!=NULL) link=link->link; delete newlink; }
数据结构第二章:线性表

实现:可用C 实现:可用C语言的一维数组实现
6
V数组下标 0 1
内存 a1 a2
元素序号 1 2
typedef int DATATYPE; #define M 1000 DATATYPE data[M]; 例 typedef struct card { int num; char name[20]; char author[10]; char publisher[30]; float price; }DATATYPE; DATATYPE library[M];
4
{加工型操作 加工型操作} 加工型操作
ClearList( &L ) 初始条件:线性表 L 已存在。 操作结果:将 L 重置为空表。 PutElem( &L, i, &e ) 初始条件:线性表L已存在,1≤i≤LengthList(L)。 操作结果:L 中第 i 个元素赋值同 e 的值 ListInsert( &L, i, e ) 初始条件:线性表 L 已存在,1≤i≤LengthList(L)+1。 操作结果:在 L 的第 i 个元素之前插入新的元素 e,L 的长度增1。 ListDelete( &L, i, &e ) 初始条件:线性表 L 已存在且非空,1≤i≤LengthList(L)。 操作结果:删除 L 的第 i 个元素,并用 e 返回其值,L 的长度减1。 }ADT LIST
3
PriorElem( PriorElem L, cur_e, &pre_e ) 初始条件:线性表 L 已存在。 操作结果:若 cur_e 是 L 中的数据元素,则用 pre_e 返回 它的前驱,否则操作失败,pre_e 无定义。 NextElem( NextElem L, cur_e, &next_e ) 初始条件:线性表 L 已存在。 操作结果:若 cur_e 是 L 中的数据元素,则用 next_e 返 回它的后继,否则操作失败,next_e 无定义。 GetElem( GetElem L, i, &e ) 初始条件:线性表 L 已存在,1≤i≤LengthList(L)。 操作结果:用 e 返回 L 中第 i 个元素的值。 LocateElem( LocateElem L, e, compare( ) ) 初始条件:线性表 L 已存在,compare( ) 是元素判定函数。 操作结果:返回 L 中第1个与 e 满足关系 compare( ) 的元 素的位序。若这样的元素不存在,则返回值为0。 ListTraverse(L, visit( )) ListTraverse 初始条件:线性表 L 已存在,visit( ) 为元素的访问函数。 操作结果:依次对 L 的每个元素调用函数 visit( )。 一旦 visit( ) 失败,则操作失败。
《数据结构与算法(C++语言版)》第2章 线性表

数据结构与算法 (C++语言版)
第2章 线性表
线性表的类型定义
• 基本概念 • 线性表是由n(n≥0)个类型相同的数据元素组成的有限序 列,通常表示为L=(a1, …, ai–1, ai, ai+1, …, an)。其中,L为线 性表名称,ai为组成该线性表的数据元素,ai–1领先于ai,ai 领先于ai+1,称ai–1是ai的直接前驱元素,ai+1是ai的直接后继 元素。当i=1, 2, …, n–1时,ai有且仅有一个直接后继;当 i=2, 3, …, n时,ai有且仅有一个直接前驱。 • 线性表的长度就是线性表中元素的个数n(n≥0)。当n=0时, 称为空表。在非空表中的每个数据元素都有一个确定的位 置,如a1是第一个数据元素,an是最后一个数据元素,ai是 第i个数据元素。称i为数据元素ai在线性表中的位序。
线性表的类型定义
Prev_Elem(L, cur_e, &pre_e) //返回当前元素的前一个元素值 输入:线性表L。 输出:若cur_e是线性表L的数据元素,且不是第一个,则用 pre_e返回它的直接前驱元 素;否则操作失败,pre_e无定义。 Next_Elem(L, cur_e, &next_e) //返回当前元素的后一个元素值 输入:线性表L。 输出:若cur_e是线性表L的数据元素,且不是最后一个,则用 next_e返回它的直接后继元素;否则操作失败,next_e无定 义。
线性表

2.1 线性表的类型定义
例3:下图为10个个学生的成绩表,它也是一个 线性表,该线性表的数据元素类型为结构体类型。
2.1 线性表的类型定义
从以上例子可看出线性表的逻辑特征是: 在非空的线性表中,有且仅有一个被称作 “第一个”的数据元素a1,它没有直接前趋, 而仅有一个直接后继a2; 有且仅有一个被称作“最后一个”的数据元 素an,它没有直接后继,而仅有一个直接前 趋 a n-1; 其余的数据元素ai(2≦i≦n-1)都有且仅有一个 直接前趋a i-1和一个直接后继a i+1。 线性表是一种典型的线性结构。
2.2 线性表的顺序表示和实现
#define MAXNUM 100 Elemtype List1[MAXNUM] ; /*定义线性表L1*/ int length1;
Elemtype List2[MAXNUM] ; /*定义线性表L1*/ int length2;
Elemtype List3[MAXNUM] ; /*定义线性表L1*/ int length3;
2.2 线性表的顺序表示和实现
而只需要将数组和表长封装在一个结构体中,然 后定义三个结构体变量即可: struct L_list { Elemtype List[MAXNUM]; int length; }; struct L_list L1, L2, L3; /*定义三个线性表L1,L2,L3*/
2.1 线性表的类型定义
例1:26个英文字母组成的字母表 (A,B,C、…、Z) 例2:某公司2000年每月产值表(单位:万元) (400,420,500,…,600,650) 是一个长度为12的线性表。
上述两例中的每一个数据元素都是不可分割的, 在一些复杂的线性表中,每一个数据元素又可 以由若干个数据项组成。
数据结构课件第2章线性表

27
线性表的顺序存储结构适用于数据 元素不经常变动或只需在顺序存取设备 上做成批处理的场合。为了克服线性表 顺序存储结构的缺点,可采用线性表的 链式存储结构。
28
2.3 线性表的链式存储结构
线性表的链式存储表示 基本操作在单链表上的实现 循环链表 双向链表 线性表链式存储结构小结
2.3.1 线性表的链式存储表示 29
2.1.1 线性表的定义
6
一个线性表(linear_list)是 n(n≥0)个具有相同属性的数 据元素的有限序列,其中各元素有着依次相邻的逻辑关系。
线性表中数据元素的个数 n 称为线性表的长度。当 n = 0 时 该线性表称为空表。当 n > 0 时该线性表可以记为:
(a1,a2,a3,…,ai,…,an)
数据域 指针域
结点 data next
31
(2) 线性表的单链表存储结构
通过每个结点的指针域将线性表中 n 个结点按其逻辑顺序链 接在一起的结点序列称为链表,即为线性表 ( a1, a2, a3, …, ai, …, an ) 的链式存储结构。如果线性链表中的每个结点只有一个指针域, 则链表又称为线性链表或单链表 (linked list)。
17
(2) 算法编写
#define OK 1
#define ERROR 0
Int InsList ( SeqList *L, int i, ElemType e ) /*在顺序线性表 L 中第 i 个位置插入新的元素 e。*/ /* i 的合法值为 1≤i ≤L->last+2*/ {
int k; if ( i < 1) ||( i > L->last+2)) /*首先判断插入位置是否合法*/ { printf(“插入位置i值不合法”);
第二章线性表

;查询通讯录信息。
第2页
目录
目录 退出
第二章 线性表
struct TelRed {char name[20]; char tel[12]; }; struct TelRed TelBook[100]; int length; 结构体数组TelBook和表示通讯录长度length二者实际 上是作为通讯录的一部分出现的,将二者作为一个整体来 表示通讯录。
第21页
目录
目录 退出
第二章 线性表
算法思想:
1)检查 i 值是否超出所允许的范围 (1 i n + 1) ,若超出
,则进行“超出范围”错误处理; 2)将线性表的第 i 个元素和它后面的所有元素均后移一个 位置; 3)将新元素写入到空出的第 i 个位置上;
4)使线性表的长度增 1。
第22页
第10页
目录
目录 退出
第二章 线性表
③ DestroyList(&L) 初始条件:线性表L已存在。
操作结果:销毁线性表L。
④ ClearList(&L) 初始条件:线性表L已存在。 操作结果:将L置为空表。 ⑤ EmptyList(L) 初始条件:线性表L已存在。 操作结果:如果L为空表,则返回TRUE,否则返回FALSE。 ⑥ GetData(L,i,&a) 初始条件:表L存在,且1≤i≤ListLength(L)。 操作结果:用a返回线性表L中第i个数据元素的值。
2、有且仅有一个终端结点 an,它没有直接后继,而仅有 一个直
接前趋 an -1, an 叫表尾元素;
3、其余的内部结点 ai (2 i n -1) 都有且仅有一个直接 前趋 ai –1
和一个直接后继 ai +1。
吉林大学数据结构_第二章 线性表

如何找指定位置的结点?
• 与顺序表不同,单链表无法直接访问指定 位置的结点,而是需要从哨位结点开始, 沿着next指针逐个结点计数,直至到达指定 位置。
操作
• • • • 存取 查找 删除 插入
存取算法
算法Find(k.item) /*将链表中第k个结点的字段值赋给item*/ F1. [k合法?] IF (k<1) THEN (PRINT “存取位置不合法”. RETURN.) F2. [初始化] p←head. i ←0. F3. [找第k个结点] WHILE (p ≠NULL AND i<k) DO (p←next(p). i ←i+1.) IF p=NULL THEN (PRINT “无此结点”. RETURN. ) item←data(p). ▍ 存取算法的时间复杂性分析。P30
插入算法
算法Insert(k,item) /*在链表中第k个结点后插入字段值为item的结点*/ I1.[k合法?] IF (k<0) THEN (PRINT “插入不合法”. RETURN) I2.[初始化] p←head. i ←0. I3.[p指向第k个结点] WHILE (p ≠NULL AND i<k) DO (p←next(p). i ←i+1.) IF p=NULL THEN (PRINT “插入不合法”. RETURN. ) I4.[插入] s<= AVAIL. data(s) ←item. next(s) ←next(p). next(p) ←s. ▍
删除算法
算法Delete(k.item) /*删除链表中第k个结点并将其字段值赋给item*/ D1.[k合法?] IF (k<1) THEN (PRINT “删除不合法”. RETURN.) D2.[初始化] p←head. i ←0. D3.[找第k-1结点] WHILE (p ≠NULL AND i<k-1) DO (p←next(p). i ←i+1.) IF p=NULL THEN (PRINT “无此结点”. RETURN. ) D4.[删除] q ← next(p). next(p) ← next(q) . item←data(q). AVAIL<=q.▍
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二章线性表练习题一、单选题1.在一个长度为n的顺序存储线性表中,向第i个元素(1≤i≤n+1)之前插入一个新元素时,需要从后向前依次后移( )个元素。
A、n-iB、n-i+1C、n-i-1D、i2.在一个长度为n的顺序存储线性表中,删除第i个元素(1≤i ≤n+1)时,需要从前向后依次前移( )个元素。
A、n-iB、n-i+1C、n-i-1D、i3.在一个长度为n的线性表中顺序查找值为x的元素时,查找时的平均查找长度(即x同元素的平均比较次数,假定查找每个元素的概率都相等)为( )。
A、nB、n/2C、(n+1)/2D、(n-1)/24.在一个单链表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!=011.通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着( )。
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<i<=n)B.在第i(1<=i<=n)个结点后插入一个新结点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!=023.建立一个长度为n的有序单链表的时间复杂度为()(A) O(n) (B) O(1) (C) O(n2)(D) O(log2n)24. 设顺序线性表中有n个数据元素,则删除表中第i个元素需要移动()个元素。
(A) n-i(B) n+l -i (C) n-1-i (D) i25. 设指针变量p指向双向链表中结点A,指针变量s指向被插入的结点X,则在结点A的后面插入结点X的操作序列为()。
(A) p->right=s;s->left=p;p->right->left=s;s->right=p->right;(B) s->left=p;s->right=p->right;p->right=s;p->right->left=s;(C) p->right=s;p->right->left=s;s->left=p;s->right=p->right;(D) s->left=p;s->right=p->right;p->right->left=s;p->right=s;26. 设顺序表的长度为n,则顺序查找的平均比较次数为()。
(A) n (B) n/2 (C) (n+1)/2 (D) (n-1)/227. 设某链表中最常用的操作是在链表的尾部插入或删除元素,则选用下列()存储方式最节省运算时间。
(A) 单向链表(B) 单向循环链表(C) 双向链表(D) 双向循环链表28.设指针q指向单链表中结点A,指针p指向单链表中结点A的后继结点B,指针s指向被插入的结点X,则在结点A和结点B插入结点X的操作序列为()。
(A) s->next=p->next;p->next=-s;(B) q->next=s;s->next=p;(C) p->next=s->next;s->next=p;(D) p->next=s;s->next=q;二、填空题1.在线性表的单链接存储结构中,每个结点包含有两个域,一个叫域,另一个叫域。
2.对于一个长度为n的顺序存储的线性表,在表头插入元素的时间复杂度为,在表尾插入元素的时间复杂度为。
3.对于一个长度为n的单链接存储的线性表,在表头插入元素的时间复杂度为,在表尾插入元素的时间复杂度为。
4.在线性表的顺序存储中,若一个元素的下标为i,则它的前驱元素的下标为,后继元素的下标为。
5.在线性表的单链接存储中,若一个元素所在结点的地址为p,则其后继结点的地址为,若假定p为一个数组a中的下标,则其后继结点的下标为。
6、设指针p指向单链表中结点A,指针s指向被插入的结点X,则在结点A的前面插入结点X时的操作序列为:1) s->next=___________;2) p->next=s;3) t=p->data;4) p->data=___________;5) s->data=t;7.设指针变量p指向双向循环链表中的结点X,则删除结点X需要执行的语句序列为_________________________________________________________(设结点中的两个指针域分别为llink和rlink)。
8.设指针变量p指向双向链表中的结点A,指针变量s指向被插入的结点X,则在结点A的后面插入结点X的操作序列为_________=p;s->right=p->right;__________=s; p->right->left=s;(设结点中的两个指针域分别为left和right)。
9.设顺序线性表中有n个数据元素,则第i个位置上插入一个数据元素需要移动表中_______个数据元素;删除第i个位置上的数据元素需要移动表中_______个元素。