C++ 循环链表基本算法

C++ 循环链表基本算法

#ifndef CLinkList_h
#define CLinkList_h
#include <iostream>
using namespace std;
template <class T>
struct Node{
    T data;
    struct Node<T> * next;
};
template <class T>
class CLinkList
{
public:
    CLinkList(){rear = new Node<T>; rear ->next = rear;}
    CLinkList(T a[], int n);
    ~CLinkList();
    int GetLength();
    Node<T>* Get(int i);
    int Locate(T x);
    void Insert(int i, T x);
    T Delete( int i);
    void PrintList();
    void Connect(CLinkList<T> &b);
private:
    Node<T>*rear;
};
template <class T>
CLinkList<T>::CLinkList(T a[], int n){
    rear = new Node<T> ;
    rear->next = rear;
    for(int i = 0;i< n;i++){
        Node<T> * s = new Node<T>;
        s->data = a[i];
        s->next = rear->next;
        rear->next = s;
    }
}
template <class T>
CLinkList<T>::~CLinkList(){
    rear = rear->next;
    Node <T> *p = rear->next;
    Node <T>*q;
    while(p!=rear){
        q = p->next;
        delete p;
        p = q;
        //delete rear;
    }
    rear->next = rear;
}
template <class T>
int CLinkList<T>::GetLength(){
    if(rear->next == rear) return 0;
    Node<T>* p = rear->next;
    int j = 0;
    while (p!= rear){
        p= p->next;
        j++;
    }
    return j;
}
template <class T>
Node<T>* CLinkList<T>::Get(int i){
    if(i<1) throw " 查找位置错误";
    Node<T>* p = rear;
    for(int j = 0; j< i;j++){
        p = p->next;
    }
    return p;
    
}
template <class T>
int CLinkList<T>:: Locate(T x){
    Node<T> * p = rear->next;
    int j = 1;
    while(p!= rear){
        
        if(p->data == x){
            return j;
        }else{
            p = p->next;
            j++;
        }
    }
    return -1;
}
template <class T>
void CLinkList<T>::Insert(int i, T x){
    if(i<1 || i> GetLength()) throw"位置插入错误";
    Node<T>* p = rear;
    p = Get(i);
    Node <T>*s = new Node <T>;
    s->data = p->data;
    s->next = p->next;
    p->next = s;
    p->data = x;
}
template <class T>
T CLinkList<T>:: Delete( int i){
    if(i<1 || i> GetLength()) throw"位置错误";
    Node<T> * p = rear->next;
    int j = 1;
    while(j<i-1){
        p = p->next;
        j++;
    }
    Node<T>* s = p->next;
    p->next = s->next;
    if(s == rear){
        rear = p;
    }
    T x = s->data;
    return x;
    
}
template <class T>
void CLinkList<T>:: PrintList(){
    Node <T> *p = rear->next;
    if(p->next == rear) {cout<< "链表为空列表!"<<endl; return; }
    cout<<"按顺序单链表的各个数据元素是:"<<endl;
    while(p!=rear){
        cout<<p->data<<" ";
        p= p->next;
    }
    cout << endl;

}
template <class T>
void CLinkList<T>::Connect(CLinkList<T> &b){
    Node<T> *q = b.rear->next;
    b.rear->next = rear->next;
    rear->next = q->next;
    rear = b.rear;
    delete q;
}

#endif /* CLinkList_h */

猜你喜欢

转载自www.cnblogs.com/ycbeginner/p/10006351.html
今日推荐