简单循环链表(类模板,包括基本操作)

定义节点头文件

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

 

posted @ 2021-10-24 21:23  Grit_L。  阅读(71)  评论(0编辑  收藏  举报