东南大学数据结构_Lec003解析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
- 单链表的基本操作 - 循环链表 - 双向链表
• 一元多项式的表示及相加 • 栈的概念、表示和实现
数据结构
2
单链表的基本操作
1. 建立单链表 2. 单链表的查找 3. 单链表的插入 4. 单链表的删除 5. 单链表的合并
数据结构
3
单链表的基本操作: 建表
1. 建立单链表
假设线性表中结点的数据类型是整型,以32767作为结束 标志。动态地建立单链表的常用方法有如下两种:
q–>next=p–>next; p–>next=q; p=q ; /* 钩链,新创建的结点总是作为最后一个结点*/
}
return (head);
}
数据结构
6
头插入法 vs 尾插入法
• 无论是哪种插入方法,若待插入单链表的结点是n个, 算法的时间复杂度均为O(n)。
• 对于单链表,无论是哪种操作,只要涉及到钩链(或 重新钩链),如果没有明确给出直接后继,钩链(或重 新钩链)的次序必须是“先右后左”。
head = p = (LNode *)malloc(sizeof(LNode));
p->next=NULL;
/* 创建单链表的表头结点head */
while (1){
scanf (“%d”,& data);
if (data == 32767) break ;
q= (LNode *)malloc(sizeof(LNode)); q–>data=data; /* 数据域赋值 */
/* 钩链,新创建的结点总是作为第一个结点 */
} return (head); }
数据结构
5
单链表的建立: 尾插入法
• 算法描述
LNode *create_LinkList(void) /* 尾插入法,链表的头结点head作为返回值 */
{
int data ;
LNode *head, *p, *q;
数据结构
4
单链表的建立: 头插入法
• 算法描述
LNode *create_LinkList(void) /* 头插入法,链表的头结点head作为返回值 */
{
int data ;
LNode *head, *p;
head = (LNode *) malloc( sizeof(LNode));
head->next=NULL;
数据结构
10
单链表的基本操作: 插入
3. 单链表的插入
插入运算是将值为 e 的新结点插入到表的第i个结点的位
置上,即插入到ai-1与ai之间。
• 先找到ai-1所在的结点p,然后生成一个数据域为e的新结
(2) 按值查找
在链表中查找是否有结点值等于给定值 key 的结点?若有,则 返回首次找到的值为key的结点的存储位置;否则返回NULL。查找 时从开始结点出发,沿链表逐个将结点的值和给定值key作比较。
数据结构
8
单链表的查找: 按序号
• 算法描述
ElemType Get_Elem(LNode *L, int i) {
• 避免了数组要求连续的单元存储元素的缺点; • 执行插入或删除运算时,不再需要移动元素来腾出空间或填
补空缺(当元素的粒度很大时,移动元素很费时)。
• 缺点
• 需要在每个单元中设置指针来表示表中元素之间的逻辑关系; • 增加了额外的存储空间(为获得上述优点付出代价)。
数据结构
1
第3讲 线性表II
• 线性表的链式表示
}
/* j>i,表示i为0
来自百度文库
*/
移动指针p的频度:
i<1时:0次;i∈[1,n]:i-1次;i>n:n次(最坏情况)
∴时间复杂度: O(n)。
数据结构
9
单链表的查找: 按值
• 算法描述
LNode *Locate_Node(LNode *L,int key) { /* 在以L为头结点的单链表中查找值为key的第一个结点 */
int j ; LNode *p; p=L->next; j=1;
/* 使p指向第一个结点 */
while (p!=NULL && j<i) { p=p–>next; j++; } /* 移动指针p , j计数 */
if (j!=i) return (-32768) ;
else return (p->data); /* p为NULL,表示i不合法 */
LNode *p=L–>next; while ( p!=NULL&& p–>data!=key) p=p–>next; if (p–>data==key) return p; else{
printf(“所要查找的结点不存在!!\n”); retutn(NULL); } }
• 算法的执行与形参key有关,平均时间复杂度为O(n)。
/* 创建链表的表头结点head */
while (1) {
scanf(“%d”, &data) ;
if (data==32767) break ;
p= (LNode *)malloc( sizeof(LNode) );
p–>data=data; /* 数据域赋值 */
p–>next=head–>next ; head–>next=p ;
顺序表的优缺点
• 优点
• 逻辑相邻,物理相邻=> 无须为表示表中元素之间的逻辑关系而增加额外的存储空间;
• 可随机存取任一元素; • 存储空间使用紧凑。
• 缺点
• 插入、删除操作需要移动大量的元素; • 预先分配空间需按最大空间分配,利用不充分; • 表容量难以扩充。
数据结构
0
链表的优缺点
• 优点
数据结构
7
单链表的基本操作: 查找
2. 单链表的查找
(1) 按序号查找——取单链表中的第 i 个元素
对于单链表,无法像顺序表那样直接按序号 i 访问结点,只能
从链表的头结点出发,沿链域next逐个结点往下搜索,直到搜索到
第i个结点为止。因此,链表不是随机存取结构。
假设单链表的长度为n,要查找表中第i个结点,仅当1≦i≦n时, i 的值是合法的。
(1) 头插入法 建表 从一个空表开始,重复读入数据,生成新结点,将读入数据存
放到新结点的数据域中,然后将新结点插入到当前链表的表头上, 直到读入结束标志为止。即每次插入的结点都作为链表的第一个结点。 (2) 尾插入法 建表
头插入法建立链表虽然算法简单,但生成的链表中结点的次序 和输入的顺序相反。若希望二者次序一致,可采用尾插法建表。该 方法是将新结点插入到当前链表的表尾,使其成为当前链表的尾结点。
• 一元多项式的表示及相加 • 栈的概念、表示和实现
数据结构
2
单链表的基本操作
1. 建立单链表 2. 单链表的查找 3. 单链表的插入 4. 单链表的删除 5. 单链表的合并
数据结构
3
单链表的基本操作: 建表
1. 建立单链表
假设线性表中结点的数据类型是整型,以32767作为结束 标志。动态地建立单链表的常用方法有如下两种:
q–>next=p–>next; p–>next=q; p=q ; /* 钩链,新创建的结点总是作为最后一个结点*/
}
return (head);
}
数据结构
6
头插入法 vs 尾插入法
• 无论是哪种插入方法,若待插入单链表的结点是n个, 算法的时间复杂度均为O(n)。
• 对于单链表,无论是哪种操作,只要涉及到钩链(或 重新钩链),如果没有明确给出直接后继,钩链(或重 新钩链)的次序必须是“先右后左”。
head = p = (LNode *)malloc(sizeof(LNode));
p->next=NULL;
/* 创建单链表的表头结点head */
while (1){
scanf (“%d”,& data);
if (data == 32767) break ;
q= (LNode *)malloc(sizeof(LNode)); q–>data=data; /* 数据域赋值 */
/* 钩链,新创建的结点总是作为第一个结点 */
} return (head); }
数据结构
5
单链表的建立: 尾插入法
• 算法描述
LNode *create_LinkList(void) /* 尾插入法,链表的头结点head作为返回值 */
{
int data ;
LNode *head, *p, *q;
数据结构
4
单链表的建立: 头插入法
• 算法描述
LNode *create_LinkList(void) /* 头插入法,链表的头结点head作为返回值 */
{
int data ;
LNode *head, *p;
head = (LNode *) malloc( sizeof(LNode));
head->next=NULL;
数据结构
10
单链表的基本操作: 插入
3. 单链表的插入
插入运算是将值为 e 的新结点插入到表的第i个结点的位
置上,即插入到ai-1与ai之间。
• 先找到ai-1所在的结点p,然后生成一个数据域为e的新结
(2) 按值查找
在链表中查找是否有结点值等于给定值 key 的结点?若有,则 返回首次找到的值为key的结点的存储位置;否则返回NULL。查找 时从开始结点出发,沿链表逐个将结点的值和给定值key作比较。
数据结构
8
单链表的查找: 按序号
• 算法描述
ElemType Get_Elem(LNode *L, int i) {
• 避免了数组要求连续的单元存储元素的缺点; • 执行插入或删除运算时,不再需要移动元素来腾出空间或填
补空缺(当元素的粒度很大时,移动元素很费时)。
• 缺点
• 需要在每个单元中设置指针来表示表中元素之间的逻辑关系; • 增加了额外的存储空间(为获得上述优点付出代价)。
数据结构
1
第3讲 线性表II
• 线性表的链式表示
}
/* j>i,表示i为0
来自百度文库
*/
移动指针p的频度:
i<1时:0次;i∈[1,n]:i-1次;i>n:n次(最坏情况)
∴时间复杂度: O(n)。
数据结构
9
单链表的查找: 按值
• 算法描述
LNode *Locate_Node(LNode *L,int key) { /* 在以L为头结点的单链表中查找值为key的第一个结点 */
int j ; LNode *p; p=L->next; j=1;
/* 使p指向第一个结点 */
while (p!=NULL && j<i) { p=p–>next; j++; } /* 移动指针p , j计数 */
if (j!=i) return (-32768) ;
else return (p->data); /* p为NULL,表示i不合法 */
LNode *p=L–>next; while ( p!=NULL&& p–>data!=key) p=p–>next; if (p–>data==key) return p; else{
printf(“所要查找的结点不存在!!\n”); retutn(NULL); } }
• 算法的执行与形参key有关,平均时间复杂度为O(n)。
/* 创建链表的表头结点head */
while (1) {
scanf(“%d”, &data) ;
if (data==32767) break ;
p= (LNode *)malloc( sizeof(LNode) );
p–>data=data; /* 数据域赋值 */
p–>next=head–>next ; head–>next=p ;
顺序表的优缺点
• 优点
• 逻辑相邻,物理相邻=> 无须为表示表中元素之间的逻辑关系而增加额外的存储空间;
• 可随机存取任一元素; • 存储空间使用紧凑。
• 缺点
• 插入、删除操作需要移动大量的元素; • 预先分配空间需按最大空间分配,利用不充分; • 表容量难以扩充。
数据结构
0
链表的优缺点
• 优点
数据结构
7
单链表的基本操作: 查找
2. 单链表的查找
(1) 按序号查找——取单链表中的第 i 个元素
对于单链表,无法像顺序表那样直接按序号 i 访问结点,只能
从链表的头结点出发,沿链域next逐个结点往下搜索,直到搜索到
第i个结点为止。因此,链表不是随机存取结构。
假设单链表的长度为n,要查找表中第i个结点,仅当1≦i≦n时, i 的值是合法的。
(1) 头插入法 建表 从一个空表开始,重复读入数据,生成新结点,将读入数据存
放到新结点的数据域中,然后将新结点插入到当前链表的表头上, 直到读入结束标志为止。即每次插入的结点都作为链表的第一个结点。 (2) 尾插入法 建表
头插入法建立链表虽然算法简单,但生成的链表中结点的次序 和输入的顺序相反。若希望二者次序一致,可采用尾插法建表。该 方法是将新结点插入到当前链表的表尾,使其成为当前链表的尾结点。