您的位置:首页 > 编程语言 > C语言/C++

C++实现线形链表

2007-07-28 15:05 295 查看
LinkList.h 


#ifndef LINKLIST_H


#define LINKLIST_H




template<class ElemType>


class LinkList




...{


public:


    LinkList();                                //Init


    ~LinkList();                            //Uninit




    void insert(int i, ElemType e);        //Insert


    void erase(int i);                    //Delete




    ElemType &operator[](int i);            //Get


    void for_each(void (*visit)(ElemType &));        //For each




    struct node




    ...{


        ElemType data;


        node *next;


    };






    class bad_pos...{};                        //异常类:错误的下标




private:


    node *head;


};




#include "LinkList.cpp"




#endif

LinkList.cpp


#ifndef LINKLIST_CPP


#define LINKLIST_CPP




#include <cstdlib>


#include <stack>


#include "LinkList.h"




template<class ElemType>


LinkList<ElemType>::LinkList()




...{


    head = new node;    //建立头指针


    head->next = 0;


}




template<class ElemType>


LinkList<ElemType>::~LinkList()




...{


    node *p = head;


    std::stack<node *> s;




    while(p)    //元素指针入栈




    ...{


        s.push(p);


        p = p->next;


    }


    while(!s.empty())    //释放元素




    ...{


        delete s.top();


        s.pop();


    }


}




template<class ElemType>


void LinkList<ElemType>::insert(int i, ElemType e)




...{


    node *prior;


    node *in = new node;


    node *next;




    for(prior = head; prior && i; prior = prior->next, i--)


        ;




    if(!prior || i) throw bad_pos();


    next = prior->next;




    prior->next = in;


    in->data = e;


    in->next = next;


}




template<class ElemType>


void LinkList<ElemType>::erase(int i)




...{


    node *prior;


    node *er;


    node *next;




    for(prior = head; prior && i; prior = prior->next, i--)


        ;




    if(!prior || i) throw bad_pos();


    if(!(er = prior->next)) throw bad_pos();


    next = er->next;




    prior->next = next;


    delete er;


}




template<class ElemType>


ElemType &LinkList<ElemType>::operator[](int i)




...{


    node *p;




    for(p = head->next; p && i; p = p->next, i--)


        ;




    if(!p || i) throw bad_pos();




    return p->data;


}




template<class ElemType>


void LinkList<ElemType>::for_each(void (*visit)(ElemType &))




...{


    for(node *p = head->next; p; p = p->next)


        visit(p->data);


}




#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息