链表学习笔记

自己整理的链表简单操作,修改成了模板,记录一下,方便复习


单链表:

#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.从头结点开始遍历每个节点找到为空的pNext
		while (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.从头结点开始遍历每个节点找到为空的pNext
		while (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.从头结点开始遍历每个节点找到为空的pNext
		while (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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值