首页 > 编程语言 >C++简单实现list链表数据结构(一)

C++简单实现list链表数据结构(一)

时间:2023-12-23 22:36:31浏览次数:46  
标签:Node head Mylist Iterator list pos C++ 链表

链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。

  • 链表的组成:链表由一系列结点组成
  • 结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域

C++STL中的链表是一个双向循环链表

C++简单实现list链表数据结构(一)_C++STL

由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器


今天实现的简单链表如下:

  1. 链表类Mylist(封装私有成员Node指针head)
  • Mylist类头部插入数据:insert_head
  • 重载输出符号<<使cout直接输出节点数据
  1. 节点结构体Node(封装整型数据,结构体指针)
  2. Mylist类内部封装的迭代器类Iterator
  • Iterator类重载++运算符使迭代器可以指向下一个节点
  • Iterator类重载*运算符使通过迭代器*拿到节点的数据
  • Iterator类重载!=运算符使!=可以比较两个节点对象
  • 头部迭代器begin()
  • 尾部迭代器end()

没有使用C++模板,下一篇将会使用模板完善Mylist


代码示例:

class Mylist
{

	//节点结构体
	struct Node
	{
		Node(int x, Node* ptr = nullptr):data(x),next(ptr) {}
		int data;
		Node* next;
	};
public:

	//Mylist类封装的迭代器Iterator
	class Iterator
	{
	public:
		Iterator(Node* ptr=nullptr):pos(ptr){}
		~Iterator() {}

		Iterator &operator++(int) {
			if (nullptr != pos) {
				pos = pos->next;
			}
			return *this;
		}

		int& operator*() {
			return pos->data;
		}

		bool operator !=(Iterator x) {
			return pos != x.pos;
		}

	private:
		Node* pos;

	};

public:
	Mylist() :head(nullptr) {}
	~Mylist() {
		while (head){
			Node* tem = head;
			head = head->next;
			delete tem;
		}
	}

	//头部插入数据
	void insert_head(int data) {
		Node* node = new Node(data);
		node->next = head;
		head = node;
	}

	//输出<< 符号重载,cout<<直接输出Mylist& list的每一个节点
	friend ostream& operator<<(ostream& out, const Mylist& list);

	//迭代器头部位置
	Iterator begin(){
		return Iterator(head);
	}

	//迭代器尾部位置
	Iterator end() {
		return Iterator(nullptr);
	}

private:
	//节点的头指针
	Node* head;
};

ostream& operator<<(ostream& out, const Mylist& list) {
	Mylist::Node* tem = list.head;
	while (tem){
		out << tem->data << ",";
		tem = tem->next;
	}
	out << endl;
	return out;
}

main函数测试

int main() {

	Mylist l1;
	l1.insert_head(1);
	l1.insert_head(2);
	l1.insert_head(3);
	l1.insert_head(4);
	l1.insert_head(5);

	cout << l1;

	Mylist::Iterator i = l1.begin();
	while (i!=l1.end())
	{
		cout << *i << endl;
		i++;
	}

	system("pause");

	return 0;
}

C++简单实现list链表数据结构(一)_C++STL_02

感谢观看

下一篇将会使用模板完善Mylist


标签:Node,head,Mylist,Iterator,list,pos,C++,链表
From: https://blog.51cto.com/u_15172160/8946858

相关文章

  • (原创)安卓在fragment里使用自定义ListView
    原创声明:本文所有图片和代码皆由本人制作和编写。目录前言目标5步走第零:准备好你的ListItem布局第一:在布局文件添加ListView组件第二:创建适配器实现构造器(在这里提供数据)实现getView(在这里绑定布局)第三:把第一步的xml文件里的ListView和第二步的适配器联系起来第四:为每个小条目......
  • 142. 环形链表Ⅱ
    给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。不允许修改链表。整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如果pos是-1,则在该链表中没有环。......
  • C++知识点总结
    第二章1.基本数据类型int有16位,即两个字节,char只占一个字节。在VisualC++6.0中,对float提供6位有效数字,对double提供15位有效数字,并且float和double的数值范围不同。对float分配4个字节,对double和longdouble分配8个字节。2.常变量关键字const。变量的值在程序运行期间不能改......
  • C++:最大值最小值及其索引
    std::max_element和std::min_element 是C++标准库<algorithm>中的函数,可以得到数组和向量(vector)的最值及其索引intcard[6]={1,2,3,4,5,6}intmaxValue=*max_element(card.begin(),card.end());intminValue=*min_element(card.begin(),card.end());intmaxPositi......
  • C++ --- 函数重载
    什么是函数重载函数重载: 是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型或顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。函数重载是C++在C语言基础上进行的改进,解决了C语言同名函数无法服务不同类型......
  • C++U5-11-特殊二叉树
    学习目标 完全二叉树:二又树拥有的性质,在完全二叉树中都拥有 性质 练习1 练习2 练习3编程题:[完全二叉树的叶子结点]【算法分析】递归,前序遍历输出。【参考代码】#include<iostream>usingnamespacestd;constintSIZE=1010;structnode{......
  • 设计模式<c++> (1)策略模式
    一、定义策略模式定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。二、使用场景客户需要很多种鸭子。要求:1.每种鸭子都要会游泳。2.每种鸭子有叫和飞的行为。3.鸭子的叫和飞的行为可以在使用......
  • C++ Qt开发:Charts折线图绘制详解
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QCharts折线图的常用方法及灵活运用。折线图(LineChart)是一种常用的数据可视化图表,用于展示随着......
  • 浅谈C++STL(Standard Template Library,标准模板库)
    2.1STL的诞生长久以来,软件界一直希望建立一种可重复利用的东西C++的面向对象和泛型编程思想,目的就是复用性的提升大多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作为了建立数据结构和算法的一套标准,诞生了STL2.2STL基本概念STL(StandardTemplateLibrary,标......
  • c语言单链表
    #include<stdio.h>#include<stdlib.h>#defineERROR-1#defineSUCCESS0structlist_node{intdata;structlist_node*next;/*data*/};typedefstructlist_nodelink_list;intlist_get_size(link_list*list){intcount=0;......