1. 程式人生 > 其它 >簡單迴圈連結串列(類模板,包括基本操作)

簡單迴圈連結串列(類模板,包括基本操作)

定義節點標頭檔案

#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;
}