C语言-链表(课堂PPT)

合集下载

C语言程序设计实用教程_第15章链表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;

C语言链表课件

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课件

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);

《C语言链表》课件

《C语言链表》课件
了解如何删除链表中的指定节点
详细描述
删除链表中的节点需要找到要删除的节点,修改其前一个节点的指针,使其指向要删除节点的下一个 节点,然后将要删除节点的指针置为NULL。如果要删除的是头节点或尾节点,还需要对头指针或尾 指针进行相应的修改。
遍历链表
总结词
了解如何遍历链表中的所有节点
VS
详细描述
遍历链表需要从头节点开始,依次访问每 个节点,直到达到链表的尾部。在遍历过 程中,可以使用一个指针变量来指向当前 节点,每次循环将指针向后移动一个节点 ,即修改指针的next指针。
链表和循环链表的主要区别在于它们的最后一个节点指向的方向。在链表中,最后一个节点指向NULL; 而在循环链表中,最后一个节点指向第一个节点。循环链表具有更好的性能,但实现起来相对复杂一些 。
05
总结与展望
总结链表的重要性和应用场景
总结1
链表作为C语言中一种基本的数据结构,在计算机科学中 有着广泛的应用。通过学习链表,可以更好地理解数据 结构的基本概念,提高编程能力和解决实际问题的能力 。
详细描述
合并两个有序链表可以通过比较两个链表的 节点值来实现。从头节点开始比较,将较小 的节点添加到结果链表中,并将指针向后移 动。重复此过程直到其中一个链表为空。如 果还有剩余的节点,将其添加到结果链表的 末尾。这种方法的时间复杂度为O(n),其中
n为两个链表中节点的总数。
04
常见错误与注意事项
内存泄漏问题
内存泄漏定义
在C语言中,内存泄漏是指在使用动 态内存分配函数(如malloc、calloc 、realloc等)分配内存后,未能正确 释放这些内存,导致程序运行过程中 不断占用越来越多的内存,最终可能 导致程序崩溃或性能下降。

C语言链表详解PPT课件

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 用指针处理链表
链表是程序设计中一种重要的动态数据结构, 它是动态地进行存储分配的一种结构。
动态性体现为: 链表中的元素个数可以根据需要增加和减少,不 像数组,在声明之后就固定不变;
元素的位置可以变化,即可以从某个位置删除, 然后再插入到一个新的地方;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。
相关文档
最新文档