双向链表的实现

news2024/12/23 14:46:37

这里以结构体的方式来实现链表,也可以使用类。结构体在没有修饰符的情况下,默认是共有访问。如有不对,希望能指出


目录

一、链表和结点结构体的声明 (ListNode.h)

二、链表各个功能的实现

1、增

(1) 构造函数(创建链表头结点)

 (2) 尾插

(3) 头插

(4) 任意位置的插入

2、删

(1) 尾删

 (2) 任意位置的删除

(3) 链表释放

3、查

(1) 获取元素个数

(2) 正向打印

(3) 反向打印


一、链表和结点结构体的声明 (ListNode.h)

typedef int data_t;

typedef struct ListNode {		// 结点声明
	data_t data;
	ListNode* next;
	ListNode* prev;
}ListNode;

typedef struct SeqLinkList {
	
	SeqLinkList();
	void list_print();					// 从前往后打印链表
	void list_reverse_print();			// 从后往前打印链表
	size_t size();						// 链表大小(链表结点个数)

	int push_back(data_t val);			// 尾插
	void pop_back();					// 尾删
	int push_front(data_t val);			// 头插
	
	int list_find(data_t val);			// 查找某个结点
	int list_insert(int pos, data_t val);	// 在某个位置插入一个结点
	int list_delete(int pos);				// 删除某个位置的结点
	void list_destroy();					// 释放整个链表

private:
	ListNode* _phead;					// 链表头结点的地址
	ListNode* _ptail;					// 链表尾结点的地址
	size_t _num;						// 链表元素的个数
		
}SeqLinkList;

二、链表各个功能的实现

1、增

(1) 构造函数(创建链表头结点)

创建一个空的头结点,同时初始化元素个数

SeqLinkList::SeqLinkList() {
	_phead = (ListNode*)malloc(sizeof(ListNode));
	assert(_phead);

	_ptail = _phead;		// 此时头尾指向同一个地方

	_num = 0;		// 初始化结点的个数
}

 (2) 尾插

int SeqLinkList::push_back(data_t val) {

	ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
	if (newNode == NULL)
		return -1;

	newNode->data = val;
	newNode->next = NULL;
	newNode->prev = _ptail;
	_ptail->next = newNode;	// 链接新的结点

	_ptail = newNode;		// 尾节点移动
	_num++;

	return 0;
}

(3) 头插

int SeqLinkList::push_front(data_t val) {
	ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
	if (newNode == NULL)
		return -1;

	ListNode* nextNode = _phead->next;		// _phead的下一个结点
	newNode->data = val;
	newNode->next = nextNode;
	newNode->prev = _phead;
	_phead->next = newNode;
	if (nextNode != NULL)
		nextNode->prev = newNode;

	_num++;

	return 0;
}

(4) 任意位置的插入

int SeqLinkList::list_insert(int pos, data_t val) {
	if (pos > _num - 1)
		return -1;

	ListNode* current = _phead;
	while (pos-- && (current = current->next) != NULL);

	ListNode* nextNode = current->next;			// 记录下当前节点的下一个结点
	ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
	if (newNode == NULL)
		return -1;

	newNode->data = val;            // 链接新的结点
	current->next = newNode;
	newNode->next = nextNode;
	newNode->prev = current;

	if (nextNode != NULL)
		nextNode->prev = newNode;		// 考虑尾插

	_num++;

	return 0;
}

2、删

(1) 尾删

void SeqLinkList::pop_back() {
	ListNode* tailNode = _ptail;		// 记录尾节点
	_ptail = _ptail->prev;			
	_ptail->next = NULL;
	free(tailNode);
	tailNode = NULL;
	_num--;
}

 (2) 任意位置的删除

int SeqLinkList::list_delete(int pos) {
	if (pos > _num - 1)
		return -1;

	ListNode* current = _phead;
	while (pos-- && (current = current->next) != NULL);

	if (current == _phead)
		_phead = current->next;		// 考虑头删
	else
	{
		ListNode* prevNode = current->prev;
		ListNode* nextNode = current->next;
		prevNode->next = nextNode;
		if (nextNode != NULL)
			nextNode->prev = prevNode;
	}
	
	free(current);
	current = NULL;

	_num--;

	return 0;
}

(3) 链表释放

void SeqLinkList::list_destroy() {
	_num++;			// 补上一个头结点,下面是连带着头结点一起释放了
	while (_phead != NULL)
	{
		ListNode* lastNode = _phead;
		_phead = _phead->next;
		free(lastNode);
		lastNode = NULL;
		_num--;
	}
}

 

3、查

(1) 获取元素个数

size_t SeqLinkList::size() {
	return _num;
}

(2) 正向打印

void SeqLinkList::list_print(){

	ListNode* current = _phead;
	while ((current = current->next) != NULL)
	{
		printf("%d->", current->data);
	}
}

(3) 反向打印

void SeqLinkList::list_reverse_print() {

	ListNode* current = _ptail;
	while (current != _phead)
	{
		printf("%d->", current->data);
		current = current->prev;
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

简历上写着“精通 MySQL”,阿里面试官非要跟我死磕,最后还是给我发了 offer

事情是这样的 前段时间因为想要跳槽就去面试了下阿里,大家也都清楚,精通这个词在简历上属于很难把握住的一个词,如果你在你的简历上面写着你精通 XX 技术,那面试官就会默认你是真的很会,刨根问底问到你崩溃。 我之前…

【踩坑】工作中真实踩坑,一个or让sql变慢7倍

工作中真实踩坑,一个or让sql变慢1000倍1.情况说明2.解释计划3.or改成union4.总结1.情况说明 测试环境,有两张表,分别是讲师表t_train_lecturer(后面简称B表),和讲师的授课时长表t_train_activity(后面简称A表&#xf…

opencv 图像平滑

高通滤波可以找到图像的边缘。低通滤波可以去除噪音,模糊图像。 自定义滤波器 cv2.filter2D() import cv2 import numpy as np from matplotlib import pyplot as pltimg cv2.imread(img1.png) imgcv2.cvtColor(img,cv2.COLOR_BGR2RGB) kernel np.ones((5, 5), n…

2022年11月10篇论文推荐

随着最大的人工智能研究会议(NeurIPS 2022)即将到来,我们进入了2022年的最后阶段。让我们回顾一下人工智能世界最近发生了什么。 在介绍推荐论文之前,先说一个很有意思的项目: img-to-music:想象图像听起来是什么样的模型! https://hugging…

人工智能和自动驾驶业务将是百度未来的最强增长动力

来源:猛兽财经 作者:猛兽财经 虽然百度(BIDU)长期以来一直缺乏增长动力,但猛兽财经认为现在可能是投资百度股票的时候了。因为我们认为百度在未来有几个可以实现强劲增长的动力。首先,百度可以利用其在中国自动驾驶市场的领先地位…

如何验证ARP缓存表最多能缓存多少条动态条目

ARP协议原理、ARP缓存表目的,这些在我的文章中已经反复提及过多次了。ARP缓存表里有静态和动态条目两种,静态的是写死的,没有老化时间,不会随着时间的流逝而自动删除。动态条目是缓存的,有老化时间timeout,如果长时间没有刷新,老化时间到了就会自动删除。老化时间是一个…

智能服务机器人产品及解决方案

产品概述 随着人工智能(AI)领域技术的不断发展和演进,面向人工智能的领域应用也越来越被更多的企业关注。信迈作为中国领先的创新型软件及信息技术服务商,一直致力于人工智能领域技术的探索和实践。 信迈凭借自身雄厚的技术能力…

Cookie注入和X-Forwarded-For注入

💪💪Cookie注入和X-Forwarded-For注入一 .Cookie注入1.创建漏洞环境2.漏洞攻击2.1判断是否有注入2.2信息收集2.3注入获取数据库名2.4注入获取表名2.5注入获取列名2.6注入获取信息3.sql靶场实战二. X-Forwarded-For注入1.创建漏洞环境2.漏洞攻击2.1判断是…

浅析Betaflight中的OSD叠加程序【MAX7456AT7456】

前言:想要对OSD下手已经不是头一次了,前几次都浅尝辄止。一个是能力不够,BetaFlight的代码体系太庞大了,看不懂也摘不出来。 这次要做一款带osd功能的接收机(用在遥控车上),所以又来打飞控程序…

[附源码]java毕业设计校园快递管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

1万属性,100亿数据,每秒10万吞吐,架构如何设计?

有一类业务场景,没有固定的schema存储,却有着海量的数据行数,架构上如何来实现这类业务的存储与检索呢?58最核心的数据“帖子”的架构实现技术细节,今天和大家聊一聊。一、背景描述及业务介绍什么是58最核心的数据&…

深度学习入门(四十四)计算机视觉——多尺度目标检测

深度学习入门(四十四)计算机视觉——多尺度目标检测前言计算机视觉——多尺度目标检测教材1 多尺度锚框2 多尺度检测3 小结前言 核心内容来自博客链接1博客连接2希望大家多多支持作者 本文记录用,防止遗忘 计算机视觉——多尺度目标检测 教…

【Hack The Box】linux练习-- Postman

HTB 学习笔记 【Hack The Box】linux练习-- Postman 🔥系列专栏:Hack The Box 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📆首发时间:🌴2022年11月17日🌴 &#x1f…

大学生旅游风景主题dreamweaver网页设计大作业-陕西渭南HTML+CSS制作网页

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法,如盒子的嵌套、浮动、margin、border、background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大学学习的前端知识点和布局方式都有…

从不学无术到架构师Leader:这份java面试知识宝典,一举斩获京东T8

前言 面试了大大小小各种公司,有BAT的,上市的,AB各种轮的,初创的……今天大概列举了下,至少有30家公司。 在这里我总结了求职面试需要注意的各种问题,希望可以用我收集的《Java面试核心知识笔记》及面试经…

element UI 组件封装--搜索表单(含插槽和内嵌组件)

组件封装–搜索表单 searchForm.vue 可根据需要&#xff0c;参考姓名和工作自行增加更多常用的默认搜索项 <template><div style"padding: 30px; width: 300px"><el-formref"searchFormRef":model"searchData":label-width"…

伽马校正笔记(Gamma Correction)

在数字图像系统中&#xff0c;伽马&#xff08;Gamma&#xff09;是一个重要的但很少被正确理解的特性。它定义了一个像素的数值和对应的实际亮度之间的关系。 人眼感知的亮度和相机“看到”的亮度区别 对于数码相机来说&#xff0c;当检测的光子数增加一倍时&#xff0c;sens…

Win11蓝屏代码IRQL NOT LESS OR EQUAL的处理方法

蓝屏错误IRQL NOT LESS OR EQUAL是用户常见的系统故障了&#xff0c;升级到Win11新系统也遇到了同样的问题&#xff0c;那么Win11蓝屏问题IRQL NOT LESS OR EQUAL要如何解决&#xff1f;下面就来看看小编整理的解决办法。 什么是 IRQL_NOT_LESS_OR_EQUAL 错误&#xff1f; IRQL…

【Docker】Docker入门学习

【Docker】学习docker 1.Docker安装与启动 1.1.安装 【第一步】yum包更新到最新版本 sudo yum update【第二步】安装需要的软件包&#xff0c;yum-util提供的yum-config-manager功能&#xff0c;另外两个是devicemapper驱动依赖的 sudo yum install -y yum-utils device-m…

三菱FX3U——ST编程定时器和计数器

在部件选择——FB——选择定时器类型 双击弹出标签登录/选择对话框&#xff0c;点击应用&#xff1b; 编辑器自动插入TON_1; 光标放在TON_1后&#xff0c;按下CTRLF1&#xff0c;补全代码; IN&#xff1a; 输入&#xff0c;PT&#xff1a;定时时间&#xff0c;Q&#xff1a;输…