知识大全 线性表 - 链式存储结构 - 单链表
Posted 结点
篇首语:技艺是无价之宝,知识是智慧的明灯。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 线性表 - 链式存储结构 - 单链表相关的知识,希望对你有一定的参考价值。
单链表
链接存储方法
链接方式存储的线性表简称为链表(Linked List)
链表的具体存储表示为
① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的 也可以是不连续的)
② 链表中结点的逻辑次序和物理次序不一定相同 为了能正确表示结点间的逻辑关系 在存储每个结点值的同时 还必须存储指示其后继
结点的地址(或位置)信息(称为指针(pointer)或链(link))
注意
链式存储是最常用的存储方式之一 它不仅可用来表示线性表 而且可用来表示各种非线性的数据结构
链表的结点结构
┌──┬──┐
│data│next│
└──┴──┘
data域 存放结点值的数据域
next域 存放结点的直接后继的地址(位置)的指针域(链域)
注意
①链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的
②每个结点只有一个链域的链表称为单链表(Single Linked List)
【例】线性表(bat cat eat fat hat jat lat mat)的单链表示如示意图
>
头指针head和终端结点指针域的表示
单链表中每个结点的存储地址是存放在其前趋结点next域中 而开始结点无前趋 故应设头指针head指向开始结点
注意
链表由头指针唯一确定 单链表可以用头指针的名字来命名
【例】头指针名是head的链表可称为表head
终端结点无后继 故终端结点的指针域为空 即NULL
单链表的一般图示法
由于我们常常只注重结点间的逻辑顺序 不关心每个结点的实际位置 可以用箭头来表示链域中的指针 线性表(bat cat fat hat
jat lat mat)的单链表就可以表示为下图形式
>
单链表类型描述
typedef char DataType; //假设结点的数据域类型为字符
typedef struct node //结点类型定义
DataType data; //结点的数据域
struct node *next;//结点的指针域
ListNode;
typedef ListNode *LinkList;
ListNode *p;
LinkList head;
注意
①LinkList和ListNode *是不同名字的同一个指针类型(命名的不同是为了概念上更明确)
②LinkList类型的指针变量head表示它是单链表的头指针
③ListNode *类型的指针变量p表示它是指向某一结点的指针
指针变量和结点变量
>
┌────┬────────────┬─────────────┐
│ │ 指针变量 │ 结点变量 │
├────┼────────────┼─────────────┤
│ 定义 │在变量说明部分显式定义 │在程序执行时 通过标准 │
│ │ │函数malloc生成 │
├────┼────────────┼─────────────┤
│ 取值 │ 非空时 存放某类型结点 │实际存放结点各域内容 │
│ │ 的地址 │ │
├────┼────────────┼─────────────┤
│操作方式│ 通过指针变量名访问 │ 通过指针生成 访问和释放│
└────┴────────────┴─────────────┘
①生成结点变量的标准函数
p=( ListNode *)malloc(sizeof(ListNode));
//函数malloc分配一个类型为ListNode的结点变量的空间 并将其首地址放入指针变量p中
②释放结点变量空间的标准函数
free(p);//释放p所指的结点变量空间
③结点分量的访问
利用结点变量的名字*p访问结点分量
方法一 (*p) data和(*p) next
方法二 p ﹥data和p ﹥next
④指针变量p和结点变量*p的关系
指针变量p的值——结点地址
结点变量*p的值——结点内容
(*p) data的值——p指针所指结点的data域的值
(*p) next的值——*p后继结点的地址
*((*p) next)——*p后继结点
注意
① 若指针变量p的值为空(NULL) 则它不指向任何结点 此时 若通过*p来访问结点就意味着访问一个不存在的变量 从而引起程序的错
误
② 有关指针类型的意义和说明方式的详细解释 【参考C语言的有关资料】
cha138/Article/program/sjjg/201311/23313相关参考
单链表的查找运算 ()按序号查找 ①链表不是随机存取结构 在链表中即使知道被访问结点的序号i也不能像顺序表中那样直接按序号i访问结点而只能从链表的头指针出发顺链域 next逐个结点往下搜索
()尾插法建带头结点的单链表 ①头结点及作用 头结点是在链表的开始结点之前附加一个结点它具有两个优点: ⒈由于开始结点的位置被存放在头结点的指针域中所以在链表的第一个位置上的操作就和在表的其
插入运算 ()思想方法 插入运算是将值为x的新结点插入到表的第i个结点的位置上即插入到ai与ai之间 具体步骤 ()找到ai存储位置p ()生成一个数据域为x的新结点*s ()令结点*
()尾插法建表 ①算法思路 从一个空表开始重复读入数据生成新结点将读入数据存放在新结点的数据域中然后将新结点插入到当前链表的表尾上直到读入结束标志为止 > 具体方法【参见动画演示】 注意
循环链表(CircularLinkedList) 循环链表是一种首尾相接的链表 循环链表 ()单循环链表——在单链表中将终端结点的指针域NULL改为指向表头结点或开始结点即可 ()多重链的
作为线性表的一种存储结构我们关心的是结点间的逻辑结构(线性关系)而对每个结点的实际地址并不关心所以通常的单链表用图的形式表示 > >
第一部分线性存储结构 复习策略线性表部分由于比较简单又是整个数据结构的基础所以考察的内容会比较细致对于线性表灵活运用的程度要求较高复习时应充分理解线性表的顺序存储链式存储(单链表静态链表循环链表双向
双向链表(DoubleLinkedList) 双(向)链表中有两条方向不同的链即每个结点中除next域存放后继结点地址外还增加一个指向其直接前趋的指针域 prior > 注意 ①双链表由
顺序表的存贮特点是利用物理上的相邻关系表达出逻辑上的前驱和后继关系它要求用连续的存储单元顺序存储线性表中各元素因此对顺序表进行插入和删除时需要通过移动数据元素来实现线性表的逻辑上的相邻关系从而影响
> cha138/Article/program/sjjg/201311/23374