无头节点的链表
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
p = p->next;
}
}
许多问题中,有时候为了操作方便,需要在第一个节点之前增加一个
特殊的节点,称为头节点,它的data字段不含信息或根据问题的需要
存放特殊信息。
2、链表的遍历(显示链表)
一个非递归算法 以下函数disp()用于显示头节点为*h的链表的所有节点 数据域。
void disp( Node *h ) {
在空链表上插入一个元素
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;
在链表结尾出插入一个元素
3、链表的插入(有单独头节点的情况下)
由于增加了表头节点,不用象没有头节点的情况时, 区分是否插入点在表头,所以对于插入只有两种情况 从链表结尾处处插入一个元素 (即要插入的位置后方无元素,前方有元素) 从链表的中间插入 (即要插入的位置前方和后方均有元素) 其中第一种情况可以按照第二种情况处理,但有一定 特殊性(语句的顺序可以换)所以将其分开
Node *p=h; cout<<"输出链表:“; if ( p == NULL )
cout<<"空表\n"; else { while ( p != NULL ) {
cout<<p->data<<‘\t’; p = p->next; } cout<<‘\n’;
}
单链表的插入
3、链表的插入(头指针的情况下)
在链表结尾处插入一个元素
p
data
首先要用一个循环语句找到q
q
q=h;
h
...
NULL
while(q->next!=NULL)
q=q->next;
p
然后执行插入语句:
Fra Baidu bibliotekdata
p->next=NULL;
q
q->next=p;
h
...
NULL
p
data
q
h
...
NULL
在链表中间插入一个元素
p
data
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
说明: 链表中的元素个数可以根据需要增加和减少,不 像数组,在声明之后就固定不变;
元素的位置可以变化,即可以从某个位置删除, 然后再插入到一个新的地方;
单向链表有一个尾结点,该结点的指针部分指向 一个空结点(NULL) 。
链表的结点定义打破了先定义再使用的限制,即可以 用自己定义自己;
递归函数的定义也违反了先定义再使用;
对于插入有以下几种情况 在一个空链表上插入一个元素。 (即要插入位置前方和后方均无元素) 从链表表头处插入一个元素 (即要插入的位置前方无元素,后方有元素) 从链表结尾处处插入一个元素 (即要插入的位置后方五元素,前方有元素) 从链表的中间插入 (即要插入的位置前方和后方均有元素) 其中第三种情况可以按照第四种情况处理,但有一定特殊性所以将 其分开 注意:产生新的节点必须用malloc或者calloc开辟空间 C++ 则用 new
链表及其操作
结构体复习
例:跳马。依下图将每一步跳马之后的位置(x,y)放到 一个“结点”里,再用“链子穿起来”,形成一条 链,相邻两结点间用一个指针将两者连到一起。
3 4
3
2
4
2
1
5 7
6
结点 1 0 1 2 3 4 5
678
3
依上图有7个结点
(x1,y1)
(x2,y2)
(x6,y6)
(x7,y7)
这是C语言程序设计上的两大特例
带有头节点的单链表
一般各种资料表示链表有两种,一种是带头节点的,一种 是使用头指针的(不带头节点的)。
带头节点的 就是有一个专门的头节点h,它的后继指向链表的第一 个元素。
使用头指针的 没有专门的头节点,只有一个指针h指向链表的第一个 元素
单链表的遍历
head
a1
a2
……
an /\
C语言定义链表的结构如下 typedef struct Node {
int data; struct Node * next; }NODE;
// C++定义形式 struct TNode {
int data; TNode * next; };
链表是程序设计中一种重要的动态数据结构,它 是动态地进行存储分配的一种结构。
为了记录这类数据,引入链表这种 数据结构。
4
单链表
单链表
单链表的定义 单链表的基本操作
遍历(递归和非递归遍历) 插入(插入4种情况,重点) 建立 删除 将一个链表排序 将两个有序链表合并 将一个链表逆置 约瑟夫问题
1、单链表的定义
最简单的是单链表,单链表中每个节点由两个字段组成:数据字段和 指针字段,数据字段表示元素的本身信息,指针字段指明下个元素的 位置。单链表用来表示线性结构。例如线性表(a1,a2,…,an)可以表 示为:
h
q
... p
data
h
q
...
p
data
h
q
...
这种情况不涉及头节点的变动 假如被插入位置的后方特征是 数据项为x 则可以执行循环语句 ... NULL q=h; while( q->next!=NULL &&
q->next->data!=x) {
q=q->next; ... NULL }
确保找到被插入地方的前方节点q ,然后执行插入语句: p->next=q->next; q->next=p; ... NULL 注意语句顺序
2、链表的遍历(显示链表)
设head为链表的头指针,首先从head所指的节点开始打印,沿着链 的方向向右遍历,直到到最后一个节点,下面是一个打印链表的递归 函数。
void lprint (NODE *head)
{ NODE *p = head;
while ( p != NULL )
{ cout<<p->data<<‘\t’;
q
o
h ...
p
data
q
o
h ...
p
data
q h ...