C++单向链表模板类

#include <iostream>
#include <stdio.h>
using namespace std;
template<typename T>
class Node{
 public:
  T data;
  Node<T>* next;
  Node<T>* last;
  Node(T d=0)       {data=d;cout<<"Node Constructor run"<<endl;}
  Node(Node<T> &n)  {data=n.data;next=n.next;cout<<"Node CopyConstructor run"<<endl;}
  ~Node()           {cout<<"Node Destructor run"<<endl;}
  T getData()       {return data;}
};
template<typename T>
class LinkList
{
  private:
    Node<T> headNode;        //头结点
    Node<T>* position;       //游标
    int S;
  public:
  LinkList(T *x,int size)
    {
        int i;
        Node<T>* p;
        p=&headNode;
        headNode.last=NULL;
        for(i=0;i<size;i++)
        {
            position=new Node<T>(x[i]);
            position->last=p;
            p->next=position;
            p=position;
        }
        p->next=NULL;
        S=size;
        cout<<"LinkList Constructor run"<<endl;
    }
  LinkList(LinkList<T> &y)
  {
        int i;
        S=y.S;
        Node<T>* p;
        Node<T>* yy=y.headNode.next;
        p=&headNode;
        headNode.last=NULL;
        for(i=0;i<S;i++)
        {
            position=new Node<T>(yy->getData());
            p->next=position;
            position->last=p;
            p=position;
            yy=yy->next;
        }
        p->next=NULL;
        position=headNode.next;
        cout<<"LinkList CopyConstructor run"<<endl;
    }
  ~LinkList()
  {
        Node<T>* p;
        p=headNode.next;
        for(int i=0;i<S;i++)
        {
            position=p;
            p=position->next;
            delete position;
        }
        cout<<"LinkList Destructor run"<<endl;
    }
   void insertNode(Node<T> &n)      //在游标位置后插入一个同类型结点n
   {
        n.next=position->next;
        position->next=&n;
        S++;
    }
   int searchNode(T value)          //在链表中查找数据域等于value的结点,若查找成功的同时修改游标位置。
   {
        int i;
        Node<T>* p=headNode.next;
        for(i=0;i<S;i++)
        {
            if(p->getData()==value)
                {position=p;return 1;}
            p=p->next;
        }
        return 0;
    }
   void next()//使游标移动到下一个结点
    {
        if(position->next!=NULL)
        position=position->next;
    }
   Node<T>& currNode()const          //返回当前结点。
    {
        return *position;
    }
   void delNode()             //移除当前结点
    {
        Node<T> *t=position;
            if(position->next==NULL)
           {
            position=position->last;
            position->next=NULL;
           }
           else
           {
            t->last->next=t->next;
            t->next->last=t->last;
            position=position->last;
           }
          S--;
    }
   void show()                 //输出链表。
   {
        int i;
        Node<T> *p=headNode.next;
        for(i=0;i<S;i++){
            cout<<"["<<p->getData()<<"]";
            p=p->next;
        }
        cout<<endl;
    }
   int getSize()               //返回链表中的元素个数
   {
       return S;
   }
};
int main()
{
    int i,a[5]= {0,1,2,3,4};
    for(i=0;i<5;i++)
        scanf("%d",&a[i]);
    LinkList<int> l1(a,5),l2(l1);
    cout<<l2.getSize()<<endl;
    l1.show();
    if (l2.searchNode(2))
        cout<<"Found:"<<l2.currNode().getData()<<endl;
    else
        cout<<"Not Found"<<endl;
    l2.delNode();
    Node <int> *p1=new Node<int>(11);
    l2.insertNode(*p1);
    l2.show();
    return 0;
}

Guess you like

Origin blog.csdn.net/y0205yang/article/details/120277433