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(int nCount);
~ListStu();
ListStu& HeadInsert(ClassStu& cStu);
ListStu& VailInsert(ClassStu& cStu);
ListStu& Insert(Iterator Itr,ClassStu& cStu);
ListStu& Delete(pStuNode PosNode);
ListStu& DeleteHead();
ListStu& DeleteVail();
ListStu& DeteleId(int nIndex);
StuNode* Find(int nIndex);
Iterator FindItr(int nIndex);
int FindFOffset(int nIndex);
int FindId(int nIndex);
int UserIdToIndex(int UserId);
void UpDate(int nIndex,ClassStu& cStu);
Iterator begin()
{
return Iterator(m_HeaderStu->m_pNext, m_HeaderStu, m_VailStu);
}
Iterator end()
{
return Iterator(m_VailStu, m_HeaderStu, m_VailStu);
}
void InitList();
int GetMaxUserId();
int Size();
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)
{
return DeleteHead();
}
if (nIndex == (m_nCount-1))
{
return DeleteVail();
}
pStuNode DeleteNode = Find(nIndex);
return Delete(DeleteNode);
}
ListStu::StuNode* ListStu::Find(int 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);
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()
{
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))
{
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;
}
}
模板化
#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()
{
InitList();
}
ListStu(int nCount)
{
InitList();
for (int i = 0; i < nCount; i++)
{
ClassStu cStu;
VailInsert(cStu);
}
}
~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<T>& HeadInsert(T& cStu)
{
return Insert(begin(), cStu);
}
ListStu<T>& VailInsert(T& cStu)
{
return Insert(end(), cStu);
}
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;
}
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;
}
ListStu<T>& DeleteHead()
{
return Delete(m_HeaderStu->m_pNext);
}
ListStu<T>& DeleteVail()
{
if (m_VailStu->m_pPro == m_HeaderStu)
{
return *this;
}
return Delete(m_VailStu->m_pPro);
}
ListStu<T>& DeteleId(int nIndex)
{
if (nIndex == 0)
{
return DeleteHead();
}
if (nIndex == (m_nCount - 1))
{
return DeleteVail();
}
pStuNode DeleteNode = Find(nIndex);
return Delete(DeleteNode);
}
pStuNode Find(int 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;
}
Iterator FindItr(int nIndex)
{
return Iterator(Find(nIndex), m_HeaderStu, m_VailStu);
}
int FindFOffset(int nIndex)
{
pStuNode pFindNode = Find(nIndex);
if (pFindNode == nullptr)
{
return 0;
}
return pFindNode->m_cStu.m_FileOffset;
}
int FindId(int nIndex)
{
pStuNode pFindNode = Find(nIndex);
if (pFindNode == nullptr)
{
return 0;
}
return pFindNode->m_cStu.m_Id;
}
int UserIdToIndex(int UserId)
{
int nIndex = 0;
for (auto Val : *this)
{
if (UserId == Val.m_Id)
{
return nIndex;
}
nIndex++;
}
return -1;
}
void UpDate(int nIndex, ClassStu& cStu)
{
pStuNode pUpDate = Find(nIndex);
pUpDate->m_cStu = cStu;
}
Iterator begin()
{
return Iterator(m_HeaderStu->m_pNext, m_HeaderStu, m_VailStu);
}
Iterator end()
{
return Iterator(m_VailStu, m_HeaderStu, m_VailStu);
}
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;
}
int GetMaxUserId()
{
return m_VailStu->m_pPro->m_cStu.m_Id;
}
int Size()
{
return m_nCount;
}
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))
{
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;
}
}
private:
pStuNode m_HeaderStu;
pStuNode m_VailStu;
int m_nCount;
};