码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 循环链表基本算法

时间:2018-11-24 21:02:44      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:单链表   std   cli   cout   void   nec   namespace   iostream   lse   

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 */

 

C++ 循环链表基本算法

标签:单链表   std   cli   cout   void   nec   namespace   iostream   lse   

原文地址:https://www.cnblogs.com/ycbeginner/p/10006351.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!