数据结构之线性表_02

线性链表及其操作

在上一章中罗列了线性表在顺序存储结构下呈现的优点和缺点。为了弥补和克服顺序存储结构带来的不足,这一章将讨论线性表的另一种存储结构——链式存储结构。这种存储结构不要求逻辑上相邻的数据在物理位置上也相邻,仅通过指针来映射数据元素之间的逻辑关系。因此,它没有顺序存储结构的某些不足,但同时也失去了顺序表可以随机存取的优点。

线性链表的构造

线性表的链式存储结构是用一组地址任意似的存储单元(可以是连续的,也可以是不连续的)来依次存储线性表中的各个数据元素。为了表示每个数据元素与其逻辑伤的直接后继元素之间的逻辑关系,对于每一个数据元素而言,除了需要存储元素自身的数据信息之外,还需要存储一个指示其直接后继元素位置的信息,这两部分组成了一个数据元素的存储结构。称之为一个链结点。因此,链结点的构造

datalink

每一个链结点包括两个部分:用以存储一个数据元素本身信息的域称为数据域,用符号data作为该域的域名;存储一个数据元素逻辑上的直接后继元素存储位置的域称为指针域,用符号link作为指针域的域名。由于线性表的最后一个数据元素没有后继元素,故相应链结点的指针域放“空”(NULL)。
于是,具有n个数据元素的线性表对应n个链结点通过链接方式链接成一个链表,即线性表的链式存储结构。由于链表中每一个链结点中除了数据域以外仅设置了一个指针域,故称这样的链表为线性链表或者单链表
整个线性链表由一个称为外指针的变量(也称为头结点指针,该指针变量不妨取名为list)来指出,它标明线性链表的首地址(第1个链结点的存储地址),称之为链表的入口地址,整个链表的存取从该地址开始。当链表为空时,有list为NULL。这样,线性链表可以由该指针唯一确定,因此,上述线性链表完整地表示应如下图所示。
在这里插入图片描述
需要说明的是,链表中的各个链结点占用的存储空间之间不要求连续,但是每一个链结点内部占用的一系列存储单元则必须连续。所谓一个链结点的地址是指该链结点占用的一片连续的存储单元的第一个单元地址。
在C语言中可以按如下描述一个链结点的类型。

typedef struct node{
	ElemType data;
	struct node *link;
}LNode,*LinkList;

若指针p为指向线性链表中某个链结点的指针(指针变量p的内容为链表中某个链结点的存储地址),则

  1. 若符号p—>data出现在表达式中,他表示由p所指的链结点的数据域信息(指针域的内容),表示由p所指的链结点的数据域(位置)。
  2. 若符号p–>link出现在表达式中,他表示由p所指的链结点的指针域信息(指针域的内容),也就是p所指的链结点的下一个链结点的存储地址;否则,表示p所指的那个链结点的指针域(位置)
    于是,对于表达式中的符号p–>link–>data,当p–>link不为NULL时,它表示p所指的链结点的下一个链结点的数据域信息。
    因此,当线性表采用线性链表结构时,想要取得线性表的中的某个数据元素,就必须从链表的第1个链结点出发进行查找。可见线性链表是一种非随机存取的存储结构。
    把某个地址(不妨假设该地址保存在指针变量q中)送到由p所指链结点的指针域中,可以通过下面的赋值语句实现。
    p–>link =q;
    当p指向链表中某个链结点时,要想使p改编为下一个链结点,只需执行一次赋值语句
    p= p–> linkl;
    不难设想,如果让p指向链表的第1个链结点,然后反复执行这条赋值语句,直到p的内容为NULL,此时变量p已经遍历了整个链表。
    在线性链表中插入一个新的结点或者删除链表中的某个结点的过程也比较简单。例如,要在由指针r所指的结点后面插入一个由指针p值得新结点,其指针的变化情况如下图所示。
    插入前
    插入前
    在这里插入图片描述
    插入后
    根据插入操作的逻辑定义,插入新结点需要修改r所指结点的指针域,灵气指向新结点,而新结点的指针域应该指向插入前的直接后继结点,从而实现这三个结点之间逻辑关系的变化。插入后的线性链表如上图所示。整个插入过程用C语言描述为:
    p–>link = r–>link; r–>link =p;
    反之,删除线性链表中某个结点的过程也比较简单。例如下图所示的线性链表中删除由指针r所指结点的后继结点的过程只需要修改r所指结点的指针域即可,即直接后继结点的下一个结点的指针送r所指结点的指针域。相应的执行语句为
    r–>link=r–>link–>link;
    可见,在已知链表中结点的插入或者删除位置明确的情况下,插入一个结点或者删除一个结点时,仅需要修改指针而不需要移动元素,这与顺序表完全不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值