链表学习笔记
来源:互联网 发布:linux cdn 编辑:程序博客网 时间:2024/04/29 14:57
自己整理的链表简单操作,修改成了模板,记录一下,方便复习
单链表:
#pragma once#include <string.h>template <class TYPE>class CMyList{public:////////////////////////////////////////////////////////////////////typedef struct _NODE{TYPE nData;_NODE* pNext;}NODE, *PNODE;////////////////////////////////////////////////////////////////////CMyList(){memset(&m_stcHead, 0, sizeof(NODE));m_nCount = 0;}~CMyList(){ Clear(); };public:// 向尾部添加一个元素void push_back(TYPE nData){// 1.获取头结点地址NODE* pNew = &m_stcHead;// 2.从头结点开始遍历每个节点找到为空的pNextwhile (pNew->pNext){pNew = pNew->pNext;}// 3.创建一个新结点pNew->pNext = new NODE;memset(pNew->pNext, 0, sizeof(NODE));pNew->pNext->nData = nData;// 将新结点的pNext指向空pNew->pNext->pNext = nullptr;// 4.结点数量加1;m_nCount++;}// 向nIndex插入一个元素void Insert(int nIndex, TYPE nData){// 1.先获取头结点的地址NODE* pNew = &m_stcHead;// 2.从头结点开始遍历找到nIndex,记录pNew结点int nCurrentPos = 0;while (pNew->pNext){if (nCurrentPos == nIndex)break;pNew = pNew->pNext;nCurrentPos++;}// 3.保存当前结点的下一个结点的地址NODE* pOld = pNew->pNext;// 4.插入新的结点pNew->pNext = new NODE;memset(pNew->pNext, 0, sizeof(NODE));pNew->pNext->nData = nData;// 5.插入结点的pNext指向刚刚保存的节点的地址pNew->pNext->pNext = pOld;m_nCount++;//增加元素}// 删除nIndex结点void Delete(int nIndex){// 1.先获取头结点的地址NODE* pNew = &m_stcHead;// 2.从头结点开始遍历找到nIndex,记录pNew结点int nCurrentPos = 0;while (pNew->pNext){if (nCurrentPos == nIndex)break;pNew = pNew->pNext;nCurrentPos++;}NODE* pDel = pNew->pNext;pNew->pNext = pDel->pNext;delete pDel;pDel = nullptr;m_nCount--;}// 清空链表void Clear(){if (m_nCount > 0)//判断是否有结点{// 1.先获取头结点的地址NODE* pDel = &m_stcHead;NODE* pDelNext = pDel->pNext;while (pDelNext){pDel = pDelNext;pDelNext = pDel->pNext;delete pDel;pDel = nullptr;}m_nCount = 0;}}private:NODE m_stcHead;int m_nCount;};
循环单链表:
#pragma once#include <string.h>template <class TYPE>class CMyLoopList{public:////////////////////////////////////////////////////////////////////typedef struct _NODE{TYPE nData;_NODE* pNext;}NODE, *PNODE;////////////////////////////////////////////////////////////////////CMyLoopList(){memset(&m_stcHead, 0, sizeof(NODE));m_stcHead.pNext = &m_stcHead;m_nCount = 0;}~CMyLoopList(){ Clear(); };public:// 向尾部添加一个元素void push_back(TYPE nData){// 1.获取头结点地址NODE* pNew = &m_stcHead;// 2.从头结点开始遍历每个节点找到为空的pNextwhile (pNew->pNext != &m_stcHead){pNew = pNew->pNext;}// 3.创建一个新结点pNew->pNext = new NODE;memset(pNew->pNext, 0, sizeof(NODE));pNew->pNext->nData = nData;// 将新结点的pNext指向头结点pNew->pNext->pNext = &m_stcHead;// 4.结点数量加1;m_nCount++;}// 向nIndex插入一个元素void Insert(int nIndex, TYPE nData){// 1.先获取头结点的地址NODE* pNew = &m_stcHead;// 2.从头结点开始遍历找到nIndex,记录pNew结点int nCurrentPos = 0;while (pNew->pNext != &m_stcHead){if (nCurrentPos == nIndex)break;pNew = pNew->pNext;nCurrentPos++;}// 3.保存当前结点的下一个结点的地址NODE* pOld = pNew->pNext;// 4.插入新的结点pNew->pNext = new NODE;memset(pNew->pNext, 0, sizeof(NODE));pNew->pNext->nData = nData;// 5.插入结点的pNext指向刚刚保存的节点的地址pNew->pNext->pNext = pOld;m_nCount++;//增加元素}// 删除nIndex结点void Delete(int nIndex){// 1.先获取头结点的地址NODE* pNew = &m_stcHead;// 2.从头结点开始遍历找到nIndex,记录pNew结点int nCurrentPos = 0;while (pNew->pNext != &m_stcHead){if (nCurrentPos == nIndex)break;pNew = pNew->pNext;nCurrentPos++;}NODE* pDel = pNew->pNext;pNew->pNext = pDel->pNext;delete pDel;pDel = nullptr;m_nCount--;}// 清空链表void Clear(){if (m_nCount > 0)//判断是否有结点{// 1.先获取头结点的地址NODE* pDel = &m_stcHead;NODE* pDelNext = pDel->pNext;while (pDelNext && pDelNext != &m_stcHead){pDel = pDelNext;pDelNext = pDel->pNext;delete pDel;pDel = nullptr;}m_nCount = 0;}}private:NODE m_stcHead;int m_nCount;};
循环双链表:
#pragma once#include <string.h>template <class TYPE>class CMyDoubleList{public:////////////////////////////////////////////////////////////////////typedef struct _NODE{TYPE nData;_NODE* pPrev;_NODE* pNext;}NODE, *PNODE;////////////////////////////////////////////////////////////////////CMyDoubleList(){//初始化memset(&m_stcHead, 0, sizeof(NODE));m_stcHead.pNext = &m_stcHead;m_nCount = 0;}~CMyDoubleList(){};public:// 向尾部添加一个元素void push_back(TYPE nData){// 1.获取头结点地址NODE* pNew = &m_stcHead;NODE* pPrev = pNew;// 2.从头结点开始遍历每个节点找到为空的pNextwhile (pNew->pNext != &m_stcHead){pNew = pNew->pNext;pPrev = pNew;}// 3.创建一个新结点pNew->pNext = new NODE;memset(pNew->pNext, 0, sizeof(NODE));pNew->pNext->nData = nData;pNew->pNext->pPrev = pPrev;// 将新结点的pNext指向头结点pNew->pNext->pNext = &m_stcHead;// 4.结点数量加1;m_nCount++;}// 向nIndex插入一个元素void Insert(int nIndex, TYPE nData){// 1.先获取头结点的地址NODE* pNew = &m_stcHead;NODE* pPrev = pNew;// 2.从头结点开始遍历找到nIndex,记录pNew结点int nCurrentPos = 0;while (pNew->pNext != &m_stcHead){if (nCurrentPos == nIndex)break;pNew = pNew->pNext;pPrev = pNew;nCurrentPos++;}// 3.保存当前结点的下一个结点的地址NODE* pOld = pNew->pNext;// 4.插入新的结点pNew->pNext = new NODE;memset(pNew->pNext, 0, sizeof(NODE));pNew->pNext->nData = nData;pNew->pNext->pPrev = pPrev;// 5.插入结点的pNext指向刚刚保存的节点的地址pNew->pNext->pNext = pOld;m_nCount++;//增加元素}// 删除nIndex结点void Delete(int nIndex){// 1.先获取头结点的地址NODE* pNew = &m_stcHead;// 2.从头结点开始遍历找到nIndex,记录pNew结点int nCurrentPos = 0;while (pNew->pNext != &m_stcHead){if (nCurrentPos == nIndex)break;pNew = pNew->pNext;nCurrentPos++;}NODE* pDel = pNew->pNext;pNew->pNext = pDel->pNext;pNew->pNext->pPrev = pNew;delete pDel;pDel = nullptr;m_nCount--;}// 清空链表void Clear(){if (m_nCount > 0)//判断是否有结点{// 1.先获取头结点的地址NODE* pDel = &m_stcHead;NODE* pDelNext = pDel->pNext;while (pDelNext && pDelNext != &m_stcHead){pDel = pDelNext;pDelNext = pDel->pNext;delete pDel;pDel = nullptr;}m_nCount = 0;}}private:NODE m_stcHead;int m_nCount;};
0 0
- 链表学习笔记
- 链表学习笔记
- 链表学习笔记
- 链表学习笔记
- 单向链表学习笔记
- 双向链表学习笔记
- [学习笔记]循环链表
- [学习笔记]双向链表
- [学习笔记]静态链表
- 双向链表学习笔记
- C++链表学习笔记
- 循环链表学习笔记
- 学习笔记--单向链表
- 链表学习笔记 -- 顺序链表
- 链表学习笔记--链式链表
- 链表学习笔记 --- 循环链表
- 链表学习笔记 --- 双向链表
- Linux内核链表学习笔记
- AutoLayout
- 安装制作不用愁—Wise installation入门教程
- C++ 如何从string中删除一个字符?
- SQL group by的困惑
- Binary Tree Maximum Path Sum
- 链表学习笔记
- 三大主流工作流引擎技术分析与市场预测
- hdu 4662 MU Puzzle
- 两个程序员的泰国普吉岛之行
- 初识HTML
- struts2 url重写
- TCP连接的建立与终止
- 鸽巢排序
- QT皮肤(QSS)编程