C++字典的線性表實現

xwfw 9年前發布 | 695 次閱讀 C/C++

    #include <iostream>

#include <assert.h>  

using namespace std;  

struct SchoolNo  
{  
    int no;  
    friend bool operator == (const SchoolNo &school1,const SchoolNo &school2)  
    {  
        return (school1.no==school2.no);  
    }  
friend  ostream & operator <<(ostream &_O,const SchoolNo &school)  
    {  
        _O<<school.no;  
        return _O;  
    }  
    friend bool operator < (const SchoolNo &school1,const SchoolNo &school2)  
    {  
        return school1.no<school2.no;  
    }  
    friend bool operator > (const SchoolNo &school1,const SchoolNo &school2)  
    {  
        return school1.no>school2.no;  
    }  
    friend bool operator <= (const SchoolNo &school1,const SchoolNo &school2)  
    {  
        return school1.no<=school2.no;  
    }  
    friend bool operator >= (const SchoolNo &school1,const SchoolNo &school2)  
    {     
        return school1.no>=school2.no;  
    }  
    friend bool operator != (const SchoolNo &school1,const SchoolNo &school2)  
    {  
        return school1.no!=school2.no;  
    }  
};  
struct Information  
{  
    friend ostream & operator<<(ostream &_O,const Information &_I)  
    {  
        _O<<"\t"<<_I.age<<"\t"<<_I.name<<endl;  
        return _O;  
    }  
    int age;  
    char name[13];  
};  

template<typename K,typename E>  
class SortedChain;  

template<typename K,typename E>  
class ChainNode  
{  
    friend class SortedChain<K,E>;  
    public:  
    ChainNode():next(NULL){}  
    ChainNode(K k,E e):key(k),data(e),next(NULL){}  
    friend ostream &operator<<(ostream &_O,const ChainNode<K,E> &node)  
    {  
        _O<<node.key<<node.data;  
        return _O;  
    }  
    private:  
    E data;  
    K key;  
    ChainNode *next;  
};  

template<typename K,typename E>  
class SortedChain  
{  
    public:  
    SortedChain()  
    {  
        first = new ChainNode<K,E>();  
        assert(first!=NULL);  
    }  
    ~SortedChain()  
    {  
        delete []first;  
      first=NULL;  
    }  
    public:  
    ChainNode<K,E> &Search(const K key)const//搜索。  
    {  
        ChainNode<K,E> *p = first;  
        while(p!=NULL)  
        {  
            if(p->key==key)  
                    break;  
                p=p->next;  
        }  
        return *p;  
    }  
    void Insert(const K key,E &e)  
    {  
        ChainNode<K,E> *node = new ChainNode<K,E>();  
        node->data=e;  
        node->key=key;  
        node->next=NULL;  
        ChainNode<K,E> *p = first;  
      while(p->next!=NULL&& p->next->key<key)//重載  
        {  
              p=p->next;  
        }  
      node->next = p->next;  
        p->next=node;  
    }  
    friend ostream & operator<<(ostream &_O,const SortedChain<K,E> &node)  
    {  
        _O<<node.key;  
        return _O;  
    }  
    void view()  
    {  
        ChainNode<K,E> *p = first;  
        cout<<"學號"<<"\t"<<"年紀"<<"\t"<<"名字"<<endl;  
        while(p->next!=NULL)  
        {  
            cout <<p->next->key<<p->next->data ;  
            p=p->next;  
        }  
    }  
    bool Remove(const K key,E &e)   //刪除。  
    {  
        ChainNode<K,E> *p = first;  
        while(p->next!=NULL && p->next->key!=key)  
        {  
            p = p->next;  
        }  
        ChainNode<K,E> *q = p->next;  
        p->next = q->next;  
        delete q;  
    }     
    ChainNode<K,E> *Begin()const //定位第一個。  
    {  
        return (first->next);  
    }  
    ChainNode<K,E> &Next(ChainNode<K,E> *current)const//定位下一個。  
  {  
        return *(current->next);  
    }  
    private:  
    ChainNode<K,E> *first;  
};  
int main()  
{  
    SortedChain<SchoolNo,Information> a;  
    Information _I1={100,"感動天"};  
    Information _I2={10,"趕上村"};  
    Information _I3={44,"震需要"};  
    SchoolNo _No1={3};  
    SchoolNo _No2={1};  
    SchoolNo _No3={2};  
    a.Insert(_No1,_I1);  
    a.Insert(_No2,_I2);  
    a.Insert(_No3,_I3);  
    a.view();  
    a.Remove(_No2,_I2);  
    a.view();  
    return 0;  
}  </pre> 


 本文由用戶 xwfw 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!