数据结构 第二章 线性表(二)

第二章知识框图

三、线性表的链式表示

 在顺序表的操作中,插入、删除和按值查找的操作时间复杂度均为O(n),运行效率低,因此引入了链式存储。链式存储不需要使用地址连续的存储单元,即不要求逻辑上相邻的两个元素物理位置上也相邻,它是通过“链”建立起元素之间的逻辑关系,因此,对线性表的插入、删除不需要移动元素,而只是需要修改指针。
(一)单链表
1、单链表的定义
 线性表的链式存储又称为单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素。为了建立起数据元素之间的线性关系,对每个链表结点,除了存放元素自身的信息之外,还需要存放一个指向其后继的指针。单链表结点结构如下图所示,其中,data为数据域,存放数据元素;next为指针域,存放其后继结点的地址。
                           单链表节点结构
 单链表结点的定义:

typedef struct LNode
{
   
	int data;	//这里默认的是int型
	struct LNode *next;	//指向Node型变量的指针
}LNode;

 利用单链表可以解决顺序表需要大量的连续存储空间的缺点,但是单链表附加指针域,也存在浪费存储空间的缺点。由于单链表的元素是离散的分布在存储空间中的,所以单链表是非随机存取的存储结构,即不能直接找到表中某个特定的结点。查找某个特定结点时,需要从表头开始遍历依次查找。
 通常,我们用“头指针”来标识一个单链表,头指针为“NULL”时表示一个空表。此外,为了操作上的方便,在单链表第一个结点之前附加一个结点,称为头结点,头结点的数据域可以不设任何信息,也可以记录表长等相关信息。头结点的指针域指向线性表的第一个元素结点。如下图:
结点描述
 头结点和头指针的区别:不管带不带头结点,头指针始终指向链表的第一个结点,而头结点是带头结点链表中的第一个结点,结点内通常不存储信息。
 不带头结点的单链表中的头指针head直接指向开始结点,但head等于NULL时,链表为空。
 带头结点的单链表中,头指针head指向头结点,所以head始终不等于NULL,head->next等于NULL的时候,链表为空。
 引入头结点后,可以带来两个优势:
 1)由于开始结点的位置被存放在头结点的额指针域中,所以在链表的第一个位置上的操作和在表的其他位置上的操作一致,无须进行特殊处理。
 2)无论链表是否为空,其头指针是指向头结点的非空指针,因此空表和非空表的处理也就一致了。
---------备注----------
 上面这个结构型的名字为LNode,因为组成结构体的成员中有一个是指向和自己类型相同的变量的指针,内部要用自己来定义这个指针,所以写成 struct LNode *next;。这里指出,凡是结构型(假设名为a)内部有这样的指针型(假设名为b),即b是用来存放和a类型相同的结构体变量地址的指针型,则在定义a的 typedef struct 语句之后都要加上a这个结构型的名字,如上述结构体定义中 typedef struct 后面的LNode(我们知道在定义一般的结构体时并不需要这样写)。
 其实,单链表结点的定义写法不止这一种,也可以写成下面的形式:

typedef struct LNode
{
   
	int data;	//这里默认的是int型
	struct LNode *next;	//指向Node型变量的指针
}LNode,*LinkList;

 可以看到最后多了一个 *LinkList,其实在定义一个结点p时,LNode *p;等价于LinkList p;。这里我们采用没有 *LinkList的写法。

---------备注结束----------
2、单链表的基本操作
(1)单链表的建立
 建立单链表的方法有头插法和尾插法。顾名思义,头插法是指将新结点插入到开始结点之前、头结点之后;尾插法是指将新结点插入到终端结点之后。
1)头插法
 假设有n个元素已经存储在数组a中,用头插法建立链表C:

void createlistF (LNode *&C, int a[], int n)
{
   
	LNode *s;	//s用来指向新申请的结点
	int i;
	C=(LNode*)malloc(sizeof(LNode))
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值