C++資料結構 單鏈表(模板類)

來源:互聯網
上載者:User

利用模板類實現單鏈表及其功能

需要實現的操作:

[1] push_back       [2] push_front 
[3] show_list       [0] quit_system
[4] pop_back        [5] pop_front  
[6] insert_val      [7] delete_val 
[8] find            [9]length      
[10] clear          [11]destroy    
[12] reserv         [13]sort 

標頭檔原始碼:

#ifndef LIST_H_INCLUDED#define LIST_H_INCLUDED#include <iostream>using namespace std;template<class Type>class List;template<class Type>class ListNode{friend class List<Type>;public:ListNode():data(Type()),next(NULL){}ListNode(Type d, ListNode<Type> *n=NULL):data(d),next(n){}~ListNode(){}public:void SetData(Type d){data = d;}Type GetData()const{return data;}private:Type data;ListNode<Type> *next;};template<class Type>class List{public:List(){first = last = Buynode();}~List(){    List<Type>::destroy();}public:void push_back(const Type &x);void push_front(const Type &x);void show_list()const;void pop_back();void pop_front();void insert_val(const Type &x);void delete_val(const Type &x);bool find(const Type &x);Type length();void clear();void destroy();                        //摧毀該順序表void reserv();                         //反轉void sort();protected:ListNode<Type>* Buynode(Type x = Type()){ListNode<Type> *p = new ListNode<Type>(x);return p;}private:ListNode<Type> *first;ListNode<Type> *last;};template<class Type>void List<Type>::push_back(const Type &x){    ListNode<Type> *s = Buynode(x);    last->next = s;    last = s;    first->data++;}template<class Type>void List<Type>::push_front(const Type &x){    ListNode<Type> *s = Buynode(x);    s->next=first->next ;    first->next=s;    if(first == last)        last = s;    first->data++;}template<class Type>void List<Type>::show_list()const{    ListNode<Type> *p = first->next;    while(p != NULL)    {        cout<<p->data<<" ";        p = p->next;    }    cout<<endl;}template<class Type>void List<Type>::pop_back(){    if(first->data == 0)        return;    ListNode<Type> *p = first;    while(p->next != last)        p = p->next;    ListNode<Type> *q = p->next;    p->next = NULL;    last = p;    delete q;    first->data--;}template<class Type>void List<Type>::pop_front(){    ListNode<Type> *p = first->next;    first->next = p->next;    p = NULL;    delete p;    if(first->data == 1)        last = first;    first->data--;}template<class Type>void List<Type>::insert_val(const Type &x){    ListNode<Type> *s =  Buynode(x);    ListNode<Type> *p =  first->next;    if(p->data > s->data)    {        push_front(s->data);    }    else if(last->data < s->data)    {        push_back(s->data);    }    else        {            while((p->data < x )&& (p->next->data<x))            {                p = p->next;            }            s->next=p->next ;            p->next = s;            first->data++;        }}template<class Type>void List<Type>::delete_val(const Type &x){    ListNode<Type> *p = first->next;    ListNode<Type> *s =  Buynode(x);    if(x == p->data)    {        pop_front();    }    else    {         while((p->data != x) && (p->next->data != x))        {            p = p->next;        }        p->next = p->next->next;        ListNode<Type> *q = p->next;        delete q;        first->data--;    }}template<class Type>bool List<Type>::find(const Type &x){    ListNode<Type> *p = first->next;    while(p!=NULL && p->data!=x)        p = p->next;        return p;    }template<class Type>Type List<Type>::length(){    cout<<"length = "<<first->data<<endl;    return first->data;}template<class Type>void List<Type>::clear(){  while(first->data >0)    pop_front();}template<class Type>void List<Type>::destroy()//摧毀該順序表{    clear();    delete first;    first = last = NULL;}template<class Type>void List<Type>::reserv() //反轉,將整個資料表空間逆置{    ListNode<Type> *p = first->next;    ListNode<Type> *curr = p->next;    ListNode<Type> *tmp = NULL;    first->next->next = NULL;    while (curr)   //將將直接後繼指向當前指標的next    {        tmp = curr->next;        curr->next = p;        p = curr;        curr = tmp;    }    first->next = p;}template<class Type>void List<Type>::sort(){    ListNode<Type> *s = first->next;    while (s->next)    {        ListNode<Type> *p = s;        while(p->next)        {             if(s->data > p->next->data)                {                    Type tmp = s->data;                    s->data = p->next->data;                    p->next->data = tmp;                }                p = p->next;        }        s = s->next;    }}#endif // LIST_H_INCLUDED

主函數:

<pre name="code" class="cpp">#include"List.h"int main(){    List<int> mylist;int select = 1;int Item;int pos;while(select){cout<<"**************************************"<<endl;cout<<"* [1] push_back       [2] push_front *"<<endl;cout<<"* [3] show_list       [0] quit_system*"<<endl;cout<<"* [4] pop_back        [5] pop_front  *"<<endl;cout<<"* [6] insert_val      [7] delete_val *"<<endl;cout<<"* [8] find            [9]length      *"<<endl;cout<<"* [10] clear          [11]destroy    *"<<endl;cout<<"* [12] reserv         [13]sort       *"<<endl;cout<<"**************************************"<<endl;cout<<"請選擇:>";cin>>select;switch(select)        {        case 1:cout<<"請輸入要插入的值(-1結束):>";while(cin>>Item, Item!=-1){mylist.push_back(Item);}break;case 2:cout<<"請輸入要插入的值(-1結束):>";while(cin>>Item, Item!=-1){mylist.push_front(Item);}break;case 3:mylist.show_list();break;        case 4:            mylist.pop_back();            break;        case 5:            mylist.pop_front();            break;        case 6:            cout<<"請輸入要插入的值:>";            cin>>Item;            mylist.insert_val(Item);            break;case 7:cout<<"請輸入要刪除的值:>";cin>>Item;mylist.delete_val(Item);break;case 8:cout<<"請輸入要尋找的值:>";cin>>Item;mylist.find(Item);break;        case 9:            mylist.length();            break;        case 10:            mylist.clear();            break;        case 11:            mylist.destroy();            break;        case 12:            mylist.reserv();            break;        case 13:            mylist.sort();            break;default:break;        }    }}

 



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.