Expand|Select|Wrap|Line Numbers
- #ifndef LINKLIST_H
- #define LINKLIST_H
- #include <cstddef>
- using namespace std;
- template <class Telem> class LinkList;
- template <class Telem> class Node
- {
- private:
- friend class LinkList<Telem>;
- Telem data;
- Node<Telem> *next;
- public:
- Node(Telem d=0,Node <Telem> *n=NULL):data(d),next(n){};
- Telem getdata(){ return data;};
- void setdata(Telem& el){ data=el;};
- Node<Telem> *getnext(){ return next;};
- void setnext(Node<Telem> *p){ next=p;};
- };
- template <class Telem> class LinkList
- {
- private:
- Node<Telem> *head;
- int size;
- public:
- LinkList(){head=new Node<Telem>(); size=0;};
- LinkList(Telem a[],int n);
- ~LinkList(){delete[] head;};
- void clear(){delete[] head; head=new Node<Telem>(); size=0;}; //清空
- Node<Telem> *index(int i); //取得第i个结点的指针
- Telem gete(int i); //取得第i个数据元素
- int leng(){return size;}; //返回长度
- int loct(Telem& el); //返回元素el在单链表中的序号
- bool inst(int loc,Telem& el); //将元素el插入单链表中loc位置
- Telem dele(int i); //删除第i个结点,并返回其数据元素
- bool full(){return false;}; //是否为满
- bool empt(){return head->next=NULL;}; //是否为空
- void sort(); //单链表排序函数
- void orderinst(Node<Telem> *ip); //单链表排序函数内部所用到的函数
- };
- template <class Telem> LinkList<Telem>::LinkList(Telem a[],int n)
- {
- Node<Telem> *p;int i;
- head=new Node<Telem>(0,NULL);
- for(i=n-1;i>=0;i--)
- {
- p=new Node<Telem>(a[i],head->next);
- head->setnext(p);
- };
- size=n;
- };
- template <class Telem> Node<Telem> * ListList<Telem>::index(int i)
- {
- Node<Telem> *p;int j;
- if((i<0)||(i>size)) p=NULL;
- else if(i==0) p=head;
- else
- {
- p=head->next; j=1;
- while((p!=NULL)||(j<i))
- {
- p=p->next; j++;
- };
- };
- return p;
- };
- template <class Telem> Telem LinkList<Telem>::gete(int i)
- {
- if((i<1)||(i>size)) return NULL;
- Node<Telem> *p=index(i);
- return p->getdata();
- };
- template <class Telem> int LinkList<Telem>::loct(Telem& el)
- {
- Node<Telem> *p;int j;
- p=head->next; j=1;
- while(p!=NULL)
- {
- if(p->data==el) break;
- p=p->next; j++;
- }
- if(p!=NULL) return(j); else return(0);
- };
- template <class Telem> bool LinkList<Telem>::inst(int loc,Telem& el)
- {
- if((loc<1)||(loc>size+1)) return false;
- Node<Telem> *p=index(loc-1);
- p->setnext(new Node<Telem>(el,p->next));
- size++;
- return true;
- };
- template <class Telem> Telem LinkList<Telem>::dele(int i)
- {
- if((size==0)||(i<1)||(i>size)) return NULL;
- Node<Telem> *p=index(i-1);
- Telem el=p->next->getdata();
- p->setnext(p->next->next);
- size--;
- return el;
- };
- template <class Telem> void LinkList<Telem>::sort()
- {
- Node<Telem> *p,*s;
- p=head->next; head->next=NULL;
- while(p!=NULL)
- {
- s=p; p=p->next;
- orderinst(s);
- }
- };
- template <class Telem> void LinkList<Telem>::orderinst(Node<Telem> *ip)
- {
- Node<Telem> *p,*q; int data;
- data=ip->data;
- if((head->next=NULL)||(data<=head->next->data)) //空表插入或插入在链头
- {
- ip->next=head->next;
- head->next=ip;
- }
- else
- {
- p=head->next; q=NULL;
- while((p!=NULL)&&(p->data<data))
- {
- q=p;
- p=p->next;
- };
- ip->next=q->next;
- q->next=ip;
- }
- };
- #endif // LINKLIST_H