链表头文件大更新!!!

引言

原文章:链表简介及自制链表操作头文件_自己写一个链表头文件-CSDN博客。

此次更新添加了更多功能,让改头文件更 人性化

安装教程见原文章。

介绍 linked_list.h 头文件

linked_list.h 是一个 C++ 头文件,定义了一个模板类 LinkedList,用于实现单向链表。链表中的每个节点由 Node 结构体表示,包含数据和指向下一个节点的指针。LinkedList 类提供了多种操作链表的方法,包括插入、删除、查找、打印、获取链表大小、判断链表是否为空等。此外,还定义了链表的加法和减法运算。

头文件内容
#ifndef LINKED_LIST_H
#define LINKED_LIST_H
#pragma once#include <iostream>template <typename T>
struct Node {T data;Node* next;Node(T data) : data(data), next(0) {}  // 使用 0 替换 nullptr
};template <typename T>
class LinkedList {
public:LinkedList();~LinkedList();void insert(T data);void remove(T data);Node<T>* search(T data);void print() const;int size() const;bool isEmpty() const;Node<T>* getHead() const;Node<T>* getTail() const;// 加法运算LinkedList<T>& operator+(const LinkedList<T>& other);// 减法运算LinkedList<T>& operator-(const LinkedList<T>& other);private:Node<T>* head;
};template <typename T>
LinkedList<T>::LinkedList() : head(0) {}  // 使用 0 替换 nullptrtemplate <typename T>
LinkedList<T>::~LinkedList() {Node<T>* current = head;while (current) {Node<T>* next = current->next;delete current;current = next;}
}template <typename T>
void LinkedList<T>::insert(T data) {Node<T>* newNode = new Node<T>(data);if (!head) {head = newNode;} else {Node<T>* current = head;while (current->next) {current = current->next;}current->next = newNode;}
}template <typename T>
void LinkedList<T>::remove(T data) {if (!head) {return;}if (head->data == data) {Node<T>* temp = head;head = head->next;delete temp;return;}Node<T>* current = head;while (current->next && current->next->data != data) {current = current->next;}if (current->next) {Node<T>* temp = current->next;current->next = current->next->next;delete temp;}
}template <typename T>
Node<T>* LinkedList<T>::search(T data) {Node<T>* current = head;while (current) {if (current->data == data) {return current;}current = current->next;}return 0;  // 使用 0 替换 nullptr
}template <typename T>
void LinkedList<T>::print() const {Node<T>* current = head;while (current) {std::cout << current->data << " ";current = current->next;}std::cout << std::endl;
}template <typename T>
int LinkedList<T>::size() const {int count = 0;Node<T>* current = head;while (current) {count++;current = current->next;}return count;
}template <typename T>
bool LinkedList<T>::isEmpty() const {return head == 0;  // 使用 0 替换 nullptr
}template <typename T>
Node<T>* LinkedList<T>::getHead() const {return head;
}template <typename T>
Node<T>* LinkedList<T>::getTail() const {Node<T>* current = head;Node<T>* tail = 0;  // 使用 0 替换 nullptrwhile (current) {tail = current;current = current->next;}return tail;
}// 加法运算
template <typename T>
LinkedList<T>& LinkedList<T>::operator+(const LinkedList<T>& other) {Node<T>* current = other.head;while (current) {this->insert(current->data);current = current->next;}return *this;
}// 减法运算
template <typename T>
LinkedList<T>& LinkedList<T>::operator-(const LinkedList<T>& other) {Node<T>* current = other.head;while (current) {this->remove(current->data);current = current->next;}return *this;
}
#endif

使用样例

1. 创建和操作整数链表
#include "linked_list.h"int main() {LinkedList<int> list1;list1.insert(1);list1.insert(2);list1.insert(3);std::cout << "List1: ";list1.print();  // 输出: 1 2 3LinkedList<int> list2;list2.insert(4);list2.insert(5);std::cout << "List2: ";list2.print();  // 输出: 4 5// 加法运算list1 = list1 + list2;std::cout << "List1 + List2: ";list1.print();  // 输出: 1 2 3 4 5// 减法运算list1 = list1 - list2;std::cout << "List1 - List2: ";list1.print();  // 输出: 1 2 3// 查找元素Node<int>* found = list1.search(2);if (found) {std::cout << "Found: " << found->data << std::endl;  // 输出: Found: 2} else {std::cout << "Not found" << std::endl;}// 删除元素list1.remove(2);std::cout << "After removing 2: ";list1.print();  // 输出: 1 3return 0;
}
2. 创建和操作字符串链表
#include "linked_list.h"int main() {LinkedList<std::string> list1;list1.insert("apple");list1.insert("banana");list1.insert("cherry");std::cout << "List1: ";list1.print();  // 输出: apple banana cherryLinkedList<std::string> list2;list2.insert("date");list2.insert("elderberry");std::cout << "List2: ";list2.print();  // 输出: date elderberry// 加法运算list1 = list1 + list2;std::cout << "List1 + List2: ";list1.print();  // 输出: apple banana cherry date elderberry// 减法运算list1 = list1 - list2;std::cout << "List1 - List2: ";list1.print();  // 输出: apple banana cherry// 查找元素Node<std::string>* found = list1.search("banana");if (found) {std::cout << "Found: " << found->data << std::endl;  // 输出: Found: banana} else {std::cout << "Not found" << std::endl;}// 删除元素list1.remove("banana");std::cout << "After removing banana: ";list1.print();  // 输出: apple cherryreturn 0;
}

应用实例

1. 数据管理

链表可以用于管理动态数据,例如在内存管理中,链表可以用于管理空闲内存块。每个节点可以表示一个空闲内存块,链表可以动态地插入和删除节点,以适应内存分配和释放的需求。

2. 文件系统

在文件系统中,链表可以用于管理文件和目录的链接。每个节点可以表示一个文件或目录,链表可以动态地插入和删除节点,以适应文件系统的增删改查操作。

3. 队列和栈

链表可以用于实现队列和栈。队列可以通过在链表的尾部插入元素和在头部删除元素来实现,而栈可以通过在链表的头部插入和删除元素来实现。

4. 图形用户界面

在图形用户界面中,链表可以用于管理窗口和控件的层次关系。每个节点可以表示一个窗口或控件,链表可以动态地插入和删除节点,以适应用户界面的动态变化。

以上就是本文章的全部内容。安装教程见链表简介及自制链表操作头文件_自己写一个链表头文件-CSDN博客。

关煮一下吧你的认可就是我最大的动力~~


求关注~

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

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

相关文章

【python自动化四】日志打印

我们在进行自动化测试时&#xff0c;需要打印过程日志和结果日志等&#xff0c;这里记录下日志的相关配置。这里我们直接自己新建一个logger。 先贴上日志代码如下&#xff0c;可根据需要修改&#xff1a; import logging import os import timefrom logging.handlers import …

【精选】AI Coding 新范式:Windsurf、Cursor、Coze齐上阵

2AGI.NET | 探索 AI 无限潜力&#xff0c;2AGI 为您带来最前沿资讯。 随着人工智能技术的飞速发展&#xff0c;AI Coding领域迎来了前所未有的变革。Codeium的Windsurf、Cursor的agent模式更新、Copilot的新版本以及Coze的AI应用能力&#xff0c;都在推动着编程领域的创新。本期…

Free-RTOS实现LED闪烁

开发板&#xff1a;正点原子探索者 F407 LED定时定时闪烁 本次实验验证&#xff1a; 配置文件 1、打开CubeMX 2、选择芯片型号&#xff0c;然后点击开始项目 3、配置时钟 配置烧录引脚&#xff0c;与FreeRTOS系统时钟 选择FreeRTOS 这里已经默认有一个任务&#xff…

java+ssm+mysql水产品商城

项目介绍&#xff1a; 使用javassmmysql开发的水产品商城&#xff0c;系统包含管理员、用户角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;用户管理&#xff1b;种类管理&#xff1b;商品管理&#xff1b;订单管理&#xff1b;评论管理&#xff1b;新闻管理&#…

SYN6288语音合成模块使用说明(MicroPython、STM32、Arduino)

模块介绍 SYN6288中文语音合成模块是北京宇音天下科技有限公司推出的语音合成模块。该模块通过串口接收主控传来的语音编码后&#xff0c;可自动进行自然流畅的中文语音播报。 注&#xff1a;SYN6288模块无法播报英文单词和句子&#xff0c;只能按字母播报英文 &#xff1b;而…

Windows设备go环境安装配置

一、下载go安装包 官网链接&#xff1a;All releases - The Go Programming Language (google.cn) 安装过程比较简单&#xff0c;这里不再赘述&#xff0c;可参考这位博主的文章。本文重点在环境配置。golang环境详细安装、配置_golang安装-CSDN博客 二、环境变量配置 1.添…

vulnhub靶场【hacksudo】之aliens

前言 靶机&#xff1a;hacksudo-aliens 攻击&#xff1a;kali 都是采用虚拟机的形式&#xff0c;网卡桥接模式 主机发现 使用arp-scan -l或者netdiscover -r 192.168.1.1/24进行探索 信息收集 使用nmap扫描 两个http服务&#xff0c;一个ssh服务 网站信息 访问查看 访…

(数据结构与算法)递归 递归是什么 递归的案例和场景 递归进阶

递归的定义和应用条件 递归就是程序调用自身的编程技巧&#xff1b; 把大型复杂的问题转化为一个与原问题相似规模较小的问题来进行求解&#xff1b; 递归每次调用传入的是不同的变量 递归不是算法&#xff0c;是调用自己的过程 调用的那个是一个小问题&#xff0c;自己是一个…

鼠标右键单击Git Bash here不可用

最近在学习git时突然发现右键的git bash没反应&#xff0c;但是去点击应用图标就能正常运行&#xff0c;通常是因为你在安装git之后改变了它的目录名称或者位置&#xff0c;我就是因为安装后改变了一个文件夹的文件名导致不可用 在安装git时系统会默认给鼠标右键选项的git Bas…

【0x0002】HCI_Inquiry_Cancel命令详解

目录 一、命令概述 二、命令格式及参数说明 三、返回事件及参数说明 3.1. HCI_Command_Complete事件 3.2. Status 3.3. 示例 四、命令执行过程 4.1. 前提条件检查 4.2. 命令构建与发送 4.3. 控制器处理 4.4. 返回状态参数 4.5. 主机接收反馈与处理 4.6. 执行流程结…

OpenAI 12Days 第二天 强化微调(RFT):推动语言模型在科学研究中的应用

OpenAI 12Days 第二天 强化微调&#xff08;RFT&#xff09;&#xff1a;推动语言模型在科学研究中的应用 文章目录 OpenAI 12Days 第二天 强化微调&#xff08;RFT&#xff09;&#xff1a;推动语言模型在科学研究中的应用RFT的工作原理与应用领域案例研究&#xff1a;基因突变…

公共云提供商正在错失人工智能机遇

他们目前的成功和增长得益于人工智能的应用&#xff0c;但从长远来看&#xff0c;不可持续的成本和可行的替代方案可能会让企业望而却步。 生成式人工智能正在蓬勃发展&#xff0c;并且将继续蓬勃发展。因此&#xff0c;本地和公共云提供商都看到了对其人工智能产品的需求激增…

【Linux系列】AWK 使用指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

什么是 k8s CNI ?

1、什么是 CNI &#xff1f; CNI 是容器网络接口 &#xff08;Container Network Interface&#xff09;的缩写。定义了容器运行时如何与网络插件进行交互&#xff0c;从而管理容器网络。只要开发者遵循 CNI 定义的规范就可以接入 kubernetes &#xff0c;为 Pod 创建虚拟网卡…

深入理解进程的退出、等待与替换(Linux系统)

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;Linux学习、游戏、数据结构、c语言基础、c学习、算法 目录 一、进程退出 1.退出场景 2.常见退出方法 3.退出码与退出信号 4._exit函数与exit函数 二、进程等待 1.什么是进程等待&#xff08;是什么&#xff1f;…

【初阶数据结构与算法】二叉树链式结构刷题训练(Leetcode二叉树遍历、单值二叉树、相同的树、另一棵树的子树、对称二叉树)

文章目录 一、二叉树的遍历二、单值二叉树三、相同的树四、另一颗树的子树五、对称二叉树 一、二叉树的遍历 在链式二叉树的定义与实现中我们已经详细讲解了二叉树常见的三种遍历方式&#xff0c;以及层序遍历&#xff0c;这里给出链接&#xff1a;【初阶数据结构与算法】二叉树…

深入浅出 Go 语言 sync包中的互斥锁、条件变量

深入浅出 Go 语言 sync包中的互斥锁、条件变量 引言 在并发编程中&#xff0c;多个 Goroutine 同时访问共享资源可能会导致数据竞争&#xff08;Race Condition&#xff09;&#xff0c;进而引发程序的不一致性或崩溃。为了确保并发程序的正确性和稳定性&#xff0c;Go 语言提…

制造业数据集成案例分享:3小时内实现MySQL到MySQL数据对接

ZZ刷新生产用料清单四化库存-制造一处-3小时&#xff1a;MySQL到MySQL数据集成案例分享 在现代制造业中&#xff0c;实时、准确的数据流动是确保生产效率和资源优化的关键。本文将分享一个实际运行的系统对接集成案例——“ZZ刷新生产用料清单四化库存-制造一处-3小时”&#…

OpenCV 图像基本操作

OpenCV快速通关 第一章&#xff1a;OpenCV 图像基本操作 第二章&#xff1a;OpenCV 图像基本操作 OpenCV 图像基本操作 OpenCV快速通关第二章&#xff1a;OpenCV 图像基本操作一、相关结构体与函数介绍&#xff08;一&#xff09;cv::Mat 结构体&#xff08;二&#xff09;cv:…

雨晨 2610(2)0.2510 Windows 11 24H2 Iot 企业版 LTSC 2024 极简 2in1

文件: 雨晨 2610(2)0.2510 Windows 11 24H2 Iot 企业版 LTSC 2024 极简 2in1 install.esd 索引: 1 名称: Windows 11 IoT 企业版 LTSC 极简 26100.2510 描述: Windows 11 IoT 企业版 LTSC 极简 26100.2510 By YCDISM RTM 2025 24-12-07 大小: 8,176,452,990 个字节 索引: 2 …