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;
课件-链表用法-全
} 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; }
建立链表过程
初始状态 读入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语言版高等教育经典课件无师自通从零开始
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,形 成循环链表。
《数据结构》在线开放课程
谢 谢!
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语言链表》课件
了解如何删除链表中的指定节点
详细描述
删除链表中的节点需要找到要删除的节点,修改其前一个节点的指针,使其指向要删除节点的下一个 节点,然后将要删除节点的指针置为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)。
}
单链表的插入
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
单链表的插入
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