#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
#include <iostream>
#include "linklist.h"
using namespace std;
int main(int argc,char *argv[])
{
LINKLIST <int> a;
int i;
for(i=97;i<97+26;i++)
a.insert(a.size_list(),i);
LINKLIST <int> b;
for(i=97;i<97+5;i++)
b.insert(i-97,i);
a.traverse();
b.traverse();
LINKLIST <int> c;
c.combine_list(a);
c.combine_list(b);
c.traverse();
return 0;
}
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