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;
}

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这辈子秃头是不可能的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值