簡單迴圈連結串列(類模板,包括基本操作)
定義節點標頭檔案
#ifndef _DBLNODE_H_ #define _DBLNODE_H_ template<class ElemType> struct Node{ ElemType data; Node<ElemType>* back; Node<ElemType>* next; Node(); Node(const ElemType& e, Node<ElemType>* linkBack = NULL, Node<ElemType>* linkNext = NULL); }; template<class ElemType> Node<ElemType>::Node() { back = next = NULL; } template<class ElemType> Node<ElemType>::Node(const ElemType& e, Node<ElemType>* linkBack,Node<ElemType>* linkNext ) { data = e; back = linkBack; next = linkNext; } #endif
雙向連結串列的宣告和定義標頭檔案
#include"DblNode.h"
#ifndef _DBLLINKLIST_H_
#define __DBLLINKLIST_H_
template<class ElemType>
class DblLinkList {
protected:
Node<ElemType>* head;
int count;
Node<ElemType>* GetElemPtr(int position)const;
public:
DblLinkList();//構造一個空連結串列
virtual~DblLinkList();
int Length()const;
bool Empty()const;
void Clear();
void Traverse(void(*visit)(const ElemType&))const;//遍歷線性表
bool GetElem(int position, ElemType& e)const;
bool SetElem(int position, const ElemType& e);//設定指定位置元素值
bool Delet(int position);
bool Delet(int position, ElemType& e);
bool Insert(int position, const ElemType& e);//插入元素
DblLinkList(const DblLinkList<ElemType>& source);//複製建構函式模板
DblLinkList<ElemType>& operator=(const DblLinkList<ElemType>& source);//賦值過載運算子
};
template<class ElemType>
Node<ElemType>* DblLinkList<ElemType>::GetElemPtr(int position)const {
Node<ElemType>* temPtr = head->next;
int temPos = 1;
if (position == 0)
{
return head;
}
while (temPtr != head && temPos < position) {
temPtr = temPtr->next;
temPos++;
}
if (temPtr != head && temPos == position) {
return temPtr;
}
else
return NULL;
}
template<class ElemType>
DblLinkList<ElemType>::DblLinkList() {
head = new Node<ElemType>;//構造頭節點,空連結串列只有頭節點
head->back = head;
head->next = head;
}
template<class ElemType>
DblLinkList<ElemType>::~DblLinkList() {
Clear();
delete head;
}
template<class ElemType>
int DblLinkList<ElemType>::Length()const
{
int count = 0;
for (Node<ElemType>* temPtr = head->next; temPtr !=head; temPtr = temPtr->next)
{
count++;
}
return count;
}
template<class ElemType>
bool DblLinkList<ElemType> ::Empty()const {
return head->next == head;//若線性表為空則返回1,否則返回0
}
template<class ElemType>
void DblLinkList<ElemType> ::Clear() {
while (!Empty()) {
Delet(1);//刪除第一個元素
}
}
template<class ElemType>
void DblLinkList<ElemType> ::Traverse(void(*vist)(const ElemType&))const {
for (Node < ElemType>* temPtr = head->next; temPtr != head; temPtr = temPtr->next) {
(*vist)(temPtr->data);//對線性表中的每個元素呼叫函式(*vist)
}
}
template<class ElemType>
bool DblLinkList<ElemType> ::GetElem(int position, ElemType& e)const {
if (position<1 || position>Length()) {
return false;
}
else {
Node<ElemType>* temPtr = GetElemPtr(position);
e = temPtr->data;
return true;
}
}
template<class ElemType>
bool DblLinkList<ElemType> ::SetElem(int position, const ElemType& e) {
if (position<1 || position>Length()) {
return false;
}
else {
Node<ElemType>* temPtr = GetElemPtr(position);
temPtr->data = e;
return true;
}
}
template<class ElemType>
bool DblLinkList<ElemType> ::Delet(int position) {
if (position<1 || position>Length()) {
return false;
}
else {
Node<ElemType>* temPtr = GetElemPtr(position);
temPtr->back->next = temPtr->next;
temPtr->next->back = temPtr->back;
delete temPtr;
return true;
}
}
template<class ElemType>
bool DblLinkList<ElemType> ::Delet(int position, ElemType& e) {
if (position<1 || position>Length()) {
return false;
}
else {
Node<ElemType>* temPtr = GetElemPtr(position);
/*temPtr->back->next = temPtr->next;
temPtr->next->back = temPtr->back;*/
Node<ElemType>* nextPtr = temPtr->next;
Node<ElemType>* bakePtr = temPtr->back;
nextPtr->back = bakePtr;
bakePtr->next = nextPtr;
e = temPtr->data;
delete temPtr;
return true;
}
}
template<class ElemType>
bool DblLinkList<ElemType> ::Insert(int position, const ElemType& e) {
if (position<1 || position>Length() + 1) {
return false;
}
else {
Node<ElemType>* temPtr = GetElemPtr(position-1);
Node<ElemType>* nextPtr = temPtr->next;
Node<ElemType>* newPtr = new Node <ElemType>(e, temPtr,nextPtr);
//生成新節點,並且讓這個節點的next指向下一個指標,back指向上一個指標
temPtr->next = newPtr;
nextPtr->back = newPtr;
return true;
}
}
template<class ElemType>
DblLinkList<ElemType> ::DblLinkList(const DblLinkList<ElemType>& source) {
//由線性表source構造新的線性表--複製建構函式模板
int sourceLength = source.Length();
ElemType temElem;
head = new Node<ElemType>;//初始化空線性表,空連結串列只有頭節點;
head->back = head;
head->next = head;
for (int temPos = 1; temPos <= sourceLength; temPos++) {
source.GetElem(temPos, temElem);
Insert(Length() + 1, temElem);//將temPos插入到當前節點
}
}
template<class ElemType>
DblLinkList<ElemType>& DblLinkList<ElemType> ::operator=(const DblLinkList<ElemType>& source) {
if (&source != this)
{
int sourceLength = source.Length();
ElemType temElem;
Clear();
for (int temPos = 1; temPos <= sourceLength; temPos++) {
source.GetElem(temPos, temElem);
Insert(Length() + 1, temElem);
}
}
return *this;
}
#endif
main.cpp
#include<iostream> #include"DblLinkList.h" using namespace std; template<class ElemType> void Show(const ElemType& e) { cout << e << " "; } int main() { char select = '0'; DblLinkList<double>la, lb; double e; int position; while (select != '7') { cout << endl << "1.生成連結串列"; cout << endl << "2.顯示連結串列"; cout << endl << "3.檢查元素"; cout << endl << "4.設定元素值"; cout << endl << "5.刪除元素"; cout << endl << "6.插入元素"; cout << endl << "7.退出"; cout << endl << "選擇功能(1—7)"; cin >> select; switch (select) { case'1': cout << endl << "輸入e(e=0的時候退出)"; cin >> e; while (e != 0) { la.Insert(la.Length()+1, e); cin >> e; } break; case'2': lb = la; lb.Traverse(Show<double>); break; case '3': cout << endl << "輸入元素位置:"; cin >> position; if (!la.GetElem(position, e)) cout << "元數不存在"; else cout << "元素:" << e << endl; break; case '4': cout << endl << "輸入元素值:"; cin >> e; cout << endl << "輸入元素位置:"; cin >> position; if (!la.SetElem(position, e)) cout << "輸入元素位置錯誤。" << endl; else cout << "設定成功。" << endl; break; case'5': cout << endl << "輸入位置:"; cin >> position; if (!la.Delet(position, e)) cout << "輸入元素位置錯誤。" << endl; else cout << "刪除成功,被刪除元素值e=" << e << endl; break; case'6': cout << endl << "輸入元素值:"; cin >> e; cout << endl << "輸入元素位置:"; cin >> position; if (!la.Insert(position, e)) cout << "輸入元素位置錯誤。" << endl; else cout << "插入成功。" << endl; break; } } return 0; }