当前位置: 首页 > news >正文

链表的实现

本程序List链表用两种方式实现,一种是双向链表,一种是双向循环链表。循环双向链表和双向链表,它们的编码差别很小;但是循环链表在插入效率上胜出很多,同时查询时候更灵活。综合考虑,循环链表是首选。

另外,不同于Windows上的ListEntry结构,本LIST结构没有链表头。对于链表头,各有各的说法,但是天下没有免费的午餐,某个地方得了好处,必然会在别的地方承担一定的损失。总之一句话,我个人的理念是,中间代码尽可能简单易用,以此链表头弃之不用。

非常简单的两种链表实现,主要是查询、插入、删除几个功能的实现,总共的cpp代码不过300行左右,在座的各位都是软件开发小能手,功能实现不再赘述。

完整工程代码:https://github.com/satadriver/dataStruct

头文件:

#pragma once#include "Element.h"#pragma pack(1)typedef struct  _LIST
{_LIST* prev;_LIST* next;ELEMENT* e;
}LIST;#pragma pack()class List {
public:List();~List();int insert(ELEMENT* e);int remove(ELEMENT* e);protected:LIST* search(ELEMENT* e);LIST* mList;int mSize;
};class CList {
public:CList();~CList();int insert(ELEMENT* e);int remove(ELEMENT* e);protected:LIST* search(ELEMENT* e);LIST* mList;int mSize;
};

循环双向链表实现代码如下:

int CList::clear() {LIST* l = mList;int cnt = 0;do{if (l == 0){break;}LIST* next = l;delete l->e;delete l;l = next;cnt++;} while (l != mList);return cnt;
}CList::CList() {mList = 0;mSize = 0;
}CList::CList(LIST* l) {mList = l;mSize = 0;
}CList::~CList() {if (mList){delete[] mList;mList = 0;}
}LIST* CList::search(ELEMENT* e) {LIST* list = mList;int cnt = 0;do{if (list == 0){break;}if (list->e->e == e->e){return list;}list = list->next;cnt++;} while (list != mList);return 0;
}int CList::insert(ELEMENT* e) {LIST* list = search(e);if (list){return 0;}list = new LIST;ELEMENT* e_new = new ELEMENT;memcpy(e_new, e, sizeof(ELEMENT));list->e = e_new;if (mList == 0){list->next = list;list->prev = list;mList = list;}else {LIST* prev = mList->prev;list->next = mList;list->prev = mList->prev;if (prev){prev->next = list;}mList->prev = list;}mSize++;return 1;
}int CList::remove(ELEMENT* e) {LIST* list = search(e);if (list == 0){return 0;}LIST* next = list->next;LIST* prev = list->prev;if (next){next->prev = prev;}if (prev){prev->next = next;}delete list->e;if (list == mList){if (mList->next == mList || mList->prev == mList){mList = 0;}else {mList = mList->next;}}delete list;int result = mSize;mSize--;return result;
}

双向链表实现代码:

List::List() {mList = 0;mSize = 0;
}List::List(LIST* l) {mList = l;mSize = 0;
}List::~List() {if (mList){delete[] mList;mList = 0;}
}LIST* List::search(ELEMENT* e) {LIST* list = mList;int cnt = 0;while (list){if (list->e->e == e->e){return list;}list = list->next;cnt++;}return 0;
}int List::insert(ELEMENT* e) {LIST* list = search(e);if (list){return 0;}list = new LIST;ELEMENT* e_new = new ELEMENT;memcpy(e_new, e, sizeof(ELEMENT));list->e = e_new;int cnt = 0;if (mList == 0){list->next = 0;list->prev = 0;mList = list;cnt++;}else {cnt++;LIST* tmp = mList;while (tmp->next){tmp = tmp->next;cnt++;}list->next = 0;list->prev = tmp;tmp->next = list;cnt++;}mSize = cnt;return cnt;
}int List::clear() {LIST* l = mList;int cnt = 0;do{if (l == 0){break;}LIST* next = l;delete l->e;delete l;l = next;cnt++;} while (l != mList);return cnt;
}int List::remove(ELEMENT* e) {LIST* list = search(e);if (list == 0){return 0;}LIST* next = list->next;LIST* prev = list->prev;if (next){next->prev = prev;}if (prev){prev->next = next;}delete list->e;if (list == mList){if (mList->next == 0){mList = 0;}else {mList = mList->next;}}delete list;int result = mSize;mSize--;return result;
}

相关文章:

链表的实现

本程序List链表用两种方式实现,一种是双向链表,一种是双向循环链表。循环双向链表和双向链表,它们的编码差别很小;但是循环链表在插入效率上胜出很多,同时查询时候更灵活。综合考虑,循环链表是首选。 另外…...

c++ std::mutex与std::condition_variable

1. std::mutex lock()加锁; try_lock()尝试加锁; unlock()解锁; std::mutex m_mutex; m_mutex.lock(); ... m_mutex.unlock(); 2. std::lock_guard 类模板;等同自动锁,直接取代lock()和unlock(); 构造时加锁,析构时解锁; std::mutex m_mutex; {std::lock_guard<std:…...

Aspose.Tasks for .NET V23Crack

Aspose.Tasks for .NET V23Crack 改进了大型项目的内存占用。 添加了API&#xff0c;允许您在应用程序无法访问系统字体文件夹时指定用户的字体文件夹。 Aspose.Tasksfor.NET是处理MicrosoftProject文件的可靠的项目管理API。API支持在不依赖Microsoft Project的情况下读取、写…...

vue过渡及动画

文章目录 前言类名使用自己定义动画样式多个元素过渡使用第三方库 前言 对于vue中的过渡与动画&#xff0c;官网上是这样概述的&#xff1a; Vue 在插入、更新或者移除 DOM 时&#xff0c;提供多种不同方式的应用过渡效果。包括以下工具&#xff1a; 在 CSS 过渡和动画中自动…...

Linux环境下SVN服务器的搭建与公网访问:使用cpolar端口映射的实现方法

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…...

【ubuntu】 DNS 设置工具 resolvectl

什么是 resolvectl “resolvectl” 是一个用于管理系统 DNS 解析配置的命令行工具。它是 systemd-resolved 服务的一部分&#xff0c;该服务是在许多基于 Systemd 的 Linux 发行版中用于管理网络配置和 DNS 解析的系统服务。 通过 resolvectl 命令&#xff0c;可以查看当前系…...

Keepalived+Lvs(dr)调度器主备配置小实验

目录 前言 一、实验拓扑图 二、配置LVS&#xff08;dr&#xff09;模式 三、配置调配器热备 四、测试 总结 前言 Keepalived和LVS&#xff08;Linux Virtual Server&#xff09;是两个常用的开源软件&#xff0c;通常结合使用以提供高可用性和负载均衡的解决方案。 Keepalive…...

第四讲Java基本语法——数组结构(多维数组)

前言 前面几讲,我们讲了Java基本语法,初学者也能够有一定的入门。本讲,我们也是继续来讲解一下Java另一个基础语法——数组,其实在前面讲解数据类型的时候,我们也有提到数组是引用类型,那今天我们就来分析一下什么是数组,怎么用数组呢? 一、数组是什么 数组是…...

【题解】JZOJ6578 / 洛谷P5201[USACO2019Jan]Shortcut G

洛谷 P5201 [USACO19JAN] Shortcut G 题意 在一个带权无向连通图上&#xff0c;每个点有 a i a_i ai​ 只奶牛&#xff0c;奶牛会走最短路径到 1 1 1&#xff0c;如果有多条路径&#xff0c;选择字典序最小的&#xff0c;定义移动总时间为所有奶牛走到 1 1 1 的时间之和。…...

npm install sentry-cli失败的问题

1. 目前报错 2. 终端运行 npm set ENTRYCLI_CDNURLhttps://cdn.npm.taobao.org/dist/sentry-cli npm set sentrycli_cdnurlhttps://cdn.npm.taobao.org/dist/sentry-cli3. 再安装 npx sentry/wizardlatest -i nextjs即可成功...

Node opensslErrorStack 错误解决方法记录

从Git仓库中下载了一个老项目&#xff0c;使用npm install 安装后没有问题&#xff0c;当我使用npm run dev 的时候遇到了 OpenSSL 相关错误&#xff0c;例如 opensslErrorStack: [error:03000086:digital envelope routines::initialization error] 网上找了一下相关信息&am…...

你知道什么是Grandmillennial风格吗,进来看看吧

如果你既欣赏祖母的印花棉布扶手椅和大胆的图案&#xff0c;又喜欢千禧一代朋友现代家居中的开放空间和时尚家具&#xff0c;那么 "千禧一代 “风格就是为你量身打造的。它借鉴了几十年来的流行趋势&#xff0c;形成了一种独特的、带有现代风格的老式设计。 在典型的 &quo…...

App Inventor 2 开发 ChatGPT 对话App

ChatGPT大家应该不会陌生&#xff0c;它的回答内容非常的专业及深入&#xff0c;具有实际的可指导性。我们通过App Inventor 2开发一个简单的对话App&#xff0c;先看效果&#xff1a; App Inventor 2 ChatGPT教育领域对话演示 代码块如下&#xff1a; 用到的核心组件“ChatBot…...

SQL 大小敏感问题

在SQL中&#xff0c;关键字和函数名 是不区分 大小写的 比如&#xff08;select、where、order by 、group by update 等关键字&#xff09;&#xff0c;以及函数(ABS、MOD、round、min等) window系统默认是大小写不敏感 &#xff08;ZEN文件和zen 文件 不能同时存在&#xff…...

微信小程序+Taro 混编,Taro 使用微信原生 behaviors

最近有一个小程序项目&#xff0c;因为一些原因项目架构选择了微信小程序原生Taro 混编的方式进行开发&#xff0c;在开发的过程中发现 Taro 不支持使用原生的 behaviors 特性&#xff0c;因为混编的原因项目当中已有原生页面在使用 behaviors&#xff0c;所以需要一个方案在不…...

b树/b+树、时间轮、跳表、LSM-Tree

b树、b树&#xff1a;关系型数据库核心存储结构 1、为什么磁盘数据存储结构用B树、而不用红黑树 磁盘每次读取不是读一个节点、是返回一页数据。 红黑树每次遍历一个节点排除一半数据。 B树通常映射相邻的磁盘页数据。4K mysql索引一个节点隐射16k故而映射4倍&#xff0c;故…...

Unity OnDrawGizmos的简单应用 绘制圆形

编辑器和配置表各有各的好。 卡牌游戏即使再复杂&#xff0c;哪怕是梦幻西游&#xff0c;大话西游那种&#xff0c;甚至wow那种&#xff0c;用配表都完全没问题。但是崩坏3&#xff0c;或者鬼泣&#xff0c;格斗游戏&#xff0c;可视化编辑器是唯一的选择。 开发初期刚开始配技…...

Uniapp笔记(四)uniapp语法3

一、商品详情 1、从商品列表页跳转到商品详情页 在商品列表的项中绑定单击事件&#xff0c;并传递商品id值 <view class"goods-item" v-for"(item,index) in goodsList" :key"index" click"goGoodsDetail(item.goods_id)"> &…...

leetcode做题笔记105. 从前序与中序遍历序列构造二叉树

给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 思路一&#xff1a;递归 struct TreeNode* buildTree(int* preorder, int preorderSize, int* ino…...

Python里的列表List求和

1、使用sum()函数 numbers [1, 2, 3, 4, 5] total sum(numbers) print(total) # 输出 15 2、注意事项 在使用 sum() 函数获取列表的总和时&#xff0c;需要注意以下几点&#xff1a; sum() 函数只能用于数字类型的可迭代对象&#xff0c;如果 iterable 中包含了非数字类…...

如何构建高效离线OCR解决方案:从引擎选型到性能优化的完整指南

如何构建高效离线OCR解决方案&#xff1a;从引擎选型到性能优化的完整指南 【免费下载链接】Umi-OCR_plugins Umi-OCR 插件库 项目地址: https://gitcode.com/gh_mirrors/um/Umi-OCR_plugins 在数字化办公与信息处理中&#xff0c;文字识别&#xff08;OCR&#xff09;技…...

LightOnOCR-2-1B部署指南:快速搭建你的私有OCR识别服务

LightOnOCR-2-1B部署指南&#xff1a;快速搭建你的私有OCR识别服务 1. 认识LightOnOCR-2-1B 你是否遇到过需要从大量图片中提取文字的场景&#xff1f;比如扫描的合同、拍照的会议记录&#xff0c;或者历史档案数字化&#xff1f;传统的OCR解决方案要么识别准确率不高&#x…...

Pixel Fashion Atelier部署教程:华为云ModelArts平台上的Ascend NPU适配实践

Pixel Fashion Atelier部署教程&#xff1a;华为云ModelArts平台上的Ascend NPU适配实践 1. 项目概述 Pixel Fashion Atelier是一款基于Stable Diffusion与Anything-v5的图像生成工作站&#xff0c;采用独特的像素艺术风格界面设计。与传统AI工具不同&#xff0c;它将图像生成…...

YOLOv9官方镜像深度体验:开箱即用,效果超出预期

YOLOv9官方镜像深度体验&#xff1a;开箱即用&#xff0c;效果超出预期 1. 镜像初体验&#xff1a;零配置启动的惊喜 第一次接触YOLOv9官方镜像时&#xff0c;我带着怀疑的态度——毕竟在深度学习领域&#xff0c;"开箱即用"的承诺往往伴随着各种隐藏的环境配置问题…...

保姆级教程:用SSC Tool 5.13为先楫HPM6E00EVK生成8轴EtherCAT从站代码(附XML配置避坑点)

先楫HPM6E00EVK实现8轴EtherCAT从站开发实战指南 在工业自动化领域&#xff0c;多轴协同控制的需求日益增长。对于嵌入式开发者而言&#xff0c;如何快速搭建一个稳定可靠的EtherCAT从站系统成为关键挑战。本文将基于先楫HPM6E00EVK开发板&#xff0c;详细解析从代码生成到实际…...

水墨江南模型Python入门实践:第一个AI国画生成程序

水墨江南模型Python入门实践&#xff1a;第一个AI国画生成程序 你是不是也刷到过那些充满诗意的AI水墨画&#xff1f;烟雨朦胧的江南水乡&#xff0c;寥寥几笔勾勒出的远山&#xff0c;那种独特的意境让人过目不忘。你可能觉得&#xff0c;要做出这样的画&#xff0c;得是懂艺…...

设计师不用写代码了?实测TRAE SOLO Builder如何将Figma稿秒变可交互网页

设计师如何用TRAE SOLO Builder实现零代码网页开发 在数字产品设计领域&#xff0c;设计师与开发者之间的协作断层长期存在。设计精美的Figma稿转化为实际网页时&#xff0c;往往面临还原度不足、交互细节丢失等问题。TRAE SOLO Builder的出现&#xff0c;正在重新定义设计到开…...

Spring AI实战:从零构建智能聊天与图像生成应用

1. Spring AI初探&#xff1a;你的第一个智能聊天应用 记得第一次接触AI聊天功能时&#xff0c;我盯着那个能对答如流的对话框看了足足十分钟。现在用Spring AI框架&#xff0c;只需要四步就能实现同样的效果。先创建一个标准的Spring Boot项目&#xff0c;这个不用多说&#x…...

2024年TVBOX源接口终极整理:手把手教你如何筛选稳定高速线路

2024年TVBOX源接口高效筛选与优化指南 在流媒体内容消费日益普及的今天&#xff0c;TVBOX作为一款开源播放器解决方案&#xff0c;凭借其强大的扩展性和丰富的资源获取能力&#xff0c;赢得了众多技术爱好者的青睐。然而&#xff0c;面对网络上浩如烟海的源接口资源&#xff0c…...

从TKMath到STL导出:一份OCCTProxy for .NET的模块化封装实战笔记

从TKMath到STL导出&#xff1a;OCCTProxy for .NET的模块化封装实战 在工业软件开发的深水区&#xff0c;几何内核的封装从来都不是简单的语法转换。当我们需要将OpenCASCADE这样的庞然大物引入.NET生态时&#xff0c;C/CLI就像一座精心设计的悬索桥&#xff0c;既要承受原生代…...