算法与数据结构 张乃孝 前三章习题课
Chap3算法与数据结构—C语言描述(第2版)张乃孝编课件
E = ""
(注意区分空串""与空格串" "区别)
T = “ABBABBCA ” t= “ABB ABBCA ” (T和t不等) P= “BBC ” (P是T的子串,在T的位置是5)
子串:串中任意个连续的字符组成的子序列。 主串:包含子串的串相应地称为主串。 特别地,空串是任意串的子串。任意串s都是s本身的子 串。 除s本身之外,s的其它子串称为s的真子串。 位置:字符在序列中的序号。子串在主串中的位置则以 子串的第一个字符在主串中的位置来表示。 相等:两个串的长度相等,并且对应位置的字符都相等。
2 链接表示
在串的链接表示中,每个结点包含两个字段:字符和指 针,分别用于存放字符和指向下一个结点的指针。这样一个 串就可 用一个单链表来表示,其类型定义为:
struct StrNode; typedef struct StrNode *PStrNode; struct StrNode { char c; PStrNode link; }; typedef struct StrNode *LinkString; /* 链串的结点 */ /* 结点指针类型 */ /* 链串的结点结构 */
String concat (String s1, Sting s2 ) //返回将串s1和s2拼接在一起构成的一个新串。 String subStr (String s, int i, int j ) //在串s中,求从串的第i个字符开始连续j个字符所构成的子串。 int index (String s1, String s2 ) //如果串s2是s1的子串,则可求串s2在串s1中第一次出现的位置。 end ADT String
}
第1讲 数据结构 绪论
主Hale Waihona Puke 教师石连栓 软件教研室信息技术工程学院
课程安排
讲课学时: 讲课学时:36 参考书目: 参考书目
《算法与数据结构》 张乃孝主编. 高等教育出版社 算法与数据结构》 张乃孝主编 《数据结构》 数据结构》 严蔚敏等. 严蔚敏等 清华大学出版社
《计算机算法设计与分析》(第3版) 王晓东编著 电子工业出版社 计算机算法设计与分析》 第 版 《算法设计》 Jon KleinBerg Eva Tardos 著 张立昂 屈婉玲 译 清华大学出版社 算法设计》
逻辑结构划分方法二 一、集合 结构中的数据元素除了同属于一种 类型外,别无其它关系。 类型外,别无其它关系。 二、线性结构 结构中的数据元素之间存在一 对一的关系。 对一的关系。 三、树型结构 结构中的数据元素之间存在一 对多的关系。 对多的关系。 四、图状结构或网状结构 结构中的数据元素 之间存在多对多的关系。 之间存在多对多的关系。
18
存储结构 数据元素及其关系在计算机存储器中的存 储方式。 储方式。 是逻辑结构用计算机语言的实现, 是逻辑结构用计算机语言的实现,它依赖 于计算机语言。 于计算机语言。 存储结构两方面的内容 (1)数据元素自身值的表示(数据域) )数据元素自身值的表示(数据域) (2)该结点与其它结点关系的域(链域) )该结点与其它结点关系的域(链域)
首先,算法必须是“正确” 首先,算法必须是“正确”的 (1)执行算法所耗费的时间(效率要高 时间复杂度) 执行算法所耗费的时间( 时间复杂度) 执行算法所耗费的时间 效率要高,时间复杂度 (2)执行算法所耗费的存储空间( 主要考虑辅存空间 ; 执行算法所耗费的存储空间( 主要考虑辅存空间; 执行算法所耗费的存储空间 低存储要求,空间复杂度 空间复杂度) 低存储要求 空间复杂度) (3)算法的可读性、 易维护性要好 ( 易于理解 , 易于编 算法的可读性、易维护性要好(易于理解, 算法的可读性 易于调试) 码,易于调试) (4)健壮性, 即当输入一些非法数据时 , 算法也应做出 健壮性,即当输入一些非法数据时, 健壮性 适当的反应或进行处理。 适当的反应或进行处理。
张乃孝主编《算法与数据结构—C语言描述》.
(a)RL(0)型调整
(b)RL(L)型调整
(c)LR(R)型调整
16
201
16
17
202
图6.24
(a)删除3后的B树
(a)删除前的B树
18
208
9
q1=q2=q3=q4=q5=q6=1
q0= q1=q2=q3=q4=q5=q6=11
19
214
14
20
223
-7
21
223
-5
9
115
12
i<=t->n;
i<t->n;
10
118
-10
*PCSNode;
*CSTree;
11
130
5
每个内部结点
每个分支结点
12
130
-5
前序周游
先根周游
13
131
15
t==NULL
p==NULL
14
164
-4
小于基本区域
不大于基本区域
15
193
图6.21
(a)LR(0)型调整
(b)LR(L)型调整
张乃孝主编《算法与数据结构—C语言描述》
勘误表
二○○三年一月
序号
页码
行号
原文
更正
1
3
-7
2
44
7
*pclink
*pclist
3
76
3~6
/*见下栏左侧*/
4
76
5
107
8
(i=1,2,3...)
/*删除*/
6
107
10
Chap7_算法与数据结构—C语言描述(第2版)张乃孝编课件
插入算法
int insert (PBinSearchTree ptree, KeyType key)
例 {10, 18, 3, 8, 12, 2, 7, 4} 10 10 18 10 10 18 10 18
3
3 8
3
18
8 12 10
10
3 2 18 8 12 2 3
10
18 8 12 2 3
10 3 2 7 4 8 18 12
二叉排序树的插入
插入原则:若二叉排序树为空,则插入结点应为 新的根结点;否则,继续在其左、右子树上查找, 直至某个叶子结点的左子树或右子树为空为止, 则插入结点应为该叶子结点的左孩子或右孩子 二叉排序树生成:从空树出发,经过一系列的查 找、插入操作之后,可生成一棵二叉排序树
第7章 高级字典结构
7.3二叉排序树
定义
定义:二叉排序树或是一棵空树,或是具有下列性质的 二叉树:
若它的左子树不空,则左子树上所有结点的值均小 于它的根结点的值
若它的右子树不空,则右子树上所有结点的值均大 10 于或等于它的根结点的值 它的左、右子树也分别为二叉排序树 3 18
2 7 4
18 8 12
7
4
7Hale Waihona Puke 中序遍历二叉排序树可得到一个关键字的有序序列
二叉排序树的删除
为了删除一个二叉树中的结点,必须首先找到这个结点,然 后选择下面给出两种方法删除之,以保证删除后仍满足二 叉排序树的定义。 第一种方法∶ (1) 如果被删除结点p没有左子树,则用p的右子女代替p。 (2) 否则,在p的左子树中,找出关键码最大的一个结点r ( r 处于p的左子树中最右下角的位置,r 一定无右子女), 将r 的右指针指向p的右子女,用p的左子女代替p结点。 第二种方法∶ (1) 同第一种方法的(1)。 (2) 同第一种方法找到r结点,用r结点代替被删除的结点 p,p原来的左右子女不变。并且用原来r的左子女代替原来 的r结点。
Chap4算法与数据结构—C语言描述(第2版)张乃孝编课件
4.1 栈及其抽象数据类型
4.1.1. 定义
栈是限定在表尾进行插入或删除操作的线性表。表尾端称 栈顶,表头端称栈底。如图。 出栈 进栈 栈的修改是按后进先出 的原则进行的。 a 栈顶
n
... a2 a1
栈底
例1.一个栈的进栈序列是a,b,c,d,e,则栈不 可能的出栈序列是:
(A)edcba (B)decba (C) dceab (D)abcde
从pastack所指的栈中删除(或称弹出)一个元素。 当栈不空时,通过将栈顶变量减1达到元素删除的目的。 5. 取栈顶元素运算 程序实现
DataType top_seq( PSeqStack pastack )
当pastack所指的栈不为空栈时,将栈顶元素取出,而栈 本身未发生任何变化。
4.2.2链接表示
4.2 栈的实现
4.2.1顺序表示
typedef int DataType; /* 定义栈元素的数据类型, 这里定义为整型 */ struct SeqStack /* 顺序栈类型定义 */ { int MAXNUM; /* 栈中能达到的最大元素个数 */ int t; /*栈顶元素位置*/ DataType *s; }; typedef struct SeqStack * PSeqStack; D PSeqStack pastack;
typedef int DataType ; /* 定义栈中元素类型为整型, 也可定义为其他类型 */ struct Node; typedef struct Node * Pnode; struct Node /* 单链表结点结构 */ { DataType info; PNode link; }; struct LinkStack /* 链接栈类型定义 */ { PNode top; /* 指向栈顶结点 */ }; typedef struct LinkStack *PLinkStack ;
数据结构习题课
本课程用Python语言作为教学及上机使用的语言。
英文简介
This course is about teaching algorithms and data structures by using Python.
数据结构习题课课程详细信息
课程号
00137190
学分
0
英文名称
Data Structures
先修课程
计算概论
中文简介
基本目的:使学生较全面地理解算法和数据结构的概念、掌握各种数据结构与算法的实现方式,比较不同数据结构和算法的特点。使学生不仅学到数据结构与算法的基本知识,还能提高用计算机解决实际问题的能力。
3.串:串的概念和基本操作,模式匹配,应用(约2课时)
4.栈与队列:栈的概念和应用,队列的概念、实现和应用(约4课时)
5.树与二叉树:树和二叉树的概念,树形数据组织的性质,基本树算法,应用(约6课时)
6.图:基本概念及术语,图的表示,图遍历,最短路径、最小生成树、拓扑排序、关键路径(约8课时)
7.字典与检索:字典与检索,字典的存储结构(约遇到的各种问题,进一步提高学生的Python编程能力。
1.算法和数据结构概论:算法的概念,算法分析,算法复杂性的基本概念和意义,数据结构概念,数据结构讨论的基本问题(约2课时)
2.线性表:线性数据结构,顺序存储实现(顺序表),链接实现(链接表),应用(约2课时)
8.排序:排序的基本概念,典型的排序算法,排序算法的复杂性分析(约6课时)
10.算法设计与分析初步(约2课时)
Chap3_算法与数据结构—C语言描述(第2版)张乃孝编课件
3.2 字符串的实现
顺序表示 链接表示
1 顺序表示
字符串的顺序表示,就是把串中的字符,顺序地存储在一 组地址连续的存储单元中。其类型定义为: struct SeqString { /* 顺序串的类型 */ int MAXNUM; /* 串允许的最大字符个数 */ int n; /* 串的长度,nMAXNUM */ char *c; }; typedef struct SeqString *PSeqString;
算法3.3 创建空链串
LinkString createNullStr_link( ) { LinkString pst; pst=(LinkString)malloc(sizeof(struct StrNode )); if( pst != NULL ) pst->link =NULL; return (pst); }
else
return(s1); if (p==NULL) return(s1); t = (PStrNode)malloc(sizeof(struct StrNode)); s1->head = t; for (k=1;k<=j;k++) /*连续取j个字符*/ { t->c = p->c; if (p->link!=NULL && k<j) { q=(PStrNode)malloc(sizeof(struct StrNode)); p = p->link; t->link = q; t = q; } else break; } t->link = NULL; return(s1);
2 抽象数据类型
ADT String is operations String createNullStr (void) int IsNullStr ( String s )
数据结构(徐孝凯编著)部分习题参考解答
数据结构(徐孝凯编著)部分习题参考解答第一章 绪论1.1 单选题1. A2. D3. B4. C5. D6. B7. D1.2 填空题(给单号题解答)1. 集合结构,线性结构,树结构,图结构 (次序无先后) 3. 1:1, 1:N, M:N (或者1对1,1对N ,M 对N) 5. 引用 7. 实参,值9. sizeof(a), a+i (或者&a[i],或者(char*)a+i*sizeof(a[i]))11. n, n(n+1)/2, O(n 2)13. O(n 3) 15. 35/12提示:在含有n 个元素的数表中顺序查找任一元素的平均比较次数为p c i i i n=∑1,p i为查找第i 个元素的概率,c i 是查找第i 个元素时需要比较的元素数,查找所有元素的概率之和为1,若查找每个元素的概率相同,则平均查找长度的计算公式可简化为11ni i nc =∑。
计算此题的计算式为)76543(121241131+++++⨯+⨯1.4 算法分析题(给单号题解答)1. 判断n 是否是一个素数,若是则返回数值1,否则返回0。
该算法的时间复杂度为O (n )。
3. 计算∑=ni i 1!的值。
时间复杂度为O (n 2)。
5. 打印出一个具有n 行的乘法表,第i 行(1≤i ≤n )中有n-i+1个乘法项,每个乘法项为i 与j (i ≤j ≤n )的乘积。
时间复杂度为O (n 2)。
7. 矩阵相乘,即a[M][N]×b[N][L]→c[M][L]。
时间复杂度为O (M ×N ×L)。
1.5 算法设计题 1. (给单号题解答)(1) void InitQuadratic(Quadratic& q, float aa, float bb, float cc) { q.a=aa; q.b=bb; q.c=cc; }(3) float Eval(Quadratic& q, float x) { return (q.a*x*x+q.b*x+q.c);}(5) void Print(Quadratic& q){if (q.a) cout<<q.a<<"x**2";if(q.b)if(q.b>0)cout<<"+"<<q.b<<"x";elsecout<<q.b<<"x";if(q.c)if(q.c>0)cout<<"+"<<q.c;elsecout<<q.c;cout<<endl;}2.(给单号题解答)(1) char Compare(SimpleType x1, SimpleType x2){if(x1>x2) return '>';else if(x1==x2) return '=';else return '<';}时间复杂度为O(1)。
Chap6算法和数据结构—C语言描述(第2版)张乃孝编
链地址法
措施:将全部关键字为同义词旳统计存储在一种单链表中, 并用一维数组存储头指针
定义
散列函数——在统计旳关键字与统计旳存储地址之间 建立旳一种相应关系叫哈希函数
散列函数是一种映象,是从关键字空间到存储地 址空间旳一种映象
散列函数可写成:addr(ai)=H(ki) ai是表中旳一种元素 addr(ai)是ai旳存储地址 ki是ai旳关键字
关键字 hash 存储地址
5 13 19 21 37 56 64 75 80 88 92
low
mid
123456 7 5 13 19 21 37 56 64
high
8 9 10 11 75 80 88 92
low
mid
high
1 2 3 4 5 6 7 8 9 10 11
5 13 19 21 37 56 64 75 80 88 92
/* 检索成功 */
else if(pdic->element[mid].key>key)
high=mid-1;
/* 要检索旳元素在左半区 */
else low=mid+1;
/* 要检索旳元素在右半区 */
}
*position=low; return(0);
/* 检索失败 */
}
分析
二分法检索每经过一次比较就将检索范围缩小二分之一,第i次比较 可能比较旳元素个数如下表∶
折叠法
构造:将关键字分割成位数相同旳几部分,然后取这几部分 旳叠加和(舍去进位)做散列地址
种类
移位叠加:将分割后旳几部分低位对齐相加
间界叠加:从一端沿分割界来回折送,然后对齐相加
数据结构与算法张铭课后答案
数据结构与算法张铭课后答案【篇一:第3章栈和队列数据结构张铭复习题】一、填空题(每空1分,共15分)1. 向量、栈和队列都是栈顶插入和删除元素;对于队列只能在队尾插入和队首删除元素。
2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为。
不允许插入和删除运算的一端称为栈底。
3.4. 在一个循环队列中,队首指针指向队首元素的位置。
5. 在具有n个单元的循环队列中,队满时共有个元素。
6. 向栈中压入元素的操作是先,后。
7. 从循环队列中删除一个元素时,其操作是先移动队首指针,后。
8. 带表头结点的空循环双向链表的长度等于。
解:head二、判断正误(判断下列概念的正确性,并作出简要的说明。
)(每小题1分,共10分)错,线性表是逻辑结构概念,可以顺序存储或链式存储,与元素数据类型无关。
错,不一定吧?调用子程序或函数常用,cpu中也用队列。
(√)3. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。
(√)4. 对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。
正确,都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。
错,栈是逻辑结构的概念,是特殊殊线性表,而链表是存储结构概念,二者不是同类项。
错,他们都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。
(√)7. 栈和队列的存储方式既可是顺序方式,也可是链接方式。
(√)8. 两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底分别设在这片内存空间的两端。
错,有可能。
三、单项选择题(每小题1分,共20分)(b)1.栈中元素的进出原则是A.先进先出B.后进先出C.栈空则进D.栈满则出(c)2.若已知一个栈的入栈序列是1,2,3,?,n,其输出序列为p1,p2,p3,?,pn,若p1=n,则pi为A.i B.n=iC.n-i+1 D.不确定解释:当p1=n,即n是最先出栈的,根据栈的原理,n必定是最后入栈的(事实上题目已经表明了),那么输入顺序必定是1,2,3,?,n,则出栈的序列是n,?,3,2,1。
Chap9_算法与数据结构—C语言描述(第2版)张乃孝编课件
图的存储结构:邻接表
在这种表示法中,对于图中每个顶点建立一个链表
类似于树的孩子表示法,如果能把图中任一个顶点 的所有邻接点都表示出来,也就可以表示图。
无向图的第i个链表将图中与顶点vi相邻接的所有 顶点链接起来,也就是链表中的表头结点到链表中 的每个结点表示了与表头结点vi相关的边 有向图的第i个链表,链接了以顶点vi为尾(射出) 的所有头(射入)顶点,也就是链表中的表头结点 到链表中的每个结点表示了图中关联到表头结点vi 的所有边
例 2 1 4 3 5 6 图与子图
5 3 6
定义和术语
无向图: 顶点v的度(Dgeree)是和v相关联的边的数目,记为 TD(V)。 有向图: 以顶点v为头的弧的数目称为v的入度,记为ID(v) 以v为尾的弧的数目称为v的出度,记为OD(v) 顶点v的度TD(v)=ID(v)+OD(v)
1
3 2 G2 顶点5的度:3 顶点2的度:4
5
4
7
6 1
2
4 3 G1
5 6
顶点2入度:1 出度:3 顶点4入度:1 出度:0
定义和术语
无向图G(V,{E})中从顶点v到顶点v‘的路径(Path) 是一个顶点序列(v=vi,0,vi,1,…,vi,m=v’),其中 (vij-1, vi,j) ∈E,1≤j≤m。i = 1, 2, …, k,表示v到v’ 间有k条路径。 如果G是有向图,则路径也是有向的,顶点序列 应满足<vi,j-1, vi,j>∈E, 1≤j≤m。 路径的长度是路径上的边的数目。 第一个顶点和最后一个顶点相同的路径称为回 路或环(Cycle)。 序列中顶点不重复的出现的路径称为简单路径。 除第一个顶点和最后一个顶点外,其余顶点不 重复出现的回路,称为简单回路或简单环。
数据结构与算法分析课后习题答案
数据结构与算法分析课后习题答案第一章:基本概念一、题目:什么是数据结构与算法?数据结构是指数据在计算机中存储和组织的方式,如栈、队列、链表、树等;而算法是一系列解决问题的清晰规范的指令步骤。
数据结构和算法是计算机科学的核心内容。
二、题目:数据结构的分类有哪些?数据结构可以分为以下几类:1. 线性结构:包括线性表、栈、队列等,数据元素之间存在一对一的关系。
2. 树形结构:包括二叉树、AVL树、B树等,数据元素之间存在一对多的关系。
3. 图形结构:包括有向图、无向图等,数据元素之间存在多对多的关系。
4. 文件结构:包括顺序文件、索引文件等,是硬件和软件相结合的数据组织形式。
第二章:算法分析一、题目:什么是时间复杂度?时间复杂度是描述算法执行时间与问题规模之间的增长关系,通常用大O记法表示。
例如,O(n)表示算法的执行时间与问题规模n成正比,O(n^2)表示算法的执行时间与问题规模n的平方成正比。
二、题目:主定理是什么?主定理(Master Theorem)是用于估计分治算法时间复杂度的定理。
它的公式为:T(n) = a * T(n/b) + f(n)其中,a是子问题的个数,n/b是每个子问题的规模,f(n)表示将一个问题分解成子问题和合并子问题的所需时间。
根据主定理的不同情况,可以得到算法的时间复杂度的上界。
第三章:基本数据结构一、题目:什么是数组?数组是一种线性数据结构,它由一系列具有相同数据类型的元素组成,通过索引访问。
数组具有随机访问、连续存储等特点,但插入和删除元素的效率较低。
二、题目:栈和队列有什么区别?栈和队列都是线性数据结构,栈的特点是“先进后出”,即最后压入栈的元素最先弹出;而队列的特点是“先进先出”,即最先入队列的元素最先出队列。
第四章:高级数据结构一、题目:什么是二叉树?二叉树是一种特殊的树形结构,每个节点最多有两个子节点。
二叉树具有左子树、右子树的区分,常见的有完全二叉树、平衡二叉树等。
Chap1-算法与数据结构—C语言描述(第2版)张乃孝编课件
}ADT 抽象数据类型名
复数抽象数据类型示例
复数抽象数据类型 ADT Complex {
数据对象:D = {c1, c2 | c1, c2 R(R为实数集)} 数据关系:S = {<c1, c2> ( c1为实部,c2为虚部)} 基本操作:
数据对象(Data Object):相同特性数据元素 的集合,是数据的一个子集合。
基本概念和术语
• 数据结构:相互之间存在一种或多种特定关
系的数据元素的集合。
根据数据元素间关系的基本特性,有四种基本数据结构 (集合)——数据元素间除“同属于一个集合”外,无其它关系 线性结构——一个对一个,如线性表、栈、队列 树形结构——一个对多个,如树 图状结构——多个对多个,如图
长利 4
3 太华
2 1
桦南
发生疫情的五个村子
v
5
1
v 53
3
7
2
24
1
v 42
v
1v
4
3
村子联系网络
穷举法 贪心算法
0 1 2 7 5 1 0 4 4 3 2 4 0 1 2 7 4 1 0 3 5 3 2 3 0
耗时矩阵
数据结构
是一门研究非数值计算的程序设计问题中,计 算机操作的对象以及它们之间的关系和操作的 学科
void Assign(*A, c1, c2) void Add(*A, B) void Minus(*A, B) void Multiply(*A, B) void Divide(*A, B) ... }ADT Complex
复数抽象数据类型的C语言实现
数据结构与实训[张红霞等主编]习题答案
q→data=x;
p2→next=q;
q→next=p1;
}
}
(4)
void delete (LinkList p)
/*在不带头结点且长度大于1的单向循环链表中,p指向某结点,删除p的前驱结点*/
{ ppp=p→next;
{ p2=p1;
p1=p1→next;
}
if ( p1→next==Null && p1→data<x)
{ q=(linklist) malloc (sizeof(ListNode));
q→next=Null;
q→data=x;
p1→next=q;
}
else/* (p1→next==Null && p1→data>=x) || (p1→next!=Null && p1→data>=x)*/
free (head1);
}
(12)
void delete(DoubleList head, DoubleNode *p)
/*head为带头结点的双向循环链表的头指针,p指向head链中的某一个结点,删除p的前驱结点*/
{ if (p→prior==head) return; /*p结点无前驱结点*/
if (pb) /*pa1→data==pb→data*/
{ pa2→next=pa1→next;
free(pa1);
pa1=pa2→next;
}
else
{ pa1=pa1→next;
pa2=pa2→next;
}
}
return (la);
算法与数据结构 张乃孝 前三章习题课
5. 在以下的叙述中,正确的是__C_。 线性表的顺序存储结构优于链表存储结构 线性表的顺序存储结构适用于频繁插入/删除数据元素的情况 线性表的链表存储结构适用于频繁插入/删除数据元素的情况 线性表的链表存储结构优于顺序存储结构 6. 每种数据结构都具备三个基本运算:插入、删除和查找,这 A 种说法__ _。 A. 正确 B. 不正确 A 7. 不带头结点的单链表head为空的判定条件是____。 A. head= =NULL B. head->next= =NULL C. head->next= =head D. head!=NULL B 8. 带头结点的单链表head为空的判定条件是____。 A. head= =NULL B. head->next= =NULL C. head->next= =head D. head!=NULL
void reverse (Linklist H) { LNode *p; p=H->next; /*p指向第一个数据结点*/ H->next=NULL; /*将原链表置为空表H*/ while (p) { q=p; p=p->next; q->next=H->next; /*将当前结点插到头结点的后面*/ H->next=q; } }
12. 在一个单链表中,若p所指结点不是最后结点,在p之后插 B 入s所指结点,则执行____。 A. s->next=p; p->next=s; C. s->next=p->next; p=s; B. s->next=p->next; p->next=s; C. p->next=s; s->next=p;
b、无论链表是否为空,其头指针是指向头结点
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
r–>next=p; r=p; } if (r!=NULL) r–>next=NULL; return(head); }
linklist createlistr1( ){ char ch; linklist head=(linklist)malloc(sizeof(listnode)); listnode *p,*r r=head; while((ch=getchar( ))!=‵\n′{ p=(listnode*)malloc(sizeof(listnode)); p–>data=ch; r–>next=p; r=p; } r–>next=NULL; return(head); }
的指针。若链表中附设头结点,则不管线性表是否为空表, 头指针均不为空,否则表示空表的头指针为空。
2.1 单项选择题 1. 一个向量(即一批地址连续的存储单元)第一个元素的存储 地址是100,每个元素的长度为2,则第5个元素的地址是__ __。 B A. 110 B. 108 C. 100 D. 120 A 2. 线性表的顺序存储结构是一种__ _的存储结构,而链式存储 C 结构是一种__ _的存储结构。 A.随机存取 B.索引存取 C.顺序存取 D.散列存取 B 3. 线性表的逻辑顺序与存储顺序总是一致的,这种说法__ _。 A. 正确 B. 不正确 4. 线性表若采用链式存储结构时,要求内存中可用存储单元的 D 地址__ _。 A. 必须是连续的 B. 部分地址必须是连续的 C. 一定是不连续的 D. 连续或不连续都可以
L 指向无头结点的线性链表,写出删除链表中从下标为I的结 点开始的连续k个结点的算法
Linklist Del (linklist L,int I,int k) {pnode p,q; int j=0; p=L; while(p->link!=NULL&&j<i) {p=p->link;j++} for(j=1;j<=k;j++) {q=p->link; p->link=q->link; free(q); } Return(L);}
删除单链表中值相同的多余结点
Diff_link(Linklist llist) {pnode p,q,r; p=llist->link; while( p!=NULL) {q=p; r=q->link; while(r!=NULL) {if(r->info==p->info) {t=r->link; q->link=t; free(r); r=t; }
如果我们在链表的开始结点之前附加一个结点, 并称它为头结点,那么会带来以下两个优点: a、由于开始结点的位置被存放在头结点的 指针域中,所以在链表的第一个位置上的操作就 和在表的其它位置上的操作一致,无需进行特殊 处理;
b、无论链表是否为空,其头指针是指向头结点
在的非空指针(空表中头结点的指针域为空),
5. 在以下的叙述中,正确的是__C_。 线性表的顺序存储结构优于链表存储结构 线性表的顺序存储结构适用于频繁插入/删除数据元素的情况 线性表的链表存储结构适用于频繁插入/删除数据元素的情况 线性表的链表存储结构优于顺序存储结构 6. 每种数据结构都具备三个基本运算:插入、删除和查找,这 A 种说法__ _。 A. 正确 B. 不正确 A 7. 不带头结点的单链表head为空的判定条件是____。 A. head= =NULL B. head->next= =NULL C. head->next= =head D. head!=NULL B 8. 带头结点的单链表head为空的判定条件是____。 A. head= =NULL B. head->next= =NULL C. head->next= =head D. head!=NULL
首元结点、头结点、头指针的区别
首元结点:链表中存储线形表中第一个数据元素的结点
头结点:在链表首元结点之前附设一个结点。该结点的数 据域不存储数据元素,其作用是为了对链表进行操作时,
可以对空表、非空表的情况以及对首元结点进行统一处理。点)
的指针。若链表中附设头结点,则不管线性表是否为空表, 头指针均不为空,否则表示空表的头指针为空。
说明:第一个生成的结点是开始结点,将开始
结点插入到空表中,是在当前链表的第一个位
置上插入,该位置上的插入操作和链表中其它
位置上的插入操作处理是不一样的,原因是开
始结点的位置是存放在头指针(指针变量)中,
而其余结点的位置是在其前趋结点的指针域中。 算法中的第一个if语句就是用来对第一个位置 上的插入操作做特殊处理。
linklist creater( ) { char ch; linklist head; listnode *p,*r; //(, *head;) head=NULL;r=NULL; while((ch=getchar( )!=‵\n′){ p=(listnode *)malloc(sizeof(listnode)); p–>data=ch; if(head==NULL) { head=p; r=head;} else
已知线性表A的长度为n,并且采用顺序存储结构,写一 算法删除线性表中所有值为X的元素
Del (sqlist L,datatype x) {int I,j; for(I=0;i<L->n;I++) if(L->data[i]==x) {for(j=I;j<L->n;j++) L->data[j]=L->data[j+1]; L->n--; } }
(2)设L是不带头结点的单链表。 算法如下: int Length_LinkList2 (LinkList L) { Lnode * p=L; int j; if (p==NULL) return 0; /*空表的情况*/ j=1; /*在非空表的情况下,p所指的是第一个结点 */; while (p->next ) { p=p->next; j++ } return j; }
首元结点、头结点、头指针的区别
习题选讲 栈与队列
树与二叉树
首元结点、头结点、头指针的区别
首元结点:链表中存储线形表中第一个数据元素的结点
头结点:在链表首元结点之前附设一个结点。该结点的数 据域不存储数据元素,其作用是为了对链表进行操作时,
可以对空表、非空表的情况以及对首元结点进行统一处理。
头指针:是指向链表中第一个结点(头结点或首元结点)
else {q=r;r=r->link;} } P=p->link }}
b、无论链表是否为空,其头指针是指向头结点
在的非空指针(空表中头结点的指针域为空),
因此空表和非空表的处理也就统一了。
求表长 算法思路:设一个移动指针p和计数器j,初始化后 ,p所指结点后面若还有结点,p向后移动,计数器 加1。 (1)设L是带头结点的单链表(线性表的长度不包括头结 点)。 算法如下: 加头没加尾 int Length_LinkList1 (LinkList L) { Lnode * p=L; /* p指向头结点*/ int j=0; while (p->next) { p=p->next; j++ } /* p所指的是第 j 个结点*/ return j; }
12. 在一个单链表中,若p所指结点不是最后结点,在p之后插 B 入s所指结点,则执行____。 A. s->next=p; p->next=s; C. s->next=p->next; p=s; B. s->next=p->next; p->next=s; C. p->next=s; s->next=p;
该算法只是对链表中顺序扫描一边即完成了倒置,所以 时间性能为O(n)。
2.22 void LinkList_reverse(Linklist &L)//链表的就地逆 置;为简化算法,假设表长大于2
Rev(linklist L) //带头结点的单链表 {Pnode p,q,r; p=L->link;if(p==NULL) return; q=p->link; if(q==NULL) return; r=q->link; while(r!=NULL) {q->link=p; p=q; q=r; r=r->link;} q->link=p; L->link->link=NULL; L->link=q; }
C 9. 非空的循环单链表head的尾结点(由p所指向)满足____。 A. p->next= =NULL B. p= =NULL C. p->next= =head D. p= =head 10. 在双向循环链表的p所指结点之后插入s所指结点的操作是 D ____。 A. p->right=s; s->left=p; p->right->left=s; s->right=p->right; B. p->right=s; p->right->left=s; s->left=p; s->right=p->right; C. s->left=p; s->right=p->right; p->right=s; p->right->left=s; D. s->left=p; s->right=p->right; p->right->left=s; p->right=s; 11. 在一个单链表中,已知q所指结点是p所指结点的前驱结点, C 若在q和p之间插入s结点,则执行____。 A. s->next=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;