c++用户管理信息(双向链表 -- 模板化)

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的下一个节点
		}

	}




模板化

#pragma once
template<typename T>
class ListStu
{
public:
	class StuNode
	{
	public:
		T m_cStu;//数据
		StuNode* m_pPro;//指向前一个节点
		StuNode* m_pNext;//指向下一个节点


		StuNode()
		{
			m_cStu = 0;
			m_pNext = nullptr;
			m_pPro = nullptr;
		}


		StuNode(T& 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:


	using pStuNode = StuNode*;
	/*******************默认构造系列开始*************************/
/*
   * ListStu
   * 参数一 : 无
   * 功能   :默认构造,初始化类成员 --为空
   * 返回值 :无
*/

	ListStu()
	{
		InitList();
	}



/*
	* ListStu
	* 参数一 : int
	* 功能   :默认构造,初始化nCount个成员链表
	* 返回值 :无
*/
	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;
		}
	}

	/*******************默认构造系列结束*************************/

//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//

	/*******************增删改查系列开始*************************/
/*
	* HeadInsert
	* 参数一 : ClassStu
	* 功能   :从头部插入一个数据
	* 返回值 :ListStu&
*/

	ListStu<T>& HeadInsert(T& cStu)
	{
		return Insert(begin(), cStu);
	}

/*
	* VailInsert
	* 参数一 : ClassStu
	* 功能   :从尾部插入一个数据
	* 返回值 :ListStu&
*/

	ListStu<T>& VailInsert(T& cStu)
	{
		return Insert(end(), cStu);
	}
/*
	* Insert
	* 参数一 : pStuNode 需要插入节点的位置   插在这个节点的pStuNode后面
	* 参数二 : ClassStu& 插入的数据
	* 功能   : 指定位置插入一个数据
	* 返回值 : ListStu&
*/

	ListStu<T>& Insert(Iterator Itr, T& 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;
	}


/*
	* Detele
	* 参数一 : pStuNode    删除的前一个节点
	* 功能   : 从链表中删除一个节点
	* 返回值 :ListStu&
*/
	ListStu<T>& 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;
	
	}

/*
	* DeteleHead
	* 参数一 : pStuNode   删除头部节点
	* 功能   : 删除头部节点
	* 返回值 : ListStu&
*/
	ListStu<T>& DeleteHead()
	{
		return Delete(m_HeaderStu->m_pNext);
	}


/*
	* DeleteVail
	* 参数一 : pStuNode   删除尾部节点
	* 功能   : 删除尾部节点
	* 返回值 : ListStu&
*/
	ListStu<T>& DeleteVail()
	{
		if (m_VailStu->m_pPro == m_HeaderStu)
		{
			return *this;
		}
		return Delete(m_VailStu->m_pPro);
	}
/*
	* DeteleId
	* 参数一 : 索引
	* 功能   : 指定索引从链表中删除一个节点
	* 返回值 : 无
*/
	ListStu<T>& DeteleId(int nIndex)
	{
		if (nIndex == 0)//索引为0 就是删除头部
		{
			return DeleteHead();
		}
		if (nIndex == (m_nCount - 1))//索引等于元素个数就是删除尾部
		{
			return DeleteVail();
		}
		//查找需要删除的节点  
		pStuNode DeleteNode = Find(nIndex);
		//进行删除 并返回
		return Delete(DeleteNode);
	}



/*
	* Find
	* 参数一 : int --序号索引
	* 功能   : 通过索引查找到数据
	* 返回值 : 无
*/
	pStuNode 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;
	}


/*
	* FindItr
	* 参数一 : int --序号索引
	* 功能   : 查找到数据
	* 返回值 : Iterator   
*/
	Iterator FindItr(int nIndex)
	{
		return Iterator(Find(nIndex), m_HeaderStu, m_VailStu);
	}

/*
	* FindFOffset
	* 参数一 : int --序号索引
	* 功能   : 根据索引查找到文件偏移
	* 返回值 : 无
*/
	int FindFOffset(int nIndex)
	{
		pStuNode pFindNode = Find(nIndex);
		if (pFindNode == nullptr)
		{
			return 0;
		}
		return pFindNode->m_cStu.m_FileOffset;
	}

/*
	* FindId
	* 参数一 :  int --序号索引
	* 功能   : 根据索引查找到用户m_Id
	* 返回值 : 无
*/
	int FindId(int nIndex)
	{
		pStuNode pFindNode = Find(nIndex);
		if (pFindNode == nullptr)
		{
			return 0;
		}
		return pFindNode->m_cStu.m_Id;
	}

/*
	* UserIdToIndex
	* 参数一 :  int --用户的m_Id
	* 功能   : 用户m_Id --查到链表用户的索引
	* 返回值 : int  nIndex
*/
	int UserIdToIndex(int UserId)
	{
		int nIndex = 0;
		for (auto Val : *this)
		{
			if (UserId == Val.m_Id)
			{
				return nIndex;
			}
			nIndex++;
		}
		return -1;
	
	}

/*
	* UpDate
	* 参数一 : int --序号索引
	* 功能   : 修改用户的数据
	* 返回值 : 无
*/
	void UpDate(int nIndex, ClassStu& cStu)
	{
		//先找到要修改的数据
		pStuNode pUpDate = Find(nIndex);
		//替换数据   -- cStu里面会自动释放资源
		pUpDate->m_cStu = 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()
	{
		m_HeaderStu = new StuNode;
		m_VailStu = new StuNode;

		m_HeaderStu->m_pNext = m_VailStu;
		m_VailStu->m_pPro = m_HeaderStu;
		m_nCount = 0;
	}



/*
* GetMaxUserId
* 参数一 : 无
* 功能   : 查找用户最大的m_Id
* 返回值 : int
*/
	int GetMaxUserId()
	{
		return m_VailStu->m_pPro->m_cStu.m_Id;
	}


/*
	* size
	* 参数一 : 无
	* 功能   : 获取元素个数
	* 返回值 : int
*/
	int Size()
	{
		return m_nCount;
	}

/*
	* BubbleSort
	* 参数一 : 无
	* 功能   : 根据成员m_Id --冒泡排序
	* 返回值 : 无
*/
	//void BubbleSort();

/*
	* insertionSort
	* 参数一 : 无
	* 功能   : 根据成员m_Id --插入排序法
	* 返回值 : 无
*/
	//void insertionSort();
/*
	* Sort()
	* 参数一 : 无
	* 功能   : 根据成员m_Id --选择性排序法
	* 返回值 : 无
*/
	void 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的下一个节点
		}
	
	}

	/*******************内部使用函数系列结束*************************/

private:
	pStuNode m_HeaderStu;//头节点
	pStuNode m_VailStu;//尾节点
	int m_nCount;//记录有多少个成员
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值