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;

课件-链表用法-全

课件-链表用法-全
} return head ; }
建立链表过程
初始状态 读入1后
head NULL
head
tail NULL
temp NULL
tail temp
1 NULL
建立链表过程
读入2后 head
1
读入3后
hea d
1
tail tem p
2 NULL
tail
tem p
2
3
NULL
9.2.2 单向链表的操作
9.2.2 单向链表的操作
建立单向链表
声明一个链首指针变量head,并赋初值 NULL(包含0个节点的链表)
动态分配一个新节点,将该节点链入链尾 重复上一步
例子1:建立链表,读入n个整数,每 个整数作为一个新结点插入到链尾
#include <iostream.h> struct node {
ቤተ መጻሕፍቲ ባይዱ
例子3:编写一个函数,在例1的链表 中查找包含指定整数的节点
node * findData(int n, node * head) {
node *curNode = head; while ( curNode ) {
if ( curNode->data == n) { cout<<"Find "<<n<<" in the list."<<endl; return curNode;
原链头节点的前驱指针指向新节点 新节点的后继指针指向原链头节点 新链头节点的前驱指针置为空指针
例子6:编写一个函数,按数据输入 的顺序建立双向链表
node *createBidirList (int n) { node *temp, *tail = NULL, *head = NULL ; int num; cin >> num; head = new node ; // 为新节点动态分配内存 if (head == NULL){ cout << "No memory available!"; return NULL; } else { head->data = num; head->next = NULL; head->pre = NULL; tail = head; }

第2章循环链表数据结构C语言版高等教育经典课件无师自通从零开始

第2章循环链表数据结构C语言版高等教育经典课件无师自通从零开始
01 循环链表的实例演示 02 循环链表的建立过程 03 循环链表的程序设计
11.顺序循栈环实链例表演的示实例演示
12.顺序循栈环实链例表演的示建立过程
核心算法 //寻找到链表最后的一个结点。 //最后的结点的指针域指向头结点。
O
O
O
head p
O^
13.顺序循栈环实链例表演的示程序设计
程序编写 void crelink(ListNode *head) {
ListNode *p=head; while(p->next!=NULL)
p=p->next; p->next=head;
}பைடு நூலகம்
指针p用于寻找尾结点, 初始化指向head。
只要p的下一个结点不等 于空,p指向下一个结点。
p的指针域指向head,形 成循环链表。
《数据结构》在线开放课程
谢 谢!

《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)。
}
单链表的插入
9
3、链表的插入(头指针的情况下)
对于插入有以下几种情况 在一个空链表上插入一个元素。 (即要插入位置前方和后方均无元素) 从链表表头处插入一个元素 (即要插入的位置前方无元素,后方有元素) 从链表结尾处处插入一个元素 (即要插入的位置后方五元素,前方有元素) 从链表的中间插入 (即要插入的位置前方和后方均有元素) 其中第三种情况可以按照第四种情况处理,但有一定特殊性所以将 其分开 注意:产生新的节点必须用malloc或者calloc开辟空间
... NULL
4、链表的建立
链表的建立就是链表从无到有的过程 建立一个头节点,并指向NULL,就建立了一个空的链 表
建立有n个元素的链表有三个阶段 建立头节点并指向NULL(建立了一个空的链表) 插入第一个元素(插入的第一种情况) 在表头或者表尾连续插入其他n-1个元素 (反复执行插入的第二,第三种情况)
在空链表上插入一个元素
p
data
h
p
h
data
NULL
实现的语句:
p->next=NULL; h=p;
在链表的表头插入一个元素
p
data
h
... NULL
p
data
h
... NULL
p
data
h
... NULL
完成插入后 表头指针要指向新的表头节点 实现的语句:
p->next=h; h=p;
在链表结尾出插入一个元素
在链表结尾出插入一个元素
p
data
首先要用一个循环语句找到q
q
q=h;
h
...
NULL
while(q->next!=NULL)
q=q->next;
p
然后执行插入语句:
data
p->next=NULL;
q
q->next=p;
h
...
NULL
p
data
q
h
...
NULL
在链表中间插入一个元素
pห้องสมุดไป่ตู้
data
指针字段,数据字段表示元素的本身信息,指针字段指明下个元素的 位置。单链表用来表示线性结构。例如线性表(a1,a2,…,an)可以表 示为:
head
a1
a2
……
an /\
C语言定义链表的结构如下 typedef struct Node {
int data; struct Node * next; }NODE;
科学 和谐 创新 自主
C语言链表
王艳春
单链表
2
单链表
单链表的定义 单链表的基本操作
遍历(递归和非递归遍历) 插入(插入4种情况,重点) 建立 删除 将一个链表排序 将两个有序链表合并 将一个链表逆置 约瑟夫问题
1、单链表的定义
最简单的是单链表,单链表中每个节点由两个字段组成:数据字段和
q
o
h ...
p
data
q
o
h ...
p
data
q h ...
... NULL ... NULL
假如被插入位置的后方特征是
数据项为x 则可以执行循环语句
q=h; while(q->next->data!=x) {
q=q-next; } 确保找到被插入地方的前方节点q ,然后执行插入语句: p->next=q->next; q->next=p; 注意语句顺序
建立带有单独头节点的链表,先建立头节点
struct Node* create() { struct Node *head,*p,*q; int n; head=(struct Node *)malloc(sizeof(struct Node)); head->next=NULL; //第一阶段,建立一个头节点,并指向NULL p=head; while(1) { printf("请输入一个正整数,0代表结束:"); scanf("%d",&n); if (n<=0) break; else { q=(struct Node *) malloc(sizeof(struct Node)); q->data=n;//产生要插入的节点 p->next=q;//执行插入的过程,第一次插入的时候p=head所以就是head>next=q; q->next=NULL; p=q; } } return head;
void lprint (NODE *head) { if(head!=NULL) { printf(“%d\t”,head->data); lprint(head->next);
} 许多问题中,有时候为了操作方便,需要在第一个节点之前增加一个
特殊的节点,称为头节点,它的data字段不含信息或根据问题的需 要存放特殊信息。
h
q
... p
data
h
q
...
p
data
h
q
...
这种情况不涉及头节点的变动 假如被插入位置的后方特征是 数据项为x 则可以执行循环语句 ... NULL q=h; while(q->next->data!=x) {
q=q-next; } 确保找到被插入地方的前方节点q ... NULL ,然后执行插入语句: p->next=q->next; q->next=p; 注意语句顺序
2、链表的遍历(显示链表)
一个非递归算法
以下函数disp()用于显示头节点为*h的链表的所有节点 数据域。
void disp(struct Node *h) { struct Node *p=h; printf("输出链表:"); if(p==NULL) printf("空表\n"); else { while (p->next!=NULL) { printf("%4d",p->data); p=p->next; } printf("%4d\n",p->data); }
带有头节点的单链表
一般各种资料表示链表有两种,一种是带头节点的,一种 是使用头指针的(不带头节点的)。
带头节点的 就是有一个专门的头节点h,它的后继指向链表的第一 个元素。
使用头指针的 没有专门的头节点,只有一个指针h指向链表的第一个 元素
单链表的遍历
6
2、链表的遍历(显示链表)
设head为链表的头指针,首先从head所指的节点开始打印,沿着链 的方向向右遍历,直到到最后一个节点,下面是一个打印链表的递归 函数。
... NULL
3、链表的插入(有单独头节点的情况下)
由于增加了表头节点,不用象没有头节点的情况时, 区分是否插入点在表头,所以对于插入只有两种情况 从链表结尾处处插入一个元素 (即要插入的位置后方五元素,前方有元素) 从链表的中间插入 (即要插入的位置前方和后方均有元素) 其中第一种情况可以按照第二种情况处理,但有一定 特殊性(语句的顺序可以换)所以将其分开
p
data
h
q
...
NULL
p
data
h
q
...
NULL
不涉及头节点的变动 首先要用一个循环语句找到q q=h; while(q->next!=NULL)
q=q->next; 然后执行插入语句:
q->next=p; p->next=NULL;
p
data
NULL
h
q
...
在链表中间插入一个元素
p
data
相关文档
最新文档