C语言-链表(课堂PPT)
合集下载
C语言程序设计实用教程_第15章链表PPT教学课件
《C语言程序设计实用教程》
第15章 链表
Power point
1
2020/12/10
1
主要内容及难点
2
2020/12/10
2
概述
当需要动态地减少或增加数据项时,可以使用链 表这种数据结构。
链表是由若干个称作节点的数据项组成的一种数 据结构,每个节点含有一个数据和下一个节点的地址 (单链表),或含有一个数据并含有上一个节点和下 一个节点的地址(双链表)。
8
2020/12/10
8
15.3 头插法创建链表 _2
例子2(example15_2.c)使用头插法建立
了具有6个节点的链表,并输出了链表节点中 的数据 。
9
2020/12/10
9
15.4 尾插法创建链表
尾插法建立链表就是每次向链表添加的新节点将作为链表的尾节点。 尾插法的步骤如下: 1.创建一个新节点newNode,代码如下:
如果链表的节点是用malloc函数分配的内存,那么就可以使用free函数 释放该节点的内存。这样的链表也被称作动态链表。
6
2020/12/10
6
15.2.3 创建一个简单的链表
创建有3个节点的链表,步骤如下: 1.创建一个空链表head 2.添加第1个节点nodeOne 3.添加第2个节点nodeTwo 4.添加最后一个节点nodeThree。
这些变量在当前节点中所占有的内存称作节点的数据域。
4
2020/12/10
4
15.2 链表与节点
15.2.1 空链表
本节使用的结构体类型如下: typedef struct Peoson { int number; char * name; struct Peoson * next; } PERSON;
第15章 链表
Power point
1
2020/12/10
1
主要内容及难点
2
2020/12/10
2
概述
当需要动态地减少或增加数据项时,可以使用链 表这种数据结构。
链表是由若干个称作节点的数据项组成的一种数 据结构,每个节点含有一个数据和下一个节点的地址 (单链表),或含有一个数据并含有上一个节点和下 一个节点的地址(双链表)。
8
2020/12/10
8
15.3 头插法创建链表 _2
例子2(example15_2.c)使用头插法建立
了具有6个节点的链表,并输出了链表节点中 的数据 。
9
2020/12/10
9
15.4 尾插法创建链表
尾插法建立链表就是每次向链表添加的新节点将作为链表的尾节点。 尾插法的步骤如下: 1.创建一个新节点newNode,代码如下:
如果链表的节点是用malloc函数分配的内存,那么就可以使用free函数 释放该节点的内存。这样的链表也被称作动态链表。
6
2020/12/10
6
15.2.3 创建一个简单的链表
创建有3个节点的链表,步骤如下: 1.创建一个空链表head 2.添加第1个节点nodeOne 3.添加第2个节点nodeTwo 4.添加最后一个节点nodeThree。
这些变量在当前节点中所占有的内存称作节点的数据域。
4
2020/12/10
4
15.2 链表与节点
15.2.1 空链表
本节使用的结构体类型如下: typedef struct Peoson { int number; char * name; struct Peoson * next; } PERSON;
C语言链表课件
return counter;
}//Count_LinkList
Void ChangeLinkList(LinkList &L) { LinkList p, q, s, r, t; q=null; r=L; t=null; //r指示原表的表尾,q是临时表 的表头指针,t指示临时表的表尾,p指示当前正在处理的结点 p=L→next; while(p) { if(p→data %2 == 1) { // p结点是奇数结点 s = p; r→next = p→next; //从原表中删除奇 数结点 s→data = s→data + 1; s→next = null; if(!q) { q = s; t = s ; } //在临时表中插入第一 个结点 else { t→next = s; t = s; } }//if else r = r→next; p = p→next; //处理下一个结点 }//while r→next=q; //将临时表链接到原表之后 }//ChangeLinkList
链表
结点(数据元素) = 元素(数据元素的映象) + 指针(指示后继元素存储位置) 结点 元素(data) 指针(next)
用一组地址任意的存储单元存放线性表中的数据元素。
链表:以“结点的序列”表示线性表
使用内存分配函数,动态申请和释放堆中的存储空间。
P124
struct node{//定义节点类型 int data; node * next; };
void main( ) { node * h; h=CreList( ); PrintList(h); }
node *CreList()
{node A_node; node *head; //首地址 node* s; //当前结点 head = NULL; printf("\n Please input the number ( 0 the end):\t"); scanf("%d",&A_node.data);
C程序设计2-第五讲-链表 PPT课件
2
main() {
struct BuJian xsq,yp,cpu,nc,jx; int ZongJiaGe; FILE * fp; fp = fopen("e:\\a.txt","r"); fscanf(fp,"%s %s %d",xsq.PinPai,xsq.XingHao,&xsq.JiaGe); fscanf(fp,"%s %s %d",yp.PinPai,yp.XingHao,&yp.JiaGe); fscanf(fp,"%s %s %d",cpu.PinPai,cpu.XingHao,&cpu.JiaGe); fscanf(fp,"%s %s %d",nc.PinPai,nc.XingHao,&nc.JiaGe); fscanf(fp,"%s %s %d",jx.PinPai,jx.XingHao,&jx.JiaGe); fclose(fp);
3
ZongJiaGe = xsq.JiaGe + yp.JiaGe + cpu.JiaGe + nc.JiaGe + jx.JiaGe ;
fp = fopen("e:\\b.txt","w");
fprint(fp,"%s %s %d\n",xsq.PinPai,xsq.XingHao,xsq.JiaGe); fprint(fp,"%s %s %d\n",yp.PinPai,yp.XingHao,yp.JiaGe); fprint(fp,"%s %s %d\n",cpu.PinPai,cpu.XingHao,cpu.JiaGe); fprint(fp,"%s %s %d\n",nc.PinPai,nc.XingHao,nc.JiaGe); fprint(fp,"%s %s %d\n",jx.PinPai,jx.XingHao,jx.JiaGe);
main() {
struct BuJian xsq,yp,cpu,nc,jx; int ZongJiaGe; FILE * fp; fp = fopen("e:\\a.txt","r"); fscanf(fp,"%s %s %d",xsq.PinPai,xsq.XingHao,&xsq.JiaGe); fscanf(fp,"%s %s %d",yp.PinPai,yp.XingHao,&yp.JiaGe); fscanf(fp,"%s %s %d",cpu.PinPai,cpu.XingHao,&cpu.JiaGe); fscanf(fp,"%s %s %d",nc.PinPai,nc.XingHao,&nc.JiaGe); fscanf(fp,"%s %s %d",jx.PinPai,jx.XingHao,&jx.JiaGe); fclose(fp);
3
ZongJiaGe = xsq.JiaGe + yp.JiaGe + cpu.JiaGe + nc.JiaGe + jx.JiaGe ;
fp = fopen("e:\\b.txt","w");
fprint(fp,"%s %s %d\n",xsq.PinPai,xsq.XingHao,xsq.JiaGe); fprint(fp,"%s %s %d\n",yp.PinPai,yp.XingHao,yp.JiaGe); fprint(fp,"%s %s %d\n",cpu.PinPai,cpu.XingHao,cpu.JiaGe); fprint(fp,"%s %s %d\n",nc.PinPai,nc.XingHao,nc.JiaGe); fprint(fp,"%s %s %d\n",jx.PinPai,jx.XingHao,jx.JiaGe);
《C语言链表》课件
了解如何删除链表中的指定节点
详细描述
删除链表中的节点需要找到要删除的节点,修改其前一个节点的指针,使其指向要删除节点的下一个 节点,然后将要删除节点的指针置为NULL。如果要删除的是头节点或尾节点,还需要对头指针或尾 指针进行相应的修改。
遍历链表
总结词
了解如何遍历链表中的所有节点
VS
详细描述
遍历链表需要从头节点开始,依次访问每 个节点,直到达到链表的尾部。在遍历过 程中,可以使用一个指针变量来指向当前 节点,每次循环将指针向后移动一个节点 ,即修改指针的next指针。
链表和循环链表的主要区别在于它们的最后一个节点指向的方向。在链表中,最后一个节点指向NULL; 而在循环链表中,最后一个节点指向第一个节点。循环链表具有更好的性能,但实现起来相对复杂一些 。
05
总结与展望
总结链表的重要性和应用场景
总结1
链表作为C语言中一种基本的数据结构,在计算机科学中 有着广泛的应用。通过学习链表,可以更好地理解数据 结构的基本概念,提高编程能力和解决实际问题的能力 。
详细描述
合并两个有序链表可以通过比较两个链表的 节点值来实现。从头节点开始比较,将较小 的节点添加到结果链表中,并将指针向后移 动。重复此过程直到其中一个链表为空。如 果还有剩余的节点,将其添加到结果链表的 末尾。这种方法的时间复杂度为O(n),其中
n为两个链表中节点的总数。
04
常见错误与注意事项
内存泄漏问题
内存泄漏定义
在C语言中,内存泄漏是指在使用动 态内存分配函数(如malloc、calloc 、realloc等)分配内存后,未能正确 释放这些内存,导致程序运行过程中 不断占用越来越多的内存,最终可能 导致程序崩溃或性能下降。
详细描述
删除链表中的节点需要找到要删除的节点,修改其前一个节点的指针,使其指向要删除节点的下一个 节点,然后将要删除节点的指针置为NULL。如果要删除的是头节点或尾节点,还需要对头指针或尾 指针进行相应的修改。
遍历链表
总结词
了解如何遍历链表中的所有节点
VS
详细描述
遍历链表需要从头节点开始,依次访问每 个节点,直到达到链表的尾部。在遍历过 程中,可以使用一个指针变量来指向当前 节点,每次循环将指针向后移动一个节点 ,即修改指针的next指针。
链表和循环链表的主要区别在于它们的最后一个节点指向的方向。在链表中,最后一个节点指向NULL; 而在循环链表中,最后一个节点指向第一个节点。循环链表具有更好的性能,但实现起来相对复杂一些 。
05
总结与展望
总结链表的重要性和应用场景
总结1
链表作为C语言中一种基本的数据结构,在计算机科学中 有着广泛的应用。通过学习链表,可以更好地理解数据 结构的基本概念,提高编程能力和解决实际问题的能力 。
详细描述
合并两个有序链表可以通过比较两个链表的 节点值来实现。从头节点开始比较,将较小 的节点添加到结果链表中,并将指针向后移 动。重复此过程直到其中一个链表为空。如 果还有剩余的节点,将其添加到结果链表的 末尾。这种方法的时间复杂度为O(n),其中
n为两个链表中节点的总数。
04
常见错误与注意事项
内存泄漏问题
内存泄漏定义
在C语言中,内存泄漏是指在使用动 态内存分配函数(如malloc、calloc 、realloc等)分配内存后,未能正确 释放这些内存,导致程序运行过程中 不断占用越来越多的内存,最终可能 导致程序崩溃或性能下降。
C语言链表详解PPT课件
撤消原来的链接关系。 两种情况: 1、要删的结点是头指针所指的结点则直接操作; 2、不是头结点,要依次往下找。 另外要考虑:空表和找不到要删除的结点
26
链表中结点删除
需要由两个临时指针: P1: 判断指向的结点是不是要删除的结点 (用于寻找); P2: 始终指向P1的前面一个结点;
27
图 11.19
4
结点里的指针是存放下一个结点的地址
Head
1249
1249
A 1356
1356
B 1475
1475
C 1021
1021
D Null
1、链表中的元素称为“结点”,每个结点包括两 个域:数据域和指针域;
2、单向链表通常由一个头指针(head),用于指 向链表头;
3、单向链表有一个尾结点,该结点的指针部分指
7
(4)删除操作是指,删除结点ki,使线性表的长度 减1,且ki-1、ki和ki+1之间的逻辑关系发生如下变 化:
删除前,ki是ki+1的前驱、ki-1的后继;删除后,ki-1 成为ki+1的前驱,ki+1成为ki-1的后继.
(5)打印输出
8
一个指针类型的成员既可指向其它类型的结构体数 据,也可以指向自己所在的结构体类型的数据
(x7,y7)
为了表示这种既有数据又有指针的情况, 引入结构这种数据类型。
3
11.7 用指针处理链表
链表是程序设计中一种重要的动态数据结构, 它是动态地进行存储分配的一种结构。
动态性体现为: 链表中的元素个数可以根据需要增加和减少,不 像数组,在声明之后就固定不变;
元素的位置可以变化,即可以从某个位置删除, 然后再插入到一个新的地方;
26
链表中结点删除
需要由两个临时指针: P1: 判断指向的结点是不是要删除的结点 (用于寻找); P2: 始终指向P1的前面一个结点;
27
图 11.19
4
结点里的指针是存放下一个结点的地址
Head
1249
1249
A 1356
1356
B 1475
1475
C 1021
1021
D Null
1、链表中的元素称为“结点”,每个结点包括两 个域:数据域和指针域;
2、单向链表通常由一个头指针(head),用于指 向链表头;
3、单向链表有一个尾结点,该结点的指针部分指
7
(4)删除操作是指,删除结点ki,使线性表的长度 减1,且ki-1、ki和ki+1之间的逻辑关系发生如下变 化:
删除前,ki是ki+1的前驱、ki-1的后继;删除后,ki-1 成为ki+1的前驱,ki+1成为ki-1的后继.
(5)打印输出
8
一个指针类型的成员既可指向其它类型的结构体数 据,也可以指向自己所在的结构体类型的数据
(x7,y7)
为了表示这种既有数据又有指针的情况, 引入结构这种数据类型。
3
11.7 用指针处理链表
链表是程序设计中一种重要的动态数据结构, 它是动态地进行存储分配的一种结构。
动态性体现为: 链表中的元素个数可以根据需要增加和减少,不 像数组,在声明之后就固定不变;
元素的位置可以变化,即可以从某个位置删除, 然后再插入到一个新的地方;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
内存释放函数原形:void free(void *p); 功能:释放p所指向的内存块。
包含文件:malloc.h、stdlib.h中均有其原型声明。
C 程序设计
第十一章 结构体与共用体 NWPU—CC—ZhangYanChun
5
5) 采用链表的意义
与定长数据结构数组相比,链表能更好地利用 内存,按需分配和释放存储空间。
head
1048 p1 2101
1370 p1 2304
1012
2918
89.5
90
85
操作:
1370
1012
NULL
pp22
p2
p1=(struct student *)malloc(len); scanf("%ld,%f", &p1->num, &p1->score);
p2->next=p1; p2=p1; p2->next=NULL;
/*使p2也指向新节点*/ /*末尾节点next赋值0*/
C 程序设计
第十一章 结构体与共用体 NWPU—CC—ZhangYanChun
11
【例】建立并输出有3名学生数据的单链表。
#include <stdio.h> #include <math.h> #define N 3 struct student { long num;
int i, len; sqrt(5.5);
float score; struct student *next; }; void main( ) {┇ }
/*包含NULL的定义*/ /*结构体类型定义*/ /*自引用结构体指针*/
C 程序设计
第十一章 结构体与共用体 NWPU—CC—ZhangYanChun
12
void main( )
{ struct student *head, *p1, *p2;
1
11.7 用指针处理链表
1. 链表概述
1) 动态数据结构概念 数组和结构体是定长数据结构,而链表、堆
栈、队列、树、图等是执行时大小可变的动态数 据结构。
链表是连成一行的数据项集合,每一个数据 项(元素)称为节点,可以在链表中的任意位置进 行节点插入或删除操作,使链表数据项的个数随 之增加或减少。
C 程序设计
C 程序设计
第十一章 结构体与共用体 NWPU—CC—ZhangYanChun
3
3) 节点的构成 上图每个节点具有如下结构体类型:
struct student { long num;
float score; structer student *next; }; /*链节成员*/
其中: 成员num、score用于存放一个节点的具体数据;
在链表中插入或删除一个节点,只需改变某节 点“链节”成员的指向,而不需要移动其它节点, 相对数组元素的插入和删除效率高。
即:链表特别适合于对大线性表频繁插入和删除 元素、或成员数目不定的数据结构。
C 程序设计
第十一章 结构体与共用体 NWPU—C单链表:每个节点只有一个指向后继节点的指针 双向链表:每个节点有两个用于指向其它节点的指 针;一个指向前趋节点,一个指向后继节点 循环链表:使最后一个节点的指针指向第一个节点
第十一章 结构体与共用体 NWPU—CC—ZhangYanChun
8
建立链表的步骤:
1) 开辟第一个节点的存储区域,使head、p1、p2 指向第一个节点,并输入第一个节点数据;
head p1 p2
2101 89.5
操作: len=sizeof(struct student); p1=(struct student *)malloc(len); scanf("%ld,%f", &p1->num, &p1->score); head=p2=p1;
分配;如在链表中插入节点需要先申请一段存储 区域,而删除一个节点需要释放该节点原先占用 的存储区域,这可由标准函数实现。
内存分配函数原形: void *malloc(unsigned size); 功能:申请长度为size个字节的内存空间;若申请
成功,返回存储块起始指针,该指针类型为
void *;否则返回空指针(NULL)。
C 程序设计
第十一章 结构体与共用体 NWPU—CC—ZhangYanChun
7
2. 单链表的建立和输出
建立链表的准备工作: 1) 定义链表的节点类型; 2) 定义与节点同类型的链表头指针变量head并赋
值0,表示链表在建立之前是空的; 3) 定义与节点同类型的工作指针变量p1、p2。
C 程序设计
第十一章 结构体与共用体 NWPU—CC—ZhangYanChun
2
2) 链表的构成 单向链表图示:
head 1048
1048 2101 89.5 1370
头节点
1370
1012
2304
2918
90
85
1012
NULL
表内节点
尾节点
其中: 各节点是相同的结构体类型,该类型有三个成员; head是指针变量,存放链表的头节点指针1048; 各节点应包含一个指针成员存放下一节点的地址; 各节点存储有可能不连续,但各节点逻辑上连续。
C 程序设计
第十一章 结构体与共用体 NWPU—CC—ZhangYanChun
9
2) 开辟下一节点的存储区域,使p1指向新节点、
输入新节点数据,并将上一个节点的next成员
指向新节点;
1048 p1
head
2101
1370
2304
p1
89.5
90
p2
操作:
1370 p2
p1=(struct student *)malloc(len);
成员next是指针类型,用于存放下一节点指针, 最后一个节点的next 成员存放空指针NULL;
成员next是指向与自身同一类型的结构,这种结 构称为自引用结构。(只有指针成员可自引用)
节点是在运行时动态生成的。
C 程序设计
第十一章 结构体与共用体 NWPU—CC—ZhangYanChun
4
4) 动态内存分配和释放 建立和维护动态数据结构需要实现动态内存
scanf("%ld,%f", &p1->num, &p1->score);
p2->next=p1; p2=p1;
/*使p2也指向新节点*/
C 程序设计
第十一章 结构体与共用体 NWPU—CC—ZhangYanChun
10
3) 重复第2步,建立并链接多个节点直至所需长 度,将末尾节点的next成员赋值0。