1. 程式人生 > >C++ 迴圈連結串列基本演算法

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