C++单向链表实例

给个新建模板类的例子MyNodeList <pixeldata> nd=new MyNodeList<pixeldata>();//链表初始化 其中pixeldata是自己定义的一个结构体


//Node.h

template <class T>
class Node
{
private:
          Node<T>* next;
          T data;
public:
           Node();
           Node(const T& item,Node<T>* ptrnext=NULL);
           ~Node();
           void SetData(T &item);          //设置节点的数据域
           T GetData() const;                     //取节点的数据域 
          void InsertAfter(Node<T> *p);   //在节点后插入一个节点P
          Node<T>* DeleteAfter();        //删除节点邻接的下一个节点
          Node<T>* NextNode() const;      //取节点邻接的下一个节点
};//---------------


template<class T>
Node<T>::Node():next(NULL){}    //空的构造函数
template<class T>
Node<T>::Node(const T &item,Node<T>* ptrnext)
{
        data=item;
        next=ptrnext;
}//-----------------------------------------------
template<class T>
Node<T>::~Node()         //析构函数
{
       delete[] next;
}//-----------------------------------------------
template<class T>
void Node<T>:: SetData(T &item)   //设置节点的数据域 

        data=item;
}//-----------------------------------------------
template<class T>
T Node<T>::GetData()const     //取节点的数据域
{
        return data;
}//----------------------------------------------- 
template<class T>
void Node<T>::InsertAfter(Node<T>*p)   //在节点后插入一个节点P
{
        p->next=next;
        next=p;
}//-----------------------------------------------
template<class T>
Node<T>* Node<T>::DeleteAfter()     //删除节点邻接的下一个节点
{
        if(next==NULL) 
                 return NULL;
       Node<T>* tempptr=next;
        next=tempptr->next;
        return tempptr;
}//-----------------------------------------------
template<class T>
Node<T>* Node<T>::NextNode()const   //取节点邻接的下一个节点
{
         return next;
}//-------------------------------------------------------------------





//NodeList.h

#include "stdafx.h"
template <class T>
class NodeList
{
private:
      Node<T> *front,*rear;    //表头和表尾指针
      Node<T> *currptr;       //指向当前节点的指针
      Node<T> *GetNode(const T &item,Node<T>*ptrNext=NULL); //构造一个节点
public:
      NodeList();
      NodeList(const NodeList<T>& L);      //拷贝构造函数
      ~NodeList();
      void Reset();          //复位,将currptr重新指向表头
      void InsertFront(const T& item);     //表头插入节点
      void InsertRear(const T& item);   //表尾插入节点
      void InsertAfter(const T& item);    //在当前节点(currptr所指节点)处插入节点
      int Find(const T &item); //在链表中查找item,若在链表中返回1并把currptr指向item第一次出现的     节点;若没有返回0
      void LSort();    //按数据域大小从小到大排序
      void Reverse(); //倒置链表
      int IsEmpty();   //链表是否为空
      int IsEndOfNodeList(); //当前指针currptr是否到达表尾
       void Next();   //当前指针currptr指向下一个节点,并返回该节点
      T Data();         //取当前节点的数据域
      Node<T>* DeleteAt();           //删除当前节点 
      void PrintNodeList();       //打印链表
};//-----------------------------------------------

template<class T>
NodeList<T>::NodeList():front(NULL),rear(NULL),currptr(NULL){}
//-----------------------------------------------
template<class T>
NodeList<T>::NodeList(const NodeList<T>& L)    //拷贝构造函数
{
      L.Reset();
      while(!L.IsEndOfNodeList())
      {
           InsertRear(L.Data());
            L.Next();
      }
      InsertRear(L.Data());
}//-----------------------------------------------
template<class T>
NodeList<T>::~NodeList()
{
     delete[] front;
}//-----------------------------------------------
template<class T>
Node<T>* NodeList<T>::GetNode(const T &item,Node<T>*ptrNext) //构造一个节点
{
     Node<T>* newNode;
     newNode=new Node<T>(item,ptrNext);
     if(newNode==NULL)
     {
          cerr<<"Memory allocation failure!";
          exit(1);
     }
     return newNode;
}//-----------------------------------------------
template<class T>
void NodeList<T>::Reset()         //复位,将currptr重新指向表头
{
       currptr=front;
}//-----------------------------------------------
template<class T>
void NodeList<T>::InsertFront(const T& item)   //表头插入节点
{
      if(front==NULL)        //如果表为空,插入一个节点后,表头和表尾指针都要指向插入节点
      {
           front=rear=GetNode(item,front);
      }
      else
      {
           front=GetNode(item,front);
      }
}//-----------------------------------------------
template<class T>
void NodeList<T>::InsertRear(const T& item)    //表尾插入
{
      if(front==NULL)              //如果表为空,插入一个节点后,表头和表尾指针都要指向插入节点
      {
           front=rear=GetNode(item,front);
      }
      else
      {
           rear->InsertAfter(GetNode(item)); //表不为空时,在表尾插入节点,并将rear重新指向新的表尾
           rear=rear->NextNode();
      }
}//-----------------------------------------------
template<class T>
void NodeList<T>::InsertAfter(const T& item)   //在当前节点后插入节点
{
      if(currptr!=NULL)        //若表不为空,则currptr有值,可以插入
      {
          if(rear==currptr)
           {
                 InsertRear(item);
           }
           else
           {
                 currptr->InsertAfter(GetNode(item));
           }
      }
      else                     //若表为空,则currptr指向空,插入失败
      {
           cerr<<"currptr is null!!";
      }
}//-----------------------------------------------
template<class T>
int NodeList<T>::Find(const T& item)     //在链表中查找item,若在链表中返回1并把currptr指向item第一次出现的节点;若没有返回0
{
     Reset();
     while(currptr!=NULL&&Data()!=item)
     {
          currptr=currptr->NextNode();
     }
     if(currptr==NULL)    
           return 0;
     return 1;
}//-----------------------------------------------
template<class T>
void NodeList<T>::LSort()    //按数据域大小从小到大排序,链表若不会空,每次取链表中最大的节点放入临时链表中,并从原来链表中删除
{
      if(front==NULL)      //直到原来链表为空,排序完成
      {
          cerr<<"NodeList is empty!";
      }
      else
      {
          Node<T> *lptr=new Node<T>(); 
          Node<T> *rptr;        //记住排好序后的表尾,即链表中最大的节点
          Node<T> *tempptr;
          int flag=0;         //标记排好序后的表尾
          while(!IsEmpty())
          { 
               tempptr=front;
               Reset();
               while(currptr!=NULL) //每次循环都依次取链表中一个节点与tempptr比较,并将大的放入tempptr
               {
                     if(tempptr->GetData()<Data())
                              tempptr=currptr;
                     currptr=currptr->NextNode();   
               }
               if(flag==0) 
                   rptr=tempptr;     //记住排好序后的表尾
               flag=1;          
               currptr=tempptr;        //让currptr指向链表中最大的节点,及当前节点就是最大节点
               lptr->InsertAfter(DeleteAt()); //将最大的节点从原来链表中删除,并放入临时链表中
          }
          front=lptr->NextNode();   //将排好序的链表复制给要求排序的链表 
          rear=rptr;     //将排好序的表尾赋值给rear
      }
}//-----------------------------------------------
template<class T>
void NodeList<T>::Reverse()              //倒置链表,从表头删除并插入表尾
{
       if(front==NULL)
       {
           cerr<<"NodeList is empty!";
       }
       else
       {
           Node<T>* fptr;
           fptr=front;                 //记住开始的表头节点,以便赋值给倒置后的表尾
           while(front!=rear)
           {
                Reset();
                rear->InsertAfter(DeleteAt());    //表头删除插入表尾
           }
           rear=fptr;                //原来的表头节点赋值给倒置后的表尾
       }
}//-----------------------------------------------
template<class T>
int NodeList<T>::IsEmpty()
{
       return front==NULL;
}
template<class T>
T NodeList<T>::Data()       //取当前节点的数据域
{
      return(currptr->GetData());
}//-----------------------------------------------
template<class T>
int NodeList<T>::IsEndOfNodeList()
{
     return currptr==rear;
}//-----------------------------------------------
template<class T>
void NodeList<T>::Next()

    currptr=currptr->NextNode();
}//-----------------------------------------------
template<class T>
Node<T>* NodeList<T>::DeleteAt()    //删除当前节点
{
      if(currptr==front)     
      {
          if(front==rear)    //若链表中只有一个节点,表头表尾指针都要指向空
                 front=rear=NULL;
          else
                front=currptr->NextNode(); //若当前节点就是表头,删除后,表头指针顺序后延
      }
      else
      {   
            Node<T>* tempptr=front;    
            while(tempptr->NextNode()!=currptr)   //若当前节点不是表头,找到当前节点的前一个节点,通过Node<T>中定义的DeleteAfter()
            {                                      //删除当前节点
                tempptr=tempptr->NextNode();
            }
            tempptr->DeleteAfter();
       }
       return currptr;
}//-----------------------------------------------
template<class T>
void NodeList<T>::PrintNodeList()    //打印链表,每打印十个,换行
{
       Node<T> *tempptr=front;
       int count=1;
       while(tempptr!=NULL)
       {
            cout<<tempptr->GetData()<<" ";
            if((count++)%10==0) 
            cout<<endl;
            tempptr=tempptr->NextNode();
       }
       cout<<endl;
}//-----------------------------------------------


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面向对象程序设计课程作业 1. 请创建一个数据类型为T的链表类模板List,实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个空链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分) 3) 析构函数~List(),释放链表中的所有节点(10分) 4) Push_back(T e)函数,往链表最末尾插入一个元素为e的节点(10分) 5) operator<<()友元函数,将链表的所有元素按顺序输出(10分) 6) operator=()函数,实现两个链表的赋值操作(10分) 7) operator+()函数,实现两个链表的连接,A=B+C(10分) 2. 请编写main函数,测试该类模板的正确性: 1) 用List模板定义一个List类型的模板类对象int_listB,从键盘读入m个整数,调用Push_back函数将这m个整数依次插入到该链表中;(4分) 2) 用List模板定义一个List类型的模板类对象int_listC,从键盘读入n个整数,调用Push_back函数将这n个整数依次插入到该链表中;(4分) 3) 用List模板定义一个List类型的模板类对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List类型的模板类对象double_listA, double_listB, double_listC,重复上述操作。(15分) 3. 输入输出样例: 1) 输入样例 4 12 23 34 45 3 56 67 78 3 1.2 2.3 3.4 4 4.5 5.6 6.7 7.8 2) 输出样例 12 23 34 45 56 67 78 1.2 2.3 3.4 4.5 5.6 6.7 7.8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值