C语言-链表(课堂PPT)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C 程序设计
第十一章 结构体与共用体 NWPU—CC—ZhangYanChun
3
3) 节点的构成 上图每个节点具有如下结构体类型:
struct student { long num;
float score; structer student *next; }; /*链节成员*/
其中: 成员num、score用于存放一个节点的具体数据;
分配;如在链表中插入节点需要先申请一段存储 区域,而删除一个节点需要释放该节点原先占用 的存储区域,这可由标准函数实现。
内存分配函数原形: void *malloc(unsigned size); 功能:申请长度为size个字节的内存空间;若申请
成功,返回存储块起始指针,该指针类型为
void *;否则返回空指针(NULL)。
int i, len; sqrt(5.5);
scanf("%ld,%f", &p1->num, &p1->score);
p2->next=p1; p2=p1;
/*使p2也指向新节点*/
C 程序设计
第十一章 结构体与共用体 NWPU—CC—ZhangYanChun
10
3) 重复第2步,建立并链接多个节点直至所需长 度,将末尾节点的next成员赋值0。
在链表中插入或删除一个节点,只需改变某节 点“链节”成员的指向,而不需要移动其它节点, 相对数组元素的插入和删除效率高。
即:链表特别适合于对大线性表频繁插入和删除 元素、或成员数目不定的数据结构。
C 程序设计
第十一章 结构体与共用体 NWPU—CC—ZhangYanChun
6
6) 链表的类型 单链表:每个节点只有一个指向后继节点的指针 双向链表:每个节点有两个用于指向其它节点的指 针;一个指向前趋节点,一个指向后继节点 循环链表:使最后一个节点的指针指向第一个节点
第十一章 结构体与共用体 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;
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-Hale Waihona Puke Baidunext=NULL;
C 程序设计
第十一章 结构体与共用体 NWPU—CC—ZhangYanChun
7
2. 单链表的建立和输出
建立链表的准备工作: 1) 定义链表的节点类型; 2) 定义与节点同类型的链表头指针变量head并赋
值0,表示链表在建立之前是空的; 3) 定义与节点同类型的工作指针变量p1、p2。
C 程序设计
成员next是指针类型,用于存放下一节点指针, 最后一个节点的next 成员存放空指针NULL;
成员next是指向与自身同一类型的结构,这种结 构称为自引用结构。(只有指针成员可自引用)
节点是在运行时动态生成的。
C 程序设计
第十一章 结构体与共用体 NWPU—CC—ZhangYanChun
4
4) 动态内存分配和释放 建立和维护动态数据结构需要实现动态内存
第十一章 结构体与共用体 NWPU—CC—ZhangYanChun
2
2) 链表的构成 单向链表图示:
head 1048
1048 2101 89.5 1370
头节点
1370
1012
2304
2918
90
85
1012
NULL
表内节点
尾节点
其中: 各节点是相同的结构体类型,该类型有三个成员; head是指针变量,存放链表的头节点指针1048; 各节点应包含一个指针成员存放下一节点的地址; 各节点存储有可能不连续,但各节点逻辑上连续。
1
11.7 用指针处理链表
1. 链表概述
1) 动态数据结构概念 数组和结构体是定长数据结构,而链表、堆
栈、队列、树、图等是执行时大小可变的动态数 据结构。
链表是连成一行的数据项集合,每一个数据 项(元素)称为节点,可以在链表中的任意位置进 行节点插入或删除操作,使链表数据项的个数随 之增加或减少。
C 程序设计
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);
/*使p2也指向新节点*/ /*末尾节点next赋值0*/
C 程序设计
第十一章 结构体与共用体 NWPU—CC—ZhangYanChun
11
【例】建立并输出有3名学生数据的单链表。
#include <stdio.h> #include <math.h> #define N 3 struct student { long num;
float score; struct student *next; }; void main( ) {┇ }
/*包含NULL的定义*/ /*结构体类型定义*/ /*自引用结构体指针*/
C 程序设计
第十一章 结构体与共用体 NWPU—CC—ZhangYanChun
12
void main( )
{ struct student *head, *p1, *p2;
内存释放函数原形:void free(void *p); 功能:释放p所指向的内存块。
包含文件:malloc.h、stdlib.h中均有其原型声明。
C 程序设计
第十一章 结构体与共用体 NWPU—CC—ZhangYanChun
5
5) 采用链表的意义
与定长数据结构数组相比,链表能更好地利用 内存,按需分配和释放存储空间。