此文为上一篇文章改为C++格式实现(多文件形式)

头文件

#pragma once
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;struct Node
{int iData;struct Node* pNext;      //记录后一个节点地址struct Node* pPre;       //记录前一个节点的地址
};class SX
{private:struct Node* g_pHead = NULL;struct Node* g_pEnd = NULL;int g_iNodeCount = 0;private://释放链表void FreeList();
public:SX();~SX();
public://尾添加void AddToEnd(int iData);//遍历链表 1.正向 2.反向void LookZheng();void LookFan();//头添加void AddToHead(int iData);//指定的下标位置添加void InsertNodeByIndex(int iIndex, int iCount, int iData);//指定数据位置添加节点void InsertNodeByData(int iValue, int iData);//根据下标查询struct Node* GetByIndex(int iIndex);//根据数据查询struct Node* GetByData(int iData);//修改void ChangeByIndex(int iIndex, int iValue);void ChangeByData(int iData, int iValue);//根据下标删除节点void DeleteByIndex(int iIndex);//删除节点void DeleteNode(struct Node* pTemp);//根据数据删除所有与之相同的节点void DeleteByData(int iValue);
};

函数实现

#include"sx.h"SX::SX()
{}
SX::~SX()
{FreeList();
}void SX::DeleteByData(int iValue)
{//while (1)//{//   //找//   struct Node* pTemp = GetByData(iValue);//  if (pTemp == NULL)//      break;//    DeleteNode(pTemp);//}struct Node* pTemp = NULL;while (NULL != (pTemp = GetByData(iValue)))DeleteNode(pTemp);
}
void SX::DeleteNode(struct Node* pTemp)
{//是否为头结点if (pTemp == g_pHead){if (g_pHead == g_pEnd){delete g_pHead;g_pHead = NULL;g_pEnd = NULL;}else{//1.//记录头//struct Node* pT = g_pHead;头指向下一个//g_pHead = g_pHead->pNext;头前设置为NULL//g_pHead->pPre = NULL;释放//free(pT)2.记录头头指向下一个//g_pHead = g_pHead->pNext;头前设置为NULL//g_pHead->pPre = NULL;释放//free(pTemp);//3.头指向下一个g_pHead = g_pHead->pNext;//释放头的前一个节点delete (g_pHead->pPre);//头前置NULLg_pHead->pPre = NULL;}}//尾节点else if (pTemp == g_pEnd){g_pEnd = g_pEnd->pPre;delete(g_pEnd->pNext);g_pEnd->pNext = NULL;}//中间节点else{//让其前一个节点的pNext 指针指向其后一个节点pTemp->pPre->pNext = pTemp->pNext;//让其后一个节点的pPre 指针指向其前一个节点pTemp->pNext->pPre = pTemp->pPre;//释放此节点delete (pTemp);}g_iNodeCount--;
}
void SX::DeleteByIndex(int iIndex)
{//查找节点struct Node* pTemp = GetByIndex(iIndex);//判断是否找到if (pTemp != NULL){//找到了删除节点DeleteNode(pTemp);}
}
void SX::ChangeByData(int iData, int iValue)
{//参数合法性检测if (NULL == g_pHead)return;//循环遍历struct Node* pTemp = g_pHead;while (pTemp != NULL){if (pTemp->iData == iData)pTemp->iData = iValue;pTemp = pTemp->pNext;}
}
void SX::ChangeByIndex(int iIndex, int iValue)
{//参数合法性检测if (NULL == g_pHead || iIndex < 0 || iIndex >= g_iNodeCount)return;struct Node* pTemp = GetByIndex(iIndex);if (pTemp != NULL){pTemp->iData = iValue;}
}
Node* SX::GetByData(int iData)
{//参数合法性检测if (NULL == g_pHead)return NULL;//循环遍历struct Node* pTemp = g_pHead;while (pTemp != NULL){if (pTemp->iData == iData)break;//return pTemp;pTemp = pTemp->pNext;}//return NULL;return pTemp;
}
Node* SX::GetByIndex(int iIndex)
{//参数合法性检测if (NULL == g_pHead || iIndex < 0 || iIndex >= g_iNodeCount)return NULL;//循环遍历struct Node* pTemp = g_pHead;for (int i = 0; i < iIndex; i++)pTemp = pTemp->pNext;//返回return pTemp;
}
void SX::InsertNodeByData(int iValue, int iData)
{//参数合法性检测if (NULL == g_pHead)return;//找节点struct Node* pTemp = g_pHead;while (pTemp != NULL){if (pTemp->iData == iValue)break;pTemp = pTemp->pNext;}//判断是否找到if (pTemp != NULL){if (pTemp == g_pHead)AddToHead(iData);else{//申请节点struct Node* pNew = new struct Node;if (NULL == pNew)return;//节点成员赋值pNew->iData = iData;pNew->pNext = NULL;pNew->pPre = NULL;//链接//指定位置前一个节点与新节点相连pTemp->pPre->pNext = pNew;pNew->pPre = pTemp->pPre;//指定位置节点与新节点相连pNew->pNext = pTemp;pTemp->pPre = pNew;//节点数量++g_iNodeCount += 1;}}
}
void SX::InsertNodeByIndex(int iIndex, int iCount, int iData)
{//参数合法性检测if (iIndex < 0 || iIndex>g_iNodeCount || iCount <= 0)return;//分类判断if (0 == iIndex)                    //头添加{for (int i = 0; i < iCount; i++)AddToHead(iData);}else if (iIndex == g_iNodeCount)    //尾添加{for (int i = 0; i < iCount; i++)AddToEnd(iData);}else                               //中间添加{//找位置struct Node* pTemp = g_pHead;for (int i = 0; i < iIndex; i++)pTemp = pTemp->pNext;//循环for (int i = 0; i < iCount; i++){//申请节点struct Node* pNew = new struct Node;if (pNew == NULL)return;//节点赋值pNew->iData = iData;pNew->pNext = NULL;pNew->pPre = NULL;//链接//指定位置前一个节点与新节点相连pTemp->pPre->pNext = pNew;pNew->pPre = pTemp->pPre;//指定位置节点与新节点相连pNew->pNext = pTemp;pTemp->pPre = pNew;}//节点数量++g_iNodeCount += iCount;}
}
void SX::AddToHead(int iData)
{//创建节点struct Node* pTemp = new struct Node;if (pTemp == NULL)return;//节点赋值pTemp->iData = iData;pTemp->pNext = NULL;pTemp->pPre = NULL;//连接到链表上if (NULL == g_pHead){//g_pHead = pTemp;g_pEnd = pTemp;}else{pTemp->pNext = g_pHead;g_pHead->pPre = pTemp;//g_pHead = pTemp;}g_pHead = pTemp;g_iNodeCount++;
}
void SX::LookFan()
{if (NULL == g_pEnd)return;//循环遍历printf("共有 %d 个节点: ", g_iNodeCount);struct Node* pTemp = g_pEnd;while (pTemp != NULL){printf("%d  ", pTemp->iData);pTemp = pTemp->pPre;}putchar('\n');
}
void SX::LookZheng()
{if (NULL == g_pHead)return;//循环遍历printf("共有 %d 个节点: ", g_iNodeCount);struct Node* pTemp = g_pHead;while (pTemp != NULL){printf("%d  ", pTemp->iData);pTemp = pTemp->pNext;}putchar('\n');
}
void SX::FreeList()
{//参数合法性检测if (NULL == g_pHead)return;//申请中间变量Node* pTemp = g_pHead;if (pTemp == NULL)return;while (pTemp != NULL){//记录要被释放的节点struct Node* pT = pTemp;//指向下一个节点pTemp = pTemp->pNext;//释放当前节点delete pT;}g_pHead = NULL;g_pEnd = NULL;g_iNodeCount = 0;
}
void SX::AddToEnd(int iData)
{//参数合法性检测if (g_iNodeCount < 0)return;//申请节点struct Node* pTemp = new struct Node;if (NULL == pTemp)return;//节点成员赋值pTemp->iData = iData;pTemp->pNext = NULL;pTemp->pPre = NULL;//连接链表if (NULL == g_pHead)    //无节点{g_pHead = pTemp;//g_pEnd = pTemp;}else{g_pEnd->pNext = pTemp;pTemp->pPre = g_pEnd;//g_pEnd = pTemp;}g_pEnd = pTemp;//节点数量++g_iNodeCount++;
}

主函数

#include"sx.h"int main()
{SX s;s.AddToEnd(1);s.AddToEnd(2);s.AddToEnd(3);s.LookZheng();return 0;
}

【数据结构基础_双向链表(有[*pHead]和[*pEnd])_(C++)】相关推荐

  1. 在列表前方插入一个数据_通俗易懂的Redis数据结构基础教程

    Redis有5个基本数据结构,string.list.hash.set和zset.它们是日常开发中使用频率非常高应用最为广泛的数据结构,把这5个数据结构都吃透了,你就掌握了Redis应用知识的一半了. ...

  2. 求单链表的最大值与原地逆转_数据结构基础复习09.ppt

    数据结构基础复习09.ppt 数据结构考研辅导 基础复习 浙江大学计算机学院 内容提纲 考研概述 考察目标理解数据结构的基本概念 掌握数据结构的逻辑结构 存储结构及其差异 以及各种基本操作的实现 在掌 ...

  3. asp子窗口读取父窗口数据_算法与数据结构基础 - 数组(Array)

    数组基础 数组是最基础的数据结构,特点是O(1)时间读取任意下标元素,经常应用于排序(Sort).双指针(Two Pointers).二分查找(Binary Search).动态规划(DP)等算法.顺 ...

  4. 由任意二叉树的前序遍历序列和中序遍历序列求二叉树的思想方法_算法与数据结构基础 - 二叉树(Binary Tree)...

    二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如Leet ...

  5. 翻译:程序员数据结构基础:选择正确的数据结构

    本文转载自GameDev.net,仅供学习交流.因为刚刚开始学习翻译,难免有些疏漏,如果有哪些地方翻译的不正确,请不吝告知,万分感谢. 原文链接:http://www.gamedev.net/page ...

  6. 数据结构基础知识(2)

    内容接自<数据结构基础知识(1)>... 链表的分类 单链表 单链表是一种链式存取的结构,为找第 i 个数据元素,必须先找到第 i-1 个数据元素.图中阴影区域表示数据域,空白区表示指针域 ...

  7. “数据结构基础”系列网络课程主页

    #前言 自从下决心要解决学生动手能力差的问题,开始了课程实践资源的建设之旅:自迷上了翻转课堂,所教课程的视频,也就逐渐形成了体系.在为我自己的校内学生服务的同时,也希望能够让更多人有机会用到. 自全身 ...

  8. python数据结构基础(单链表,多链表,二叉树)

    python数据结构基础(单链表,多链表,二叉树) 数据结构指数据对象中数据元素之间的关系 Python 给我们提供了很多现成的数据结构类型,这些系统自己定义好的,不需要我们自己去定义的数据结构叫做 ...

  9. 数据结构基础:P4.2-树(二)--->二叉平衡树

    本系列文章为浙江大学陈越.何钦铭数据结构学习笔记,前面的系列文章链接如下: 数据结构基础:P1-基本概念 数据结构基础:P2.1-线性结构->线性表 数据结构基础:P2.2-线性结构->堆 ...

  10. 数据结构基础知识点,看完保证期末不挂科!

    数据结构基础知识 线性结构 (1)连续储存(地址在内存中为连续)-----数组 (2)离散储存(地址在内存中不一定为连续的)-----链表 非线性结构 (1)树 (2)图 基础算法(查找排序): 折半 ...

最新文章

  1. difftime(转)
  2. 你注意到 .Net Framework 和 .Net Core 中使用 Session 的区别了吗?
  3. 李航统计方法——感知机
  4. [QT]文件夹过滤问题
  5. AtCoder - ABC 168 - E(数学推理)
  6. linux下的c++filt 命令
  7. 性能服务器可以同时标注吗,关于服务器性能的一些思考
  8. 游戏陪玩app开发,高并发系统如何设计?
  9. PAT_乙级_1007_筱筱
  10. 【Java】初识泛型(带你从初学者角度切入,通俗易懂,速进)
  11. ply文件格式详细说明
  12. 一文看懂:NAS网络存储与SAN、DAS的区别
  13. STM32F10x_模拟I2C读写EEPROM(2)(切换SDA方向 + 读ACK位 + 完整代码)
  14. Qt 中messageBox使用
  15. WP博客微信小程序的美化更新
  16. 火山小视频消重复技巧 怎么看视频md5
  17. C# 各类文件扩展名
  18. 【vue双向绑定原理浅析】
  19. 国产办公软件崛起,金山WPS月活用户已超5.7亿;Meta指责苹果夺走部分广告收入;Python 3.11 发布
  20. 公益宣传片制作的难点

热门文章

  1. java图片变成黑白代码_转:Java对图片的处理---缩放图像、图像切割、图像类型转换、彩色转为黑白...
  2. mysql high priv_MYSQL新特性secure_file_priv对读写文件的影响
  3. 去掉图标后蓝色方块设置方法
  4. 网站优化排名的5个方法
  5. 基于物联网的无线温度系统在钢铁行业的应用
  6. happen-before原则解读
  7. 安防视频监控直播的画面都是如何采集的?
  8. 【后端架构完善与接口开发】003-新增ebook表,生成持久层代码
  9. Windows徽标键快捷键
  10. Winkey(Windows徽标键)