链表
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9
isabell
(4)删除操作是指,删除结点ki ,使线性 表的长度减1,且ki-1、ki和ki+1之间的逻辑关 系发生如下变化: 删除前,ki是ki+1的前驱、ki-1的后继;删除 后,ki-1成为ki+1的前驱,ki+1成为ki-1的后继. (5)打印输出
10
一个指针类型的成员既可指向其它类型的结构体 数据, 数据,也可以指向自己所在的结构体类型的数据
num Score next 99101 89.5 99103 90 99107 85
isabell
next是struct student类型中的一个成员,它 是 类型中的一个成员, 类型中的一个成员 又指向struct student类型的数据。 类型的数据。 又指向 类型的数据 换名话说: 换名话说:next存放下一个结点的地址 存放下一个结点的地址
15
isabell
头插法的堆栈实现,请同学去改今天的程 序,下周提交和讲解(请同学随机上台讲 解,下面同学打分。占总分中10分,请大 家重视)
ftp://jsjjc.com
Company Logo
isabell
Click to edit company slogan .
isabell
用链表的方法实现堆栈数据( 用链表的方法实现堆栈数据(pushnum) ) 的输出
VC下的错误提示:
‘pt’ uses undefined struct ‘temp’
下面的的呢?
struct temp { int data; struct temp *pt; }
isabell
动态数据结构 结构体声明时不能包含自我,但可以包含指 向本结构体类型的指针变量 链表(Linked table)
struct Link { int data; struct Link *next; next data data } data next
图8-9 链表原理图
head
next
data
NULL
isabell
结构的概念与应用
例:跳马。依下图将每一步跳马之后的位置(x,y)放 跳马。依下图将每一步跳马之后的位置(x,y)放 (x,y) 到一个“结点” 再用“链子穿起来” 到一个“结点”里,再用“链子穿起来”,形成 一条链, 一条链,相邻两结点间用一个指针将两者连到一 起。
6
isabell
结点里的指针是存放下一个结点的地址
Head 1249 1356 1475 1021
1249
A 1356
B 1475
C 1021
D Null
1、链表中的元素称为“结点”,每个结点包括两 链表中的元素称为“结点” 个域:数据域和指针域; 个域:数据域和指针域; 单向链表通常由一个头指针(head), 2、单向链表通常由一个头指针(head),用于指向 链表头; 链表头; 单向链表有一个尾结点, 3、单向链表有一个尾结点,该结点的指针部分指 向一个空结点(NULL) 7 向一个空结点(NULL) 。
11
11.7.2 简单链表
例11.7 isabell
#define NULL 0 struct student 建 { long num; float score; 立 struct student *next; }; 和 main() 输 { struct student a, b, c, *head, *p; 出 a.num=99101; a.score=89.5; 各结点在程序中定义,不是临时开辟的, 各结点在程序中定义,不是临时开辟的, b. num=99103; b.score=90; 始终占有内容不放 这种链表称为“ 不放, 始终占有内容不放,这种链表称为“静 一 态链表” 态链表” 个 c.num=99107 ; c.score=85; 简 head=&a; a.next=&b; b.next=&c; 单 c.next=NULL; 链 p=head; 表 do { printf("%ld %5.1f\n",p->num,p->score); 12 p=p->next; }while(p!=NULL); }
动态性体现为: 动态性体现为: 链表中的元素个数可以根据需要增加和减少, 链表中的元素个数可以根据需要增加和减少,不 像数组,在声明之后就固定不变; 像数组,在声明之后就固定不变; 元素的位置可以变化,即可以从某个位置删除, 元素的位置可以变化,即可以从某个位置删除, 然后再插入到一个新的地方; 然后再插入到一个新的地方;
int pushNum[10] ={111,222,333,444,555,666,777, 888,999,10000}; int popNum[10];
ftp://jsjjc.com
Company Logo
isabell
ftp://jsjjc.com
Company Logo
isabell
头插法 入栈 P=…malloc(); p->next=head; head=p; 出栈: If(head!=NULL) {p=head; head=p->next; 输出} free()
14
3. free 函数
isabell
函数原形: void free(void *p); 作用:释放由 p 指向的内存区。 P: P:是最近一次调用 calloc 或 malloc 函数 时返回的值。 free 函数无返回值 动态分配的存储单元在用完后一定要释放, 否则内存会因申请空间过多引起资源不足 而出现故障。
13
2. calloc 函数
isabell
函数原形:void *calloc(unsigned n,unsigned size); 作用:在内存动态区中分配 n个 长度为size的 连续空间。 函数返回值:指向分配域起始地址的指针 执行失败:返回null 主要用途:为一维数组开辟动态存储空间。n 为数组元素个数,每个元素长度为size
11.7.3 处理动态链表所需的函数
isabell
C 语言使用系统函数动态开辟和释放存储单 元 1.malloc 函数
函数原形:void *malloc(unsigned int size); 函数原形: 作用: 长度为size 作用:在内存的动态存储区中分配 一个 长度为size 的连续空间。 的连续空间。 返回值:是一个指向分配域起始地址的指针( 返回值:是一个指向分配域起始地址的指针(基本 类型void)。 类型void)。 void 执行失败:返回NULL 执行失败:返回NULL
3 2 2 1 4 6
结点 1 0
4
1
2
3
4
5
6
7
8
isabell
依上图有7个结点 依上图有 个结点
(x1,y1)
(x2,y2)
(x6,y6)
(x7,y7)
为了表示这种既有数据又有指针的情况, 为了表示这种既有数据又有指针的情况, 引入源自文库构这种数据类型。 引入结构这种数据类型。
5
isabell
11.7 用指针处理链表 链表是程序设计中一种重要的动态数据 结构, 结构,它是动态地进行存储分配的一种结 构。
isabell
链表
ftp://172.17.72.250 isabelic@163.com
isabell
思考
下面的结构什么意思?
struct temp { int data; struct temp pt; }
TC下的错误提示:
Undefined structure ‘temp’ Structure size too large
链表中结点的定义
isabell
链表是由结点构成的, 关键是定义结点; 链表的结点定义打破了先定义再使用的限制, 即可以用自己定义自己; 递归函数的定义也违反了先定义再使用;
这是C语言程序设计上的两大特例
8
isabell 链表的基本操作
对链表的基本操作有: 对链表的基本操作有: (1)创建链表是指,从无到有地建立起一 )创建链表是指, 个链表, 即往空链表中依次插入若干结点, 个链表 , 即往空链表中依次插入若干结点 , 并保持结点之间的前驱和后继关系。 并保持结点之间的前驱和后继关系。 (2)检索操作是指,按给定的结点索引号 )检索操作是指, 或检索条件,查找某个结点。 或检索条件,查找某个结点。如果找到指 定的结点,则称为检索成功;否则, 定的结点,则称为检索成功;否则,称为 检索失败。 检索失败。 (3)插入操作是指,在结点 i-1与ki之间插 )插入操作是指,在结点k 入一个新的结点k’,使线性表的长度增1, 入一个新的结点 , 使线性表的长度增 , 的逻辑关系发生如下变化: 且ki-1与ki的逻辑关系发生如下变化: 插入前, 的前驱, 的后继; 插入前 , k 是 k 的前驱 , k 是 k 的后继 ;
ftp://jsjjc.com
Company Logo
isabell
(4)删除操作是指,删除结点ki ,使线性 表的长度减1,且ki-1、ki和ki+1之间的逻辑关 系发生如下变化: 删除前,ki是ki+1的前驱、ki-1的后继;删除 后,ki-1成为ki+1的前驱,ki+1成为ki-1的后继. (5)打印输出
10
一个指针类型的成员既可指向其它类型的结构体 数据, 数据,也可以指向自己所在的结构体类型的数据
num Score next 99101 89.5 99103 90 99107 85
isabell
next是struct student类型中的一个成员,它 是 类型中的一个成员, 类型中的一个成员 又指向struct student类型的数据。 类型的数据。 又指向 类型的数据 换名话说: 换名话说:next存放下一个结点的地址 存放下一个结点的地址
15
isabell
头插法的堆栈实现,请同学去改今天的程 序,下周提交和讲解(请同学随机上台讲 解,下面同学打分。占总分中10分,请大 家重视)
ftp://jsjjc.com
Company Logo
isabell
Click to edit company slogan .
isabell
用链表的方法实现堆栈数据( 用链表的方法实现堆栈数据(pushnum) ) 的输出
VC下的错误提示:
‘pt’ uses undefined struct ‘temp’
下面的的呢?
struct temp { int data; struct temp *pt; }
isabell
动态数据结构 结构体声明时不能包含自我,但可以包含指 向本结构体类型的指针变量 链表(Linked table)
struct Link { int data; struct Link *next; next data data } data next
图8-9 链表原理图
head
next
data
NULL
isabell
结构的概念与应用
例:跳马。依下图将每一步跳马之后的位置(x,y)放 跳马。依下图将每一步跳马之后的位置(x,y)放 (x,y) 到一个“结点” 再用“链子穿起来” 到一个“结点”里,再用“链子穿起来”,形成 一条链, 一条链,相邻两结点间用一个指针将两者连到一 起。
6
isabell
结点里的指针是存放下一个结点的地址
Head 1249 1356 1475 1021
1249
A 1356
B 1475
C 1021
D Null
1、链表中的元素称为“结点”,每个结点包括两 链表中的元素称为“结点” 个域:数据域和指针域; 个域:数据域和指针域; 单向链表通常由一个头指针(head), 2、单向链表通常由一个头指针(head),用于指向 链表头; 链表头; 单向链表有一个尾结点, 3、单向链表有一个尾结点,该结点的指针部分指 向一个空结点(NULL) 7 向一个空结点(NULL) 。
11
11.7.2 简单链表
例11.7 isabell
#define NULL 0 struct student 建 { long num; float score; 立 struct student *next; }; 和 main() 输 { struct student a, b, c, *head, *p; 出 a.num=99101; a.score=89.5; 各结点在程序中定义,不是临时开辟的, 各结点在程序中定义,不是临时开辟的, b. num=99103; b.score=90; 始终占有内容不放 这种链表称为“ 不放, 始终占有内容不放,这种链表称为“静 一 态链表” 态链表” 个 c.num=99107 ; c.score=85; 简 head=&a; a.next=&b; b.next=&c; 单 c.next=NULL; 链 p=head; 表 do { printf("%ld %5.1f\n",p->num,p->score); 12 p=p->next; }while(p!=NULL); }
动态性体现为: 动态性体现为: 链表中的元素个数可以根据需要增加和减少, 链表中的元素个数可以根据需要增加和减少,不 像数组,在声明之后就固定不变; 像数组,在声明之后就固定不变; 元素的位置可以变化,即可以从某个位置删除, 元素的位置可以变化,即可以从某个位置删除, 然后再插入到一个新的地方; 然后再插入到一个新的地方;
int pushNum[10] ={111,222,333,444,555,666,777, 888,999,10000}; int popNum[10];
ftp://jsjjc.com
Company Logo
isabell
ftp://jsjjc.com
Company Logo
isabell
头插法 入栈 P=…malloc(); p->next=head; head=p; 出栈: If(head!=NULL) {p=head; head=p->next; 输出} free()
14
3. free 函数
isabell
函数原形: void free(void *p); 作用:释放由 p 指向的内存区。 P: P:是最近一次调用 calloc 或 malloc 函数 时返回的值。 free 函数无返回值 动态分配的存储单元在用完后一定要释放, 否则内存会因申请空间过多引起资源不足 而出现故障。
13
2. calloc 函数
isabell
函数原形:void *calloc(unsigned n,unsigned size); 作用:在内存动态区中分配 n个 长度为size的 连续空间。 函数返回值:指向分配域起始地址的指针 执行失败:返回null 主要用途:为一维数组开辟动态存储空间。n 为数组元素个数,每个元素长度为size
11.7.3 处理动态链表所需的函数
isabell
C 语言使用系统函数动态开辟和释放存储单 元 1.malloc 函数
函数原形:void *malloc(unsigned int size); 函数原形: 作用: 长度为size 作用:在内存的动态存储区中分配 一个 长度为size 的连续空间。 的连续空间。 返回值:是一个指向分配域起始地址的指针( 返回值:是一个指向分配域起始地址的指针(基本 类型void)。 类型void)。 void 执行失败:返回NULL 执行失败:返回NULL
3 2 2 1 4 6
结点 1 0
4
1
2
3
4
5
6
7
8
isabell
依上图有7个结点 依上图有 个结点
(x1,y1)
(x2,y2)
(x6,y6)
(x7,y7)
为了表示这种既有数据又有指针的情况, 为了表示这种既有数据又有指针的情况, 引入源自文库构这种数据类型。 引入结构这种数据类型。
5
isabell
11.7 用指针处理链表 链表是程序设计中一种重要的动态数据 结构, 结构,它是动态地进行存储分配的一种结 构。
isabell
链表
ftp://172.17.72.250 isabelic@163.com
isabell
思考
下面的结构什么意思?
struct temp { int data; struct temp pt; }
TC下的错误提示:
Undefined structure ‘temp’ Structure size too large
链表中结点的定义
isabell
链表是由结点构成的, 关键是定义结点; 链表的结点定义打破了先定义再使用的限制, 即可以用自己定义自己; 递归函数的定义也违反了先定义再使用;
这是C语言程序设计上的两大特例
8
isabell 链表的基本操作
对链表的基本操作有: 对链表的基本操作有: (1)创建链表是指,从无到有地建立起一 )创建链表是指, 个链表, 即往空链表中依次插入若干结点, 个链表 , 即往空链表中依次插入若干结点 , 并保持结点之间的前驱和后继关系。 并保持结点之间的前驱和后继关系。 (2)检索操作是指,按给定的结点索引号 )检索操作是指, 或检索条件,查找某个结点。 或检索条件,查找某个结点。如果找到指 定的结点,则称为检索成功;否则, 定的结点,则称为检索成功;否则,称为 检索失败。 检索失败。 (3)插入操作是指,在结点 i-1与ki之间插 )插入操作是指,在结点k 入一个新的结点k’,使线性表的长度增1, 入一个新的结点 , 使线性表的长度增 , 的逻辑关系发生如下变化: 且ki-1与ki的逻辑关系发生如下变化: 插入前, 的前驱, 的后继; 插入前 , k 是 k 的前驱 , k 是 k 的后继 ;
ftp://jsjjc.com
Company Logo