数据结构——单链表基本操作实现 (c++)

单链表定义

单链表链式存储结构的特点是:用一组任意的存储单元存储线性表的数据元素(这里存储单元可以是连续的,也可以是不连续的),为了表示每个数据元素a与其直接后继数据元素之间的逻辑关系,除了存储信息本身外还要存储一个指示其直接后继的信息(地址).
这两部分信息组成数据元素a的存储映像称为结点,它包括两个域:存储信息的称为数据域,存储直接后继存储地址的域称为指针域,指针域中存储的信息称作指针.

单链表表示

可以参考下图:
在这里插入图片描述

三个需要理解的概念:

头指针:头指针是指向链表中第一个结点的指针。若链表设有头结点,则头指针所指结点为线性表的头节点;若链表没设头结点,则头指针所指结点为线性表的首元结点。

头结点:头结点是在首元结点之前附设的一个结点,该头结点指针域指向首元结点。头结点的数据域可以不存储任何信息,也可存储信息,设定头结点的目的是使链表中第一个数据(首元结点)的操作与其他数据元素的操作相同,无需进行特殊处理。

首元结点:首元结点是指链表中存储第一个数据元素a的结点。如上图所示的A。

代码实现

1.单链表存储结构和初始化操作

//单链表存储结构
struct LinkedList {
   
   
	int data;	//结点数据域(以下我用int型数据类型)
	LinkedList* next;	//结点指针域
};

//初始化操作(创建头节点)
void InitList(LinkedList*& L) {
   
   	//这里的 *& 表示对指针的引用
	L = new LinkedList;	//生成一个头节点,用头指针 L 指向头节点
	L->next = NULL;		//头指针置空(目的是为了不指向什么奇奇怪怪的地方,也为了方便对单链表基本操作实现)
}

1.单链表存储结构包括两个方面:一是该存储节点的数据域,二是该存储节点的指针域(用来指向直接后继结点的).
2. 初始化的目的时为了生成一个头结点,上面代码InitList中的形参为指针的引用类型(*&)是对指针的一个引用操作。那么为什么这个地方要用引用指针?用指针不也行吗?肯定不行,这里简单表示为p1(形参) = p2(实参),若用指针作为形参接收实参,在开辟空间 L = new LinkedList; 时,实际接收这个新开辟的空间的指针是p1而不是p2,总的来说就是我们想初始化的是实参,开辟的空间要作用于实参上就必须得用指针的引用类型.

2.前插法

//前插法(在头节点后插入 n 个结点)
void CreateList_H(LinkedList*& L, int n = 1) {
   
   	
//n 表示前插的结点数量,这里默认设置为 1
	if (n < 1){
   
   	//若传入的n小于1,出现错误
		cout << "ERROR" << endl;
		exit(0);
	}
	//逆位序插入结点
	for (int i = 0; i < n; i++) {
   
   
		LinkedList* p = new LinkedList;	//创建新结点
		cin >> p->data;
		
		//具体插入操作
		p->next = L->next; 	
		L->next = p;
	}
}

下图是单链表(c、d、e)前插过程,因为每次插入都在头结点后,所以为逆位序插入,插入顺序为e、d、c.
在这里插入图片描述

3.后插法

//后插法
void CreateList_R(LinkedList*& L, int n = 1) {
   
   
	LinkedList* r = L->next;	//创建指向尾部的指针
	while (r->next) {
   
   	//让尾指针指向链表尾部
		r = r->next;
	}
	if (n < 1) {
   
   	//若传入的n小于1,出现错误
		cout << "ERROR" << endl;
		exit(0);	//跳出程序
	}		
	for (int i = 0; i < n; i++) {
   
   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_74794504

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值