STL系列之八 slist单链表

数据结构初阶--单链表 阅读详情

微软的VS208所使用的PJ STL(注1)中的list是双链表,但在某些场合,一个轻量级的单链表会更加合适。单链表非常常见,这里就不去细说了,本文的slist(single linked list)单链表实现了链表的基本功能,如有需要,以后还会扩充的。slist单链表(带头结点)的示意图如下所示:

完整的C++代码如下:

//带头结点的单链表   
//by MoreWindows( http://blog.youkuaiyun.com/MoreWindows )  
template<class T>
struct Node
{
	T val;
	Node *next;
	Node(T &n)
	{
		this->val = n;
		this->next = NULL;
	}
};
template<class T>
class slist
{
public:
	slist();
	~slist();
	void push_front(T &t);
	bool find(T &t);
	bool remove(T &t);
	bool removeAll(T &t);
	void clear();
	int size();
public:
	int     m_nListDataCount;
	Node<T> *m_head;
};
template<class T>
slist<T>::slist()
{
	m_head = NULL;
	m_nListDataCount = 0;
}
template<class T>
slist<T>::~slist()
{
	Node<T> *p, *pnext;
	for (p = m_head; p != NULL; p = pnext)
	{
		pnext = p->next;
		free(p);
	}
	m_nListDataCount = 0;
}
template<class T>
void slist<T>::push_front(T &t)
{		
	Node<T> *pNode = (Node<T> *)malloc(sizeof(Node<T>));
	pNode->val = t;
	pNode->next = m_head;
	m_head = pNode;
	m_nListDataCount++;
}
template<class T>
bool slist<T>::find(T &t)
{
	for (Node<T> *p = m_head; p != NULL; p = p->next)
		if (p->val == t)
			return true;

	return false;
}
template<class T>
int slist<T>::size()
{
	return m_nListDataCount;
}
//删除链表中第一个值为t的结点
template<class T>
bool slist<T>::remove(T &t)
{
	Node<T> *pNode, *pPreNode;
	pPreNode = pNode = m_head;
	while (pNode != NULL)
	{
		if (pNode->val == t)
		{
			if (pPreNode != pNode)
				pPreNode->next = pNode->next;
			else
				m_head = NULL;
			free(pNode);
			m_nListDataCount--;
			return true;
		}
		pPreNode = pNode;
		pNode = pNode->next;
	}
	return false;
}
//会删除链表中所有值为t的结点
template<class T>
bool slist<T>::removeAll(T &t)
{
	bool flagDeleteNode = false;
	Node<T> *pNode, *pPreNode;
	pPreNode = pNode = m_head;
	while (pNode != NULL)
	{
		if (pNode->val == t)
		{
			pPreNode->next = pNode->next;
			free(pNode);
			pNode = pPreNode->next;
			m_nListDataCount--;
			flagDeleteNode = true;
		}
		else
		{
			pPreNode = pNode;
			pNode = pNode->next;
		}
	}
	return flagDeleteNode;
}
template<class T>
void slist<T>::clear()
{
	Node<T> *cur = m_head;
	while (cur != NULL)
	{
		Node<T> *next = cur->next;
		free(cur);
		cur = next;
	}
	m_head = NULL;
}

该slist完成了从头部插入,查找和删除数据等链表的基本操作,下一篇将使用这个slist来完成一个哈希表,请关注下一篇——《STL系列之九 探索hash_set》

 

注1.STL分为很多版本,微软的VS系列使用的是PJ STL。而《STL源码剖析》书中主要使用SGI STL。

 

 

转载请标明出处,原文地址:http://blog.youkuaiyun.com/morewindows/article/details/7186471


 

STL源码笔记(16)—单链表slist STL单链表slist简介 阅读详情

相关推荐

隐藏在WAV音频里的秘密:用Python脚本从‘噪音’CTF题中提取Flag

本文详细解析了如何利用Python脚本从WAV音频文件中提取隐藏的Flag信息,特别针对CTF比赛中的音频隐写技术。通过分析WAV文件结构、编写Python解析脚本,并解决字节序处理和异常值等实际问题,帮助读者掌握从‘噪音’中解码Flag的技巧。

weixin_30617737的博客 482

c++基础知识——STL之链表

STLzhi链表,想学习c++ 的朋友可以看过来了,带你学会c++中的链表;

qq_59931372的博客 1万+

CarPlay盒子选购避坑指南:为什么你的车机破解了却用不了?从USB设备ID说起

本文深入解析CarPlay盒子硬件兼容性问题,从USB设备ID匹配到车机适配逻辑,揭示破解成功却无法使用的根本原因。通过分析USB设备识别的核心要素和逆向工程usb_device_manager.xml文件,提供三种主流解决方案对比,并强调操作中的硬件保护机制,帮助车主避免常见陷阱。

weixin_30706691的博客 472

单链表基础实现+单双链表数组模拟+STL使用+习题练习(超详解)

链表由一系列节点(链表中每一个元素称为节点)组成,节点在运行时动态生成 (malloc),每个节点包括两个部分:一个是存储数据元素的数据域data另一个是存储下一个节点地址的指针域next*

2302_79366101的博客 394

阿里云网络架构设计

背景 一个企业上云,首先要考虑整个网络的规划,涉及到云上和云下的网络规划,云上VPC的规划,云上不同地域VPC的互通,云上可用区的选择等等,所以一定要提前规划好整体的网络架构,现在阿里云云上的虚拟化网络解决方案已经完全转向 了云企业网,所以所有使用阿里云的企业客户多多少少都会使用阿里云的CEN 支撑自己的业务。 云企业网介绍 云企业网(Cloud Enterprise Network)是承载在阿里云提供的高性能、低延迟的私有全球网络上的一张高可用网络。 IDC专线接入CEN 首先面临的是云上和云下打通,那么

修电脑的码农 4837

西门子S7-200 SMART与施耐德ATV变频器Modbus通讯实战:从接线到稳定运行的完整指南

本文详细介绍了西门子S7-200 SMART PLC与施耐德ATV变频器之间实现稳定Modbus通讯的完整实战指南。内容涵盖从硬件接线、参数配置、PLC程序编写到触摸屏设计的全流程,并分享了提升通讯稳定性的关键技巧和常见故障排查方法,助力工业自动化系统可靠运行。

kkk56的博客 1104

slist

一.slist概述 前面讲过的list是一个环状双向链表,而slist是一个普通的单向链表,slist与list的差别主要在于slist的迭代器是一个Forward Iterator,只能单向移动,由此slist的insert和erase效率都比较低(毕竟没办法往前移动,要找到前一个只有遍历了),所以slist有往后插入和删除的函数,同样的,基于效率考虑,slist没有push_back(要遍历),有push_front,所以进入的次序和实际的排列是反着的(感觉除了节省空间一点,这个slist用处不大啊)。

qq_46514141的博客 1973

Java使用POI生成柱状图导出到word文档(柱状图)

本篇文章主要介绍,如何使用Apache POI组件生成柱状图导出到word文档中,具体步骤看下文。 一、实现效果 Java使用POI技术生成柱状图导出到word文档中,最终生成的柱状图如下所示: 二、环境准备 编程语言:Java 第三方依赖:Apache POI Apache POI依赖代码如下所示: <dependencies> <dependency> <groupId>org.apache.poi</groupId.

✅ Java 开发工程师 7366

slist的简单总结

一、slist的概述 STL list是个双向链表。SGI STL另提供了一个单向链表,叫做slist。如下图所示。这个容器并不在标准规范之内。 二、与list对比 不同之处: 1、slist和list的主要差别在于,前者的迭代器属于单向的Forward Iterator,后者的迭代器属于双向的Bidirectional Iterator。为此slist的功能自然也就受到了许多限制。但是单向链表...

Janway-Win 3328

【AI智能体】Codex 基于Git 实现项目管理实战操作详解

Codex 基于Git 实现项目管理实战操作详解

congge 5450

【即插即用模块】Mamba篇 | CVPR 2025 | MaIR:新型Mamba扫描方式+通道混洗注意力,全任务涨点!

MaIR是一种新型图像恢复模型,通过嵌套S形扫描策略(NSS)和序列混洗注意力(SSA)改进传统Mamba方法。NSS采用条纹区域划分和S形扫描路径,既保留图像局部性又维持空间连续性;SSA通过通道洗牌和门控机制增强特征聚合。该模块创新性地融合多路径选择性扫描、深度卷积和注意力机制,在保持O(N)计算复杂度的同时,显著提升超分辨率和去噪等任务的性能表现(PSNR提升0.2-0.5dB)。代码实现包含特征洗牌、组卷积等关键操作,适用于高分辨率视觉任务,可作为即插即用组件替代传统自注意力模块。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1162

STL源码:slist

STL list是双向链表。SGI STL还提供了单向链表slist(single linked list)。这个容器不再标准范围内。         slist和list 的主要差别在于,前者迭代器是单向的Forward Iterator,后者迭代器是双向的Bidirectional Iterator,因此,slist功能会有很多限制;不过slis所耗空间小,某些操作快。         s

Sunshine的专栏 1735

【用unity实现100个游戏之1】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(一)(附源码)

俯视角射击游戏)是一类以俯视视角进行游戏展示的射击游戏。在这种游戏中,玩家控制着一个角色或载具,从俯视的角度上方观察游戏世界,并与敌人进行战斗。这种视角使玩家能够有更好的全局观察和策略性,同时也强调快速反应和精确射击。视角:俯视角度可以是固定的,也可以随着玩家角色的移动而变化,但都允许玩家以全局视角观察整个战场,有利于制定战略和规划行动。射击:玩家通常需要使用各种武器来与敌人进行战斗,包括枪械、爆炸物等。射击动作依赖于玩家的反应速度和准确性。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 7829

STL之slist(一)

         STL list是双向串行。SGI STL另提供了一个单向串行,名为slist。这个容器并不在标准规格之内。       slist和list的主要差别在于,前者的迭代器属于单向的Forward Iterator,后者的迭代器属于双向的Bidirectional Iterator。此为,slist的功能自然也就受到许多限制。不过,单向串行所耗用的空间更小,某些动作更快,不失为另一...

dongyu_1989的博客 822

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【STL】顺序容器 — slist

slist属于单链表,不在标准规格之内,是SGI STL特有的一种顺序容器。由于slist的迭代器属于前向迭代器,不能往前走,所以插入操作和list有所不同。根据STL的习惯,插入操作会将新元素插入于指定位置之前,但slist无法记录前驱节点(需要从头遍历找出前驱节点),所以插入操作提供了insert_after()和erase_after()版本。 slist节点和迭代器的设计比lis

Nestle的专栏 1232

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

STL学习笔记之容器--slist

slist是SGI STL里面的一个单向链表,不过这个不属于标准定义,所以,G++下面不能用,另外看了下VS2008里面也没有。不过看到书上这一部分讲解,还是配合SGI的代码做一个了解。一般情况下使用标准的list就可以满足要求了,而且会更加方便,list的分析可以参考STL笔记之list一文。因为slist是单向链表,所以它的迭代器类型为forward_iterator。 1. slist

wei.zhou的专栏 785

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

STL学习之slist

前面有学习STL list(double linked list),slist是一个单项链表(single linked list)。slist和list的主要差别是slist是单向的Forward Iterator,list是双向迭代器。slist和list一样,插入不会导致原有的迭代器失效。 节点的数据结构

pecywang的专栏 981

STL源码剖析——单向链表slist

前言 在STL标准中提供de

关注校招求职,微信号:job_campus 1385
上一篇: STL系列之七 快速计算x的n次幂 power()的实现
下一篇: JSON进阶第一篇 在PHP与javascript 中使用JSON
MoreWindows
MoreWindows 《白话经典算法》、《秒杀多线程》作者 《白话经典算法》、《秒杀多线程》作者 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄15年 2万+粉丝 157原创
评论 17
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值