`
qvb3d
  • 浏览: 170989 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

C++双向链表

 
阅读更多
#ifndef LINKLIST_H
#define LINKLIST_H
using namespace std;
template <class elem_type>
class LINKLIST
{
    private:
       struct NODE
       {
	  NODE *pre;
	  elem_type element;
	  NODE *next;
	  NODE(const elem_type &element,NODE *pre=NULL,NODE *next=NULL);
	  NODE();
	  ~NODE();
       };
       NODE *head;
       NODE *tail;
       NODE *current;
       int  size;
       NODE *pos(int i) const;
    public:
       LINKLIST();
       ~LINKLIST();
       void insert(int i,const elem_type &x);
       void traverse() const;
       void clear();
       int size_list() const;
       void combine_list(const LINKLIST &y);
       void combine_list(LINKLIST &x,const LINKLIST &y);
       void combine_list(LINKLIST &x,const LINKLIST &y,const LINKLIST &z);
};
template <class elem_type>
LINKLIST <elem_type>::NODE::NODE(const elem_type &element,NODE *pre,NODE *next):element(element),pre(pre),next(next){}
template <class elem_type>
LINKLIST <elem_type>::NODE::NODE():pre(NULL),next(NULL){}
template <class elem_type>
LINKLIST <elem_type>::NODE::~NODE(){}
template <class elem_type>
LINKLIST <elem_type>::LINKLIST()
{
   head=new NODE;
   head->next=tail=new NODE;
   tail->pre=head;
   tail->next=head;
   head->pre=tail;
   size=0;
}
template <class elem_type>
LINKLIST <elem_type>::~LINKLIST()
{
   clear();
   delete head;
   delete tail;
}
template <class elem_type>
typename
LINKLIST <elem_type>::NODE *LINKLIST <elem_type>::pos(int i) const
{
NODE *temp=head->next;
if(i<0||i>size+1)
  {
     cout<<"range out linklist"<<endl;
     return NULL;
  }
else
  {
  while(i--)
     temp=temp->next;
  }
return temp;
}
template <class elem_type>
void LINKLIST<elem_type>::insert(int i,const elem_type &x)
{
   NODE *p,*temp;
   p=pos(i);
   temp=new NODE(x,p->pre,p);
   p->pre->next=temp;
   p->pre=temp;
   ++size;
}
template <class elem_type>
void LINKLIST<elem_type>::traverse() const
{
  NODE *temp;
  temp=head->next;
  cout<<"The LINKLIST ---\n";
  while(temp!=tail)
      {
	 cout<<"["<<(char)temp->element<<"] ";
	 temp=temp->next;
      }
      cout<<endl;
 }
 template <class elem_type>
 void LINKLIST <elem_type>::clear()
 {
    NODE *p;
    NODE *q;
    p=head->next;
    head->next=tail;
    tail->pre=head;
    while(p!=tail)
    {
       q=p->next;
       delete p;
       p=q;
    }
    size=0;
 }
 template <class elem_type>
 int LINKLIST <elem_type>::size_list() const
 {
    return size;
 }
 template <class elem_type>
 void LINKLIST <elem_type>::combine_list(const LINKLIST &y)
 {
    for(NODE *temp=y.head->next;temp!=y.tail;temp=temp->next)
        insert(size_list(),temp->element);
 }
template <class elem_type>
void LINKLIST <elem_type>::combine_list(LINKLIST &x,const LINKLIST &y)
{
   for(NODE *temp=y.head->next;temp!=y.tail;temp=temp->next)
      x.insert(x.size_list(),temp->element);
}
template <class elem_type>
void LINKLIST <elem_type>::combine_list(LINKLIST &x,const LINKLIST &y,const LINKLIST &z)
{
   for(NODE *temp=y.head->next;temp!=y.tail;temp=temp->next)
      x.insert(x.size_list(),temp->element);
   for(NODE *temp=z.head->next;temp!=z.tail;temp=temp->next)
      x.insert(x.size_list(),temp->element);
}
#endif
   
main: link_main.o
	g++  link_main.o -o link
	rm -rf link_main.o
link_main.o: linklist.h
	g++ -c link_main.cpp
clean: link
	rm -rf link link_main.o
		
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics