链表头文件大更新!!!
引言
原文章:链表简介及自制链表操作头文件_自己写一个链表头文件-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博客。
关煮一下吧,你的认可就是我最大的动力~~
求关注~
相关文章:
链表头文件大更新!!!
引言 原文章:链表简介及自制链表操作头文件_自己写一个链表头文件-CSDN博客。 此次更新添加了更多功能,让改头文件更 人性化 。 安装教程见原文章。 介绍 linked_list.h 头文件 linked_list.h 是一个 C 头文件,定义了一个模板类 LinkedListÿ…...
力扣3381.长度可被K整除的子数组的最大元素和
力扣3381.长度可被K整除的子数组的最大元素和 题目 题目解析及思路 题目要求返回一段长度为K的倍数的最大子数组和 同余前缀和 代码 class Solution { public:long long maxSubarraySum(vector<int>& nums, int k) {int n nums.size();vector<long long>…...
http.ServeMux多路复用器的设置
package mainimport ("fmt""net/http" )func first(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "多函数-first") }func second(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "多函数-second") }func ma…...
优化器与优化方法:在现代科学与工程中的应用
目录 编辑 优化器:机器学习中的参数调整 1. 梯度下降系列 2. 动量法(Momentum) 3. Adagrad 4. RMSprop 5. Adam 优化方法:寻找系统最优解 线性规划 非线性规划 凸优化 非凸优化 结论 在当今的科学和工程领域&#…...
笔记本外接显示屏没声音
1、笔记本正常有声音,但是外接显示屏后没有声音了怎么回事呢?原来外接显示屏后笔记本的声音输出会自动选择显示屏的音频输出,但是显示屏可能没有声音输出所以导致笔记本没有声音。 2、解决办法:打开笔记本设置,选择声…...
vue框架
Vue.js是一种用于构建用户界面的JavaScript框架。它是一个轻量级框架,被设计为逐渐采用的渐进式框架,可以与现有项目集成,也可以作为一个完整的单页应用程序框架使用。 Vue.js具有以下特点: 简单易学:Vue.js的API简单…...
Vue指令(一)--v-html、v-show、v-if、v-else、v-else-if、v-on、v-bind、v-for、v-model
目录 (一)初识指令和内容渲染指令v-html 1.v-html 案例: 官网的API文档 (二)条件渲染指令v-show和v-if 1. v-show 2. v-if (三)条件渲染指令v-else和v-else-if 案例 (四…...
ElK 8 收集 MySQL 慢查询日志并通过 ElastAlert2 告警至飞书
文章目录 1. 说明2. 启个 mysql3. 设置慢查询4. filebeat 设置5. 触发慢查询6. MySQL 告警至飞书 1. 说明 elk 版本:8.15.0 2. 启个 mysql docker-compose.yml 中 mysql: mysql:# restart: alwaysimage: mysql:8.0.27# ports:# - "3306:3306&q…...
QT通过在线安装器安装【详细】
在线安装器地址: 官方在线安装器:Index of /official_releases/online_installers (qt.io) 通过命令行启动安装页面 直接双击qt安装程序,在线安装会非常慢,甚至安装失败,所以通过命令行页面启动安装页面。点击wind…...
34.1 uber开源的m3db简介
本节重点介绍 : m3db自己的定位m3db自己的架构m3db自己的组件 两句话简介 M3最初是在优步开发的,目的是提供对优步业务运营,微服务和基础架构的可视性由于M3具有轻松进行水平扩展的能力,因此它为所有监视用例提供了一个集中式存储解决方案…...
MATLAB 最小二乘点云拟合球 (89)
MATLAB 最小二乘点云拟合球 (89) 一、算法介绍二、算法实现1.代码2.结果这是缘,亦是最美的相见 一、算法介绍 球面拟合算法是一种通过数学方法将一组三维点(通常在三维空间中分布)拟合到一个理想的球形表面上。这个过程通常涉及使用最小二乘法来最小化实际数据点与拟合的…...
【Altium Designer 】AD如何使用嘉立创元器件的3D封装
1.下载3D封装 以STM32F407VGT6为例,进入嘉立创商城网站,找到需要的元器件封装 复制编号,打开嘉立创EDA,编译器选择专业版,新建工程,点击PCB1 复制编号在搜索框中,点击搜索,然后放置…...
G15沈海高速茶白高架自动化监测
1. 项目简介 G15 沈海高速公路北起辽宁省沈阳市苏家屯区金宝台枢纽,与沈阳市绕城高速公路(国家高速 G1501)相接,南至海南省海口市秀英区粤海枢纽,与海南地区环线高速公路(国家高速 G98)相交&am…...
网站从渗透到mssql提权全过程
2|0渗透全过程 1.信息收集-端口探测 1)Nmap端口探测:namp -sS -p 1-65535 172.16.12.103 可以看到端口开放情况 2.判断系统情况 根据端口情况初步判定为IISmssql.net系统,访问web站点URL应该为:http:172.16.12.103:27689 访问…...
Qt多线程与QTimer详解
引用 Qt多线程中使用QTimer(常见问题汇总) [多线程]多线程使用QTimer Qt::ConnectionType:Qt不同类型connect的详细区别说明与应用 Qt的4种多线程实现方式 一文搞定之Qt多线程(QThread、moveToThread) QTimer The QTimer class provides repe…...
基于stm23的智慧宿舍系统 (DAY10)_小程序
好久没记录开发进度了,今天小程序差不多开发完了,UI这块算是比较常见了,主要功能是能连接onenet查看设备上传的数据,同时也能对设备进行一些控制下面是几个主要的函数,功能比较简单 wx.request({url: ${apiBaseUrl}/t…...
深入理解Spring事务
目录 什么是Spring事务为什么需要Spring事务Spring事务的实现 Spring事务的传播机制Spring事务的底层原理 EnableTransactionManagement --开启Spring管理事务Import(TransactionManagementConfigurationSelector.class) --提供两个beanAutoProxyRegistrar --启用AOP的功能&am…...
Ubuntu22.04深度学习环境安装【Anaconda+Pycharm】
anaconda可以提供多个独立的虚拟环境,方便我们学习深度学习(比如复现论文); Pycharm编辑器可以高效的编写python代码,也是一个很不错的工具。 下面就记录下Ubuntu22.04的安装流程: 1.Anaconda安装 下载Ana…...
五、docker的网络模式
五、docker的网络模式 5.1 Docker的四种网络模式 当你安装docker时,它会自动创建三个网络,可使用如下命令查看: [rootlocalhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 7390284b02d6 bridge bridge lo…...
使用el-row和el-col混合table设计栅格化,实现表头自适应宽度,表格高度占位
演示效果: 如上图,由于地址信息很长,需要占多个格子,所以需要错开,若想实现这种混合效果,可以这样搭建: 页面效果: 代码分析: 上面使用el-row和el-col搭建表单显示 第一排三个8,第二排8和16 下面混合table实现,并使用border来自适应宽度…...
Python数据聚合抓取工具:从配置化引擎到实战避坑指南
1. 项目概述:一个多功能的“聚合爪”工具最近在GitHub上闲逛,发现了一个名字挺有意思的项目:al1enjesus/polyclawster。这个名字拆开看,“poly”代表多,“clawster”听起来像是“claw”(爪子)和…...
CN2628 可用太阳能供电 5 伏特低压差电压调制集成电路
概述: CN2628是一款可用太阳能供电的低噪声线性电压调制集成电路,采用固定5.0V输出电压,最大 输出电流可达1安培,在5.5V到7V的输入电压范围内输出电压精度可达1%。CN2628工作电流只有520微安,而且同输入和输出的压差没有关系。 CN…...
Kubernetes上Jenkins全栈部署:动态Agent与生产环境调优指南
1. 项目概述:一个面向Kubernetes的Jenkins全栈部署方案在容器化和云原生技术成为主流的今天,如何高效、稳定地部署和管理持续集成/持续交付(CI/CD)流水线,是每个开发团队和运维工程师必须面对的课题。传统的单体Jenkin…...
【最新v2.7.1 版本安装包】OpenClaw 小白入门必看,零基础无需命令零代码保姆级教学
OpenClaw v2.7.1 一键安装部署教程|可视化傻瓜式搭建 ✨适配系统:Windows10/11 64 位 ✨当前版本:v2.7.1 版本(虾壳云版) ✨安装包大小:58.7MB 【点击下载最新安装包】https://xiake.yun/api/download/…...
Docker容器MCP服务镜像:AI安全运维与自动化实践
1. 项目概述:一个为Docker容器提供MCP服务的镜像最近在折腾一些自动化工作流,发现很多工具都开始支持一种叫做MCP(Model Context Protocol)的协议。简单来说,MCP就像是一个标准化的“插座”,让各种AI模型&a…...
基于二维码的文件分片传输:原理、实现与安全应用
1. 项目概述:一个基于二维码的智能文件分发系统 最近在折腾一个挺有意思的小项目,源于一个很实际的需求:如何在不同的设备之间,安全、便捷地传输一些敏感或临时的文件,而不依赖任何第三方云存储或即时通讯工具。你可能…...
湿版摄影风格失效的5个致命误区,第4个连Midjourney官方文档都未披露——基于217组AB测试的权威归因报告
更多请点击: https://intelliparadigm.com 第一章:湿版摄影风格失效的5个致命误区,第4个连Midjourney官方文档都未披露——基于217组AB测试的权威归因报告 为何“wet plate collodion”提示词突然失灵? 在 Midjourney v6.1 及 N…...
基于Slack Bolt与OpenAI API构建企业级AI助手:从集成部署到高级应用
1. 项目概述:当ChatGPT遇上Slack,团队协作的智能革命 如果你和我一样,每天的工作都泡在Slack里,与团队沟通、同步进度、处理各种消息,那你一定也经历过这样的时刻:一个技术问题卡住了,需要快速…...
Sunshine游戏串流架构深度解析:3种高效部署方案完全指南
Sunshine游戏串流架构深度解析:3种高效部署方案完全指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine作为一款开源自托管的游戏串流服务器,为Mo…...
百度网盘Mac版破解插件:免费解锁SVIP高速下载的终极指南
百度网盘Mac版破解插件:免费解锁SVIP高速下载的终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘Mac版的龟速下载而烦…...
