链表学习笔记

来源:互联网 发布: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
原创粉丝点击