c++用户管理信息(双向链表)

c++用户管理信息---双向链表

  • ListStu双向链表--(把前面的单链表改一下,就直接可以用)
    • ListStu.h
    • ListStu.cpp

ListStu双向链表–(把前面的单链表改一下,就直接可以用)

ListStu.h

#pragma once
#include "ClassStu.h"class ListStu
{
public:struct StuNode{ClassStu m_cStu;//数据StuNode* m_pPro;//指向前一个节点StuNode* m_pNext;//指向下一个节点StuNode(){m_cStu = 0;m_pNext = nullptr;m_pPro = nullptr;}StuNode(ClassStu& Stu){m_cStu = Stu;m_pNext = nullptr;m_pPro = nullptr;}};using pStuNode = StuNode*;
public://迭代器类class Iterator{public:Iterator(pStuNode Current,pStuNode Head, pStuNode Vail){m_Current = Current;m_Head = Head;m_Vail = Vail;}ClassStu& operator*(){return m_Current->m_cStu;}Iterator& operator++(){if (m_Current == nullptr)//不能是空{return *this;}if (m_Current == m_Vail)//不能是尾部节点{return *this;}m_Current = m_Current->m_pNext;return *this;}Iterator& operator--(){if (m_Current == nullptr){return *this;}if (m_Current == m_Vail){return *this;}m_Current = m_Current->m_pPro;return *this;}bool operator!=(Iterator Itr){return m_Current != Itr.m_Vail;//不等于的时候返回真}private:friend class ListStu;pStuNode m_Current;//当前节点pStuNode m_Head;//头节点pStuNode m_Vail;//尾节点};public:/*******************默认构造系列开始*************************/
/** ListStu* 参数一 : 无* 功能   :默认构造,初始化类成员 --为空* 返回值 :无
*/ListStu();/** ListStu* 参数一 : int* 功能   :默认构造,初始化nCount个成员链表* 返回值 :无
*/ListStu(int nCount);
/** ~ListStu* 参数一 : 无* 功能   :默认析构,释放资源* 返回值 :无
*/~ListStu();/*******************默认构造系列结束*************************///----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------///*******************增删改查系列开始*************************/
/** HeadInsert* 参数一 : ClassStu* 功能   :从头部插入一个数据* 返回值 :ListStu&
*/ListStu& HeadInsert(ClassStu& cStu);/** VailInsert* 参数一 : ClassStu* 功能   :从尾部插入一个数据* 返回值 :ListStu&
*/ListStu& VailInsert(ClassStu& cStu);
/** Insert* 参数一 : pStuNode 需要插入节点的位置   插在这个节点的pStuNode后面* 参数二 : ClassStu& 插入的数据* 功能   : 指定位置插入一个数据* 返回值 : ListStu&
*/ListStu& Insert(Iterator Itr,ClassStu& cStu);/** Detele* 参数一 : pStuNode    删除的前一个节点* 功能   : 从链表中删除一个节点* 返回值 :ListStu&
*/ListStu& Delete(pStuNode PosNode);/** DeteleHead* 参数一 : pStuNode   删除头部节点* 功能   : 删除头部节点* 返回值 : ListStu&
*/ListStu& DeleteHead();/** DeleteVail* 参数一 : pStuNode   删除尾部节点* 功能   : 删除尾部节点* 返回值 : ListStu&
*/ListStu& DeleteVail();
/** DeteleId* 参数一 : 索引* 功能   : 指定索引从链表中删除一个节点* 返回值 : 无
*/ListStu& DeteleId(int nIndex);/** Find* 参数一 : int --序号索引* 功能   : 通过索引查找到数据* 返回值 : 无
*/StuNode* Find(int nIndex);/** FindItr* 参数一 : int --序号索引* 功能   : 查找到数据* 返回值 : Iterator   
*/Iterator FindItr(int nIndex);/** FindFOffset* 参数一 : int --序号索引* 功能   : 根据索引查找到文件偏移* 返回值 : 无
*/int FindFOffset(int nIndex);/** FindId* 参数一 :  int --序号索引* 功能   : 根据索引查找到用户m_Id* 返回值 : 无
*/int FindId(int nIndex);/** UserIdToIndex* 参数一 :  int --用户的m_Id* 功能   : 用户m_Id --查到链表用户的索引* 返回值 : int  nIndex
*/int UserIdToIndex(int UserId);/** UpDate* 参数一 : int --序号索引* 功能   : 修改用户的数据* 返回值 : 无
*/void UpDate(int nIndex,ClassStu& cStu);/*******************增删改查系列结束*************************//*******************迭代器开始*************************/
/** begin* 参数一 : 无* 功能   : 迭代器开始* 返回值 : Iterator
*/Iterator begin(){return Iterator(m_HeaderStu->m_pNext, m_HeaderStu, m_VailStu);}
/** end* 参数一 : 无* 功能   : 迭代器结束* 返回值 : Iterator
*/Iterator end(){return Iterator(m_VailStu, m_HeaderStu, m_VailStu);}/*******************迭代器结束*************************//*******************内部使用函数系列开始*************************/
/** InitDate* 参数一 : int --序号索引* 功能   : 初始化类成员* 返回值 : 无
*/void InitList();/*
* GetMaxUserId
* 参数一 : 无
* 功能   : 查找用户最大的m_Id
* 返回值 : int
*/int GetMaxUserId();/** size* 参数一 : 无* 功能   : 获取元素个数* 返回值 : int
*/int Size();/** BubbleSort* 参数一 : 无* 功能   : 根据成员m_Id --冒泡排序* 返回值 : 无
*///void BubbleSort();/** insertionSort* 参数一 : 无* 功能   : 根据成员m_Id --插入排序法* 返回值 : 无
*///void insertionSort();
/** Sort()* 参数一 : 无* 功能   : 根据成员m_Id --选择性排序法* 返回值 : 无
*/void Sort();/*******************内部使用函数系列结束*************************/private:pStuNode m_HeaderStu;//头节点pStuNode m_VailStu;//尾节点int m_nCount;//记录有多少个成员
};

ListStu.cpp

#include "ListStu.h"ListStu::ListStu()
{InitList();
}ListStu::ListStu(int nCount)
{InitList();for (int i = 0; i < nCount; i++){ClassStu cStu;VailInsert(cStu);}}ListStu::~ListStu()
{//判断是否有成员if (m_nCount == 0){return;}//释放资源//先赋值下一个,在删除当前,以此类推.pStuNode TmpbNode = m_HeaderStu->m_pNext;pStuNode TmpfNode = nullptr;for (int i = 0; i < m_nCount; i++){TmpfNode = TmpbNode->m_pNext;delete TmpbNode;TmpbNode = TmpfNode;}
}ListStu& ListStu::HeadInsert(ClassStu& cStu)
{return Insert(begin(), cStu);
}ListStu& ListStu::VailInsert(ClassStu& cStu)
{return Insert(end(), cStu);
}ListStu& ListStu::Insert(Iterator Itr, ClassStu& cStu)
{if (Itr.m_Current == nullptr){return *this;}auto PosNode = Itr.m_Current;pStuNode ListNode = new StuNode(cStu);PosNode->m_pPro->m_pNext = ListNode;ListNode->m_pPro = PosNode->m_pPro;PosNode->m_pPro = ListNode;ListNode->m_pNext = PosNode;m_nCount++;return *this;
}ListStu& ListStu::Delete(pStuNode PosNode)
{//判断传入的指针是否为空if (PosNode == nullptr){return *this;}//断链  -- 画图PosNode->m_pPro->m_pNext = PosNode->m_pNext;PosNode->m_pNext->m_pPro = PosNode->m_pPro;//释放资源delete PosNode;//元素个数减减m_nCount--;return *this;
}ListStu& ListStu::DeleteHead()
{return Delete(m_HeaderStu->m_pNext);
}ListStu& ListStu::DeleteVail()
{if (m_VailStu->m_pPro == m_HeaderStu){return *this;}return Delete(m_VailStu->m_pPro);
}ListStu& ListStu::DeteleId(int nIndex)
{if (nIndex == 0)//索引为0 就是删除头部{return DeleteHead();}if (nIndex == (m_nCount-1))//索引等于元素个数就是删除尾部{return DeleteVail();}//查找需要删除的节点  pStuNode DeleteNode = Find(nIndex);//进行删除 并返回return Delete(DeleteNode);
}ListStu::StuNode* ListStu::Find(int nIndex)
{//判断 成员个数不为0  nIndex是否有效的值if (m_nCount < 1 ||nIndex < 0 || nIndex > m_nCount){return nullptr;}//遍历查找数据    pStuNode FindNode = m_HeaderStu->m_pNext;for (int i = 0; i < nIndex; i++){FindNode = FindNode->m_pNext;}return FindNode;
}ListStu::Iterator ListStu::FindItr(int nIndex)
{return Iterator(Find(nIndex),m_HeaderStu,m_VailStu);
}int ListStu::FindFOffset(int nIndex)
{pStuNode pFindNode = Find(nIndex);if (pFindNode == nullptr){return 0;}return pFindNode->m_cStu.m_FileOffset;
}int ListStu::FindId(int nIndex)
{pStuNode pFindNode = Find(nIndex);if (pFindNode == nullptr){return 0;}return pFindNode->m_cStu.m_Id;
}int ListStu::UserIdToIndex(int UserId)
{int nIndex = 0;for (auto Val : *this){if (UserId == Val.m_Id){return nIndex;}nIndex++;}return -1;
}void ListStu::UpDate(int nIndex, ClassStu& cStu)
{//先找到要修改的数据pStuNode pUpDate = Find(nIndex);//替换数据   -- cStu里面会自动释放资源pUpDate->m_cStu = cStu;
}void ListStu::InitList()
{m_HeaderStu = new StuNode;m_VailStu = new StuNode;m_HeaderStu->m_pNext = m_VailStu;m_VailStu->m_pPro = m_HeaderStu;m_nCount = 0;
}int ListStu::GetMaxUserId()  //已经排好序的,只要取尾节点的前一个节点的m_Id
{return m_VailStu->m_pPro->m_cStu.m_Id;
}int ListStu::Size()
{return m_nCount;
}void ListStu::Sort()//适合用选择性排序法了{auto nTmp = m_HeaderStu->m_pNext;//第一个节点数据auto cTmp = nTmp->m_pNext;//第二个节点数据for (int i = 0; i < m_nCount - 1; i++){for (int j = 0 + i; j < m_nCount - 1; j++){if ((nTmp->m_cStu.m_Id) > (cTmp->m_cStu.m_Id))//不停的遍历cTmp下一个{//交换数据就好auto nNumber = nTmp->m_cStu;nTmp->m_cStu = cTmp->m_cStu;cTmp->m_cStu = nNumber;}cTmp = cTmp->m_pNext;}nTmp = nTmp->m_pNext;cTmp = nTmp->m_pNext;//重新赋值cTmp为nTmp的下一个节点}}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yarn常用命令小记

安装 npm install -g yarn查看版本 yarn -v初始化项目与依赖管理 yarn init&#xff1a;与npm init一样通过交互式会话生成一个新的package.jason文件以初始化项目&#xff1b;跳过会话可使用yarn init --yes&#xff0c;简写yarn init -yyarn add <package><versi…

【转载】企业资产收集与脆弱性检查工具

简介 云图极速版是针对拥有攻击面管理需求的用户打造的 SaaS 应用&#xff0c;致力于协助用户管理互联网资产攻击面的 SaaS 化订阅服务产品。可实现对备案域名、子域名、IP、端口、服务、网站、漏洞、安全风险等场景进行周期性监控&#xff0c;支持多维度分析攻击面。利用可视化…

java 中开源的html解析库Jsoup 简单例子

下面是一个使用Jsoup库解析HTML的简单Java例子。这个例子展示了如何使用Jsoup从一个HTML字符串中提取数据。 首先&#xff0c;确保你已经将Jsoup作为依赖项添加到你的项目中。如果你使用的是Maven&#xff0c;可以在pom.xml文件中添加以下依赖&#xff1a; &…

《图解设计模式》笔记(一)适应设计模式

图灵社区 - 图解设计模式 - 随书下载 评论区 雨帆 2017-01-11 16:14:04 对于设计模式&#xff0c;我个人认为&#xff0c;其实代码和设计原则才是最好的老师。理解了 SOLID&#xff0c;如何 SOLID&#xff0c;自然而然地就用起来设计模式了。Github 上有一个 tdd-training&…

【达梦数据库】通过系统函数来配置sqllog

环境说明&#xff1a;达梦2024年Q4季度版之后版本支持 通过系统函数进行sqllog参数配置 -- 新增模式 SLOG_CONFIG1 和 SLOG_CONFIG2&#xff1a; SP_SET_SQLLOG_INI([SLOG_CONFIG1]FILE_PATH../log;PART_STOR0;[SLOG_CONFIG2]SWITCH_MODE2;SWITCH_LIMIT128);-- 删除模式名为 S…

redis复习笔记06(小滴课堂)

分布式锁核心知识介绍和注意事项 基于Redis实现分布式锁的几种坑 综合伪代码&#xff1a; 运行&#xff1a;

PDF加粗内容重复读取解决方案

文章目录 前言发现问题解决方案问题分析大致逻辑 show my code 前言 在使用pdfplumber读取PDF的过程中&#xff0c;由于加黑的内容会被莫名其妙的读取两次&#xff0c;带来了很大的困扰。这篇文章将给出解决方案。 发现问题 在在使用pdfplumber读取PDF的过程中&#xff0c;读…

LLaMA 2 - 你所需要的一切资源

摘录 关于 LLaMA 2 的全部资源&#xff0c;如何去测试、训练并部署它。 LLaMA 2 是一个由 Meta 开发的大型语言模型&#xff0c;是 LLaMA 1 的继任者。LLaMA 2 可通过 AWS、Hugging Face 等提供商获取&#xff0c;并免费用于研究和商业用途。LLaMA 2 预训练模型在 2 万亿个标记…

HarmonyOS开发技术全面分析

系统定义 HarmonyOS 是一款 “ 面向未来 ” 、面向全场景&#xff08;移动办公、运动健康、社交通信、媒体娱乐等&#xff09;的分布式操作系统。在传统的单设备系统能力的基础上&#xff0c;HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念&#xff0c;能够…

python读写文件操作的三大基本步骤

目录 基本步骤 常用函数 open()函数 close()函数 read()函数 readlines()函数 readline()函数 write()函数 writelines()函数 with语句 读写操作的应用&#xff1a; 拷贝文件 with 语句的嵌套 逐行拷贝 基本步骤 1. 打开文件&#xff1a;open(filepath, mode, en…

探索亚马逊自养号测评的实际效果与使用感受

自养号在亚马逊测评中的应用给了我们一种全新的体验。通过使用亚马逊自养号&#xff0c;我们发现了许多令人满意的优势&#xff0c;这些优势不仅提升了我们的测评效率&#xff0c;还增加了我们的信誉度。 首先&#xff0c;自养号的质量可控性给了我们极大的信心。我们可以自行…

css中, grid-auto-rows: 怎样简写在grid:中

grid-auto-rows:100px; grid-template-columns:1fr 1fr; &#x1f446;可以写成&#x1f447; grid:auto-flow 100px / 1fr 1fr;在CSS Grid布局中&#xff0c;grid-auto-rows 属性用于指定自动生成的网格容器的行的大小。如果你想要将 grid-auto-rows 的值简写在 grid 属性中&a…

基于CNN-GRU-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 CNN&#xff08;卷积神经网络&#xff09;部分 4.2 GRU&#xff08;门控循环单元&#xff09;部分 4.3 Attention机制部分 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版…

【Vue渗透】Vue站点渗透思路

原文地址 极核GetShell 前言 本文经验适用于前端用Webpack打包的Vue站点&#xff0c;阅读完本文&#xff0c;可以识别出Webpack打包的Vue站点&#xff0c;同时可以发现该Vue站点的路由。 成果而言&#xff1a;可能可以发现未授权访问。 识别Vue 识别出Webpack打包的Vue站…

FFmpeg的HEVC解码器源代码学习笔记-1

一直想写一个HEVC的码流解析工具&#xff0c;看了雷神264码流解析工具&#xff0c;本来想尝试模仿写一个相似的265码流分析工具&#xff0c;但是发现265的解码过程和结构体和264的不太一样&#xff0c;很多结构体并没有完全暴露出来&#xff0c;没有想到很好的方法获得量化参数…

关键字查找,将匹配到的词标红

效果图&#xff1a; 候补 特别说明&#xff1a; 该文有很多新奇的用法&#xff0c;包括载入ui文件、连接信号和控件等等&#xff0c;有很多值得学习的地方 具体实现&#xff1a; 配置文件 #! [0] QT widgets uitoolsHEADERS textfinder.h SOURCES textfinder.cpp main.cpp…

自增a++和自减a--详细解析

1.自增、自减运算符是什么&#xff0c;有什么作用&#xff0c;需要注意什么? 、–;对当前变量值1、-1只能操作变量&#xff0c;不能操作字面量 2.自增、自减运算符放在变量前后有区别吗? 如果单独使用放前放后是没有区别的非单独使用:在变量前&#xff0c;先进行变量自增/…

unity学习(36)——角色选取界面(自制美工)

1.添加一个背景图片&#xff0c;记不住可以查之前的资料&#xff08;4&#xff09; 图片拖入asset&#xff0c;属性设成sprite&#xff1b;把图片拖到source image中&#xff1b;colour白色&#xff08;透明&#xff0c;点一下右边的笔即可&#xff09;&#xff1b;material为…

SpringCloud-Gateway网关的使用

本文介绍如何再 SpringCloud 项目中引入 Gateway 网关并完成网关服务的调用。Gateway 网关是一个在微服务架构中起到入口和路由控制的关键组件。它负责处理客户端请求&#xff0c;进行路由决策&#xff0c;并将请求转发到相应的微服务。Gateway 网关还可以实现负载均衡、安全认…

【零基础学习CAPL】——诊断报文发送

🙋‍♂️【零基础学习CAPL】系列💁‍♂️点击跳转 文章目录 1.概述2.调用CDD的诊断报文发送3.脱离CDD进行诊断报文4.多帧诊断报文的发送4.1.直接定义报文发送4.2调用osek_tp.dll进行多帧数据发送4.3.函数介绍4.4.CAPL脚本实现1.概述 本章主要介绍基于CAPL脚本对诊断报文的…