单链表
1、链接存储方法
链接方式存储的线性表简称为链表(Linked List)。
链表的具体存储表示为:
① 用一组任意的 存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的)
② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在 存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为 指针(pointer)或链(link))
注意:
链式存储是最常用的存储方式之一,它不仅可用来表示线性表,而且可用来表示各种非线性的 数据结构。
2、链表的结点结构
┌───┬───┐
│data │next │
└───┴───┘
data域--存放结点值的数据域
next域--存放结点的直接后继的地址(位置)的 指针域(链域)
注意:
①链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的。
②每个结点只有一个链域的链表称为单链表(Single Linked List)。
【例】线性表(bat,cat,eat,fat,hat, jat,lat,mat)的单链表示如示意图
3、头 指针head和 终端结点指针域的表示
单链表中每个结点的存储地址是存放在其前趋结点next域中,而开始结点无前趋,故应设头指针head指向开始结点。
注意:
链表由头 指针唯一确定,单链表可以用头指针的名字来命名。
终端结点无后继,故终端结点的 指针域为空,即NULL。
4、单链表的一般图示法
由于我们常常只注重结点间的逻辑顺序,不关心每个结点的实际位置,可以用箭头来表示链域中的 指针,线性表(bat,cat,fat,hat, jat,lat,mat)的单链表就可以表示为下图形式。
单链表的建立
链表操作中 动态存储分配要使用 标准函数,先介绍一下这些函数。
(1)malloc(size)
在内存的 动态存储区申请一个长度为size字节的连续空间。
(2)calloc(n,size)
在内存的 动态存储区申请n个长度为size字节的连续空间,函数返回值为分配空间的首地址。若此函数未被成功执行,函数返回值为0。
(3)free(p)
释放由 指针p所指向的存储单元,而存储单元的大小是最近一次调用malloc()或calloc()函数时所申请的 存储空间。
在头文件\"stdlib.h”中包含了这些函数的信息,使用这些函数时需在程序开头用文件包含指令#include“stdlib.h”指明。
单链接的基本操作:实现带头结点的单链表的建立,求长度,取元素,修改元素,删除等单链接的基本操作。
基本要求:
1:依次从键盘读入数据,建立带头接头的单链表;
2:输出单链表中的数据元素;
3:求单链接表的长度;
4:根据指定条件能够取元素和修改元素;
5:实现在指定位置插入和删除的功能。
- add() 添加元素
- clear() 清空链表
- contains(data) 是否包含元素
- display() 显示链表
- get(position) 得到索引位置的元素
- isEmpty() 链表是否为空
- remove(position) 移除索引位置的元素
- reverse() 倒置链表
- set(position, data) 向链表指定位置设置修改元素
- size() 返回链表的长度
var Node = function (data) { this.data = data; this.next = null;};单链表中的数据域和指针域
链表的每个元素都包含什么:
一个 node 里面包含data和 pointer
data 定于链表数据域
pointer 链表中的指针