1. 程式人生 > >CPP雙項鍊表

CPP雙項鍊表

#include “List.h”
#include
using namespace std;
int main()
{
CList list;
list.AddTail(1);
list.AddTail(2);
list.AddTail(3);
list.AddHead(88);
list.AddHead(77);
list.AddHead(66);
cout << “正向輸出” << endl;
POSITION pos= list.GetHeadPosition();
while (pos)
{
cout<< list.GetNext(pos)<<endl;
}

list.Delete(3);
list.Delete(66);
list.Delete(2);
cout << endl;
cout << "反向輸出" << endl;
 pos = list.GetTailPosition();
while (pos)
{
	cout << list.GetPrev(pos) << endl;

}
cout <<"總共有:"<< list.GetCount()<<"條" << endl;
return 0;

}


#pragma once

typedef int DATA;
struct SNode
{
DATA data=0;
SNode * pPrev=nullptr;
SNode * pNext=nullptr;
};
typedef void* POSITION;
class CList
{
SNode *m_pHead, *m_pTail;
int m_nCount;
public:
CList();
~CList();
//清理堆空間
void RemoveAll();
//獲得連結串列節點的個數
int GetCount();
//獲得連結串列頭節點
POSITION GetHeadPosition();
//獲得連結串列的尾節點
POSITION GetTailPosition();
// 獲取節點資料
DATA GetAt(POSITION pos);
// 獲得當前節點的資料,並指標下移。
DATA GetNext(POSITION &pos);
// 獲得當前節點的資料,並指標上移
DATA GetPrev(POSITION &pos);
// 向頭部新增資料
void AddHead(DATA data);
// 從尾部新增資料
void AddTail(DATA data);
// 向指定的節點更新資料
void SetAt(POSITION pos, DATA data);
// 刪除節點資料
void RemoveAt(POSITION pos);
// 刪除指定的資料
void Delete(DATA data);
};


#include “List.h”

CList::CList()
{
m_pHead = m_pTail = nullptr;
m_nCount=0;
}

CList::~CList()
{//清理的是類物件之外額外申請的堆空間。
RemoveAll();
}
//清理堆空間
void CList::RemoveAll()
{
SNode *p = m_pHead,*p1;
while §
{
p1 = p;
p=p->pNext;
delete p1;
}

m_pHead = m_pTail = nullptr;
m_nCount = 0;

}
//獲得連結串列節點的個數
int CList::GetCount()
{
return m_nCount;
}
//獲得連結串列頭節點
POSITION CList::GetHeadPosition()
{
return m_pHead;
}
//獲得連結串列的尾節點
POSITION CList::GetTailPosition()
{
return m_pTail;
}
// 獲取節點資料
DATA CList::GetAt(POSITION pos)
{
return ((SNode*)pos)->data;
}
// 獲得當前節點的資料,並指標下移
DATA CList::GetNext(POSITION &pos)
{
DATA d = ((SNode*)pos)->data;
pos=((SNode*)pos)->pNext;
return d;
}
// 獲得當前節點的資料,並指標上移
DATA CList::GetPrev(POSITION &pos)
{
DATA d = ((SNode*)pos)->data;
pos=((SNode*)pos)->pPrev;
return d;
}
// 向頭部新增資料
void CList::AddHead(DATA data)
{
SNode *p = new SNode;
p->data = data;
if (m_pHead)//頭有資料。
{
m_pHead->pPrev = p;
}
else
{
m_pTail = p;
}
p->pNext = m_pHead;
p->pPrev = nullptr;
m_pHead = p;
m_nCount++;
}
// 從尾部新增資料
void CList::AddTail(DATA data)
{
SNode p = new SNode;
p->data = data;
if (m_pTail)//尾有資料。
{
m_pTail->pNext = p;
}
else
{
m_pHead = p;
}
p->pNext = nullptr;
p->pPrev = m_pTail;
m_pTail = p;
m_nCount++;
}
// 向指定的節點更新資料
void CList::SetAt(POSITION pos, DATA data)
{
((SNode
)pos)->data = data;
}
// 刪除節點資料
void CList::RemoveAt(POSITION pos)
{
SNode p = (SNode)pos;
if (p == m_pHead)
{
m_pHead = p->pNext;//頭為空時執行
}
else
{
p->pPrev->pNext = p->pNext;
}
if (p == m_pTail)//尾為空時執行
{
m_pTail = p->pPrev;
}
else
{
p->pNext->pPrev = p->pPrev;//頭為空時也執行
}
delete p;
m_nCount–;
}

// 刪除指定的資料
void CList::Delete(DATA data)
{
POSITION pos = GetHeadPosition();
while (pos)
{
if (GetAt(pos)==data)
{
RemoveAt(pos);
break;
}
GetNext(pos);

}

}