C++自定义链表操作实现

C++单链表实现与操作详解 链表的基本构成单元是节点(Node),每个节点承载两部分内容:实际存储的数据和指向下一个节点的引用(指针)。这种分离式设计使得链表可以在运行时动态扩展或收缩,而不受固定容量限制。在C++中,我们通常使用struct或class来封装这一逻辑结构。 阅读详情

author openxmp@163.com
链表操作:
1) 插入
2) operator []
3)  翻转(递归)
4) 翻转(非递归)
5) 求长度

#include <iostream>
using namespace std;
#include <stdio.h>



template<typename T>
class List
{
    //A template-parameter shall not be redeclared within its scope
    //(including nested scopes). A template-parameter shall not have the same
    //name as the template name.
    template<typename U> friend List<U> * recursiveReverse ( List<U> * list );
    template<typename U> friend List<U> * noneRecursiveReverse ( List<U> * list );
public:
    List( );
    List( T &value );
    bool push_back( T &value );
    T operator [] ( int index );
    size_t getSize();
    List *getHead( );
    List *getTail( );
    T getValue ();
    void dump( );
public:
    List *mFirstNode;
    List *mNextNode;
    T mValue;
};

template<typename U>
List<U> *
recursiveReverse ( List<U> * list )
{
    static List<U> * firstNode = 0;
    if ( 0 == list ->mNextNode )
    {
        list ->mFirstNode = list;
        firstNode = list;
        return list;
    }
    List<U> * node = recursiveReverse( list -> mNextNode );
    list -> mNextNode->mNextNode = list;
    list -> mNextNode = 0;
    node -> mFirstNode = firstNode;
    return node;
}

template<typename U>
List<U> * noneRecursiveReverse ( List<U> *list )
{
    List<U> * recursiveHead = 0;
    List<U> * nextNode = 0;
    while ( list )
    {
        nextNode = list->mNextNode;
        list->mNextNode = recursiveHead;
        recursiveHead = list;
        list = nextNode;
    }
    recursiveHead->mFirstNode = recursiveHead;
    return recursiveHead;
}

template<typename T>
List<T>::List():mFirstNode(0),mNextNode(0)
{
}

template<typename T>
List<T>::List(T & value)
{
    mValue = value;
}

template<typename T>
bool
List<T>::push_back( T & value )
{
    if ( 0 == mFirstNode )
    {
        mFirstNode = this;
        mNextNode = 0;
        mValue = value;
        return true;
    }
    List *node = new List( value );
    if ( ! node )
    {
        return false;
    }
    node->mFirstNode = mFirstNode;
    node->mNextNode = 0;
    List *lastNode = mFirstNode;
    while ( lastNode ->mNextNode )
    {
        lastNode = lastNode->mNextNode;
    }
    lastNode->mNextNode = node;
    return true;
}

template<typename T>
T
List<T>::operator [] ( int index )
{
    if ( index < 0 || index > getSize() )
    {
        return 0;
    }
    List *theNode = mFirstNode;
    while ( theNode )
    {
        if ( 0 == index )
        {
            return theNode->mValue;
        }
        theNode = theNode ->mNextNode;
        index --;
    }
    return 0;
}

template<typename T>
size_t
List<T>::getSize()
{
    size_t retval = 0 ;
    List * node = mFirstNode;
    while ( node )
    {
        retval ++;
        node = node ->mNextNode;
    }
    return retval;
}

template<typename T>
List<T> *
List<T>::getHead()
{
    return mFirstNode;
}

template<typename T>
List<T> *
List<T>::getTail()
{
    List * theNode = mFirstNode;
    while ( theNode -> mNextNode )
    {
        theNode = theNode->mNextNode;
    }
    return theNode;
}

template<typename T>
T
List<T>::getValue()
{
    return mValue;
}

template<typename T>
void
List<T>::dump()
{
    List * node = mFirstNode;
    cout << " start dump "<<endl;
    while ( node )
    {
        fprintf(stderr,"[value %d] [address %p]\n",node->mValue,node);
        node = node ->mNextNode;
    }
    cout << endl<< " dump finished " << endl;
}

void unitTest()
{
    typedef List<int> INTLIST;
    INTLIST intList ;
    for (int i = 0; i < 10; ++i)
    {
        intList.push_back(i);
    }
    cout << "get Head "<< intList.getHead()->getValue()<<endl;
    cout << "get Tail "<< intList.getTail()->getValue()<<endl;
    INTLIST *reverseResult = recursiveReverse( & intList );
    reverseResult->dump();
    reverseResult = recursiveReverse(reverseResult);
    reverseResult->dump();
    reverseResult = noneRecursiveReverse(reverseResult);
    reverseResult->dump();
}

int main()
{
    unitTest();
    return 0;
}



链表翻转


#include <iostream>
using namespace std;


struct Node
{
    Node(int value):mValue(value),mNextNode(0)
    {


    }
    int mValue;
    Node *mNextNode;
};


Node *reverse(Node *input)
{
    Node *retval = 0;
    Node *nextNode = 0;
    while ( input )
    {
        nextNode = input->mNextNode;
        input ->mNextNode = retval;
        retval = input;
        input = nextNode;
    }
    return retval;
}


void PrintNode ( Node * head )
{
    while ( head )
    {
        cout << head->mValue<<endl;
        head = head->mNextNode;
    }
}


int main(int argc, char const *argv[])
{
    Node *head = 0;
    Node *currentNode = head;
    for (int i = 0; i < 10; ++i)
    {
        Node *tmpNode = new Node(i);
        if ( 0 == i )
        {
            currentNode = tmpNode;
            head = tmpNode;
            continue;
        }
        currentNode->mNextNode = tmpNode;
        currentNode = tmpNode;
    }        
    Node *reverseNode = reverse(head);
    PrintNode(reverseNode);
    return 0;
}


        
自定义链表 自定义链表 已经编译成功! 绝对可用~ 立即下载

相关推荐

QT代码实现list链表结构

QT代码实现list链表结构,资源中包含单向链表和双向链表

QT List链表用法

QList<QString> list; list<<"1"<<"2"<<"3"<<"4"; // 迭代器正序 // QList<QString>::iterator it; // for (it = list.begin(); it != list.end(); ++it) // { // qDebug()<<*it<<endl; // } // 迭...

时越的博客 6178

C++链表类代码(自己写的)

C++的模版类,实现了链表的基本功能,添删改查。

C/C++学习——自定义数据类型——链表

链表的概念 一、链表的概念 1、链表是一种存储空间能动态进行增长或缩小的数据结构。 2、链表主要用于: (1)建立不定长度的数组。 (2)可以在不重新安排整个存储结构的情况下,方便且迅速地插入和删除数据元素。 3、链表广泛应用于数据管理中。 二、结点 struct NODE{//结点数据类型 ElemType data;//数据域 NODE *link;//指针域 }; 1、ElemType 可以是简单的内置数据类型,也可以是复杂的数据类型, typedef struct t

cbb8234078009的博客 2424

在Cursor IDE中集成Datadog监控:自然语言查询实战指南

在云原生和微服务架构中,可观测性(Observability)已成为保障系统稳定性的核心技术支柱。其核心原理是通过日志(Logs)、指标(Metrics)和追踪(Traces)三大支柱,实时采集并呈现系统的运行状态。这项技术的价值在于,它让开发者能够透视复杂的分布式系统,快速定位性能瓶颈与故障根因。在实际的工程实践中,开发人员常常需要在编码环境与监控平台之间频繁切换,这种上下文切换严重影响了排障效率。本文聚焦于如何利用Model Context Protocol(MCP),将强大的Datadog可观测性平台

weixin_42519772的博客 348

1panel面板实战:Docker容器存储路径迁移与优化指南

本文详细介绍了在1panel面板中迁移Docker容器存储路径的完整流程与优化方法。针对系统盘空间不足的常见问题,通过停服务、搬数据、改配置三个核心步骤,指导用户安全地将Docker数据目录迁移至更大容量的独立分区,并提供了迁移后的深度管理技巧与常见避坑指南,帮助用户优化服务器存储资源。

ol789012的博客 865

c++创造一个链表

刚入门数据结构,尝试一下自己写一个链表

weixin_73000861的博客 961

从零开始用STM32驱动RGB屏:配置PCLK、DE同步信号的避坑指南

本文详细介绍了如何使用STM32驱动RGB接口LCD屏幕,重点解析了PCLK配置、同步信号极性和DE使能等关键参数的设置方法。通过实战代码示例和常见问题排查指南,帮助开发者避免常见配置错误,实现稳定的显示效果。特别针对800x480 IPS屏提供了优化建议和调试技巧。

sky77的博客 540

Qt QLinkedList 详解:从底层原理到高级用法

qlinkedlist

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 4677

不用API Key也能玩转Obsidian AI:本地大模型离线配置全攻略

本文详细介绍了如何在无需API Key的情况下,通过本地部署大型语言模型(LLM)为Obsidian注入AI能力。文章以Ollama为例,提供了从环境准备、模型选择到与Obsidian插件(如Text Generator)集成的完整配置攻略,旨在帮助用户打造一个安全、离线可用的智能笔记工作流,实现数据隐私与AI助力的完美结合。

weixin_29062963的博客 817

【WRF-Urban数据集】 WRF 模型城市冠层参数 GloUCP 的使用

【数据集】 WRF 模型城市冠层参数 GloUCP 的使用

WW、forever的博客 478

C++实现链表

【代码】C++实现链表。

yangjinjingbj的博客 410

工业级C#+YOLOv8缺陷检测系统:准确率98.5%、延迟<50ms的完整实现

本文分享了基于C#和YOLOv8的工业级表面缺陷检测系统实现方案。针对汽车零部件冲压件检测需求(60件/分钟,准确率>98%,延迟<100ms),作者对比了多种技术方案后选择了C#+YOLOv8+ONNX Runtime的组合,最终实现98.5%准确率和42ms延迟。 系统采用分层模块化架构,包含硬件层、采集层、推理层、业务层和控制层。核心优势包括:1)C#在工业环境下的稳定性和集成便利性;2)YOLOv8对复杂缺陷的泛化能力;3)ONNX Runtime GPU加速提升性能。文章详细介绍了硬件

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1140

c++模板实现自定义链表及操作

今天花时间整理了一下C++模板方面的

dengchendeng的专栏 1882

ISP 芯片作为独立设备节点的驱动实现要点:多平台结构差异与工程部署策略解析

随着 ISP(Image Signal Processor)从 SoC 集成形态向独立芯片模块演进,在多摄系统、高动态场景、AI 图像前处理等需求下,ISP 作为单独设备节点进行驱动设计已成为主流趋势。尤其在多 SoC 平台(如高通、联发科、展锐、Rockchip)中,不同厂商对 ISP 的抽象方式与驱动接口处理存在显著差异。本文以实际工程为基础,从 Linux 内核下的设备注册流程、media\_entity 配置、VideoDevice 分配、数据 DMA 管理、与 sensor 的流同步控制等关键点展

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1462

【QNX+Android虚拟化方案】136 - QNX 侧 Coredump 文件解析

【QNX+Android虚拟化方案】136 - QNX 侧 Coredump 文件解析

|~~~热爱生活、努力学习的小伙汁~~~| 1909

链表数据结构及基本操作方法的实现:基于C++的类编程

链表数据结构及基本操作方法的实现:基于C++的类编程 LinkList.h 头文件 #pragma once #include &quot;stdafx.h&quot; #include &amp;lt;iostream&amp;gt; using namespace std; struct NODE { int data; NODE* next; }; class LinkList { private: NODE*...

weixin_43975801的博客 230

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

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

用c/c++自己动手实现一个链表LinkList

链表的特点 便于插入删除,这些操作只要改变指针的指向 遍历查找O(n) 排序复杂度也极大 所以适合插入删除频繁的程序。 实现思想 自建基本的节点数据结构 明确基本操作:初始化、插入、删除、按位置查找、按值查找等等 实现代码 注:vs2008 // LinkList.cpp : Defines the entry point for the console application. //...

一只懒虫的博客 3831

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【C++】从零实现 C++ 自定义 list 容器:双向链表与迭代器深度解析

list容器需要一个迭代器来支持前向和后向遍历。我们设计一个,封装节点指针,并重载->++--等操作符。return tmp;return tmp;代码解读operator*和operator->:分别返回节点的值和地址。++和--:支持前后遍历。==和!:判断两个迭代器是否指向相同节点。本文详细介绍了如何从零实现一个 C++ 双向链表list容器,包括节点结构、迭代器设计、增删操作等。通过这篇文章的学习,希望你对list的底层实现原理有了更深入的理解。C++数据结构与算法:链表详解。

weixin_74837455的博客 3054

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

深入理解 C++ 链表:原理、实现与高级应用

链表是由节点(Node)组成的线性数据结构,每个节点包含数据域(存储元素值)和指针域(存储相邻节点地址)。这种结构使得链表无需预先分配连续内存空间,可在运行时动态调整大小。在 C++ 中,节点通常通过结构体或类实现,例如单链表节点定义:cpp// 单链表节点结构T data;// 数据域// 指针域,指向下一节点自定义链表需处理动态内存管理newdelete)、边界条件检查(空链表、仅有一个节点等)和操作封装(插入、删除、遍历等)。

zqmgx13291的博客 1017

使用C++实现尾插式循环链表结构

总结起来,这段代码提供了一个简洁而实用的尾插式循环链表的实现,适用于需要高效进行顺序添加和按最近添加顺序删除元素的场景。用于创建新节点并将新节点插入到链表的尾部,即每次新增节点都会成为新的末尾节点。因此有必要实现一款属于自己的双向链表,这样在有需要的时候就能随时增加自己的特性,让链表更好的服务于其他模块。在使用C++实现链表时,我们需要实现两个主要的类:1. node节点类 ,2. 链接node节点的类。,该节点的前驱和后继均指向自身,形成一个空链表的“闭环”。,它作为链表中的实际节点实现。

andrewbytecoder 782

C++实现单向链表

LinkList.h #include <windows.h> #include <stdio.h> // 链表结点 typedef struct LINKNODE { void* data; // 可以指向任何类型的数据 LINKNODE* next; }LinkNode; // 链表结构体 typedef...

weixin_30824599的博客 135

C++链表解析:从基础原理到高级应用,全面掌握链表的使用

C++链表解析:从基础原理到高级应用,全面掌握链表的使用

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1880

C++数据结构X篇_05_企业链表的思路和实现(企业链表是企业中经常使用的一种链表;企业链表p_next仅仅指向下一个p_next的地址,链表中并未涉及任何data数据)

/链表指针节点节点 class node_p {public ://链表 class list {public :int size;//初始化链表 list * list_init() {return L;//自定义链表数据节点 class my_data {public :int num;当我们创建my_data的对象指针p1,将其强转成node_p的对象指针a1,a1->next=p1->p_data(具体原理见。

分享学习成长历程,Winter is coming! 365
上一篇: C++操作符重载总结
下一篇: C++快速排序模板法
乔巴好萌
博客等级 码龄15年 228粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值