c++实现链表2(摸板类实现)

c++实现链表;

文件说明: list.h     list.cpp     main.cpp

软件:CodeBlocks

应用:摸板类

出现问题:摸板类成员函数定义在list.cpp文件中。main.cpp包含#include "list.h"出现以下错误:

         F:\Program Files\c++test\list\main.cpp|7|undefined reference to `List<int>::List()'|;

         原因是软件编译链接没有包含list.cpp,所以在main.cpp中增加了#include"list.cpp"。问题解决。

         此错误应该是软件的问题。

 

#ifndef __LIST_H
#define __LIST_H
#include <iostream>
using namespace std;

//链表结点类
template<typename T>
class ChainNode
{
 public:
    ChainNode();
    ChainNode(T data);
    ChainNode *GetNext();
    void SetNext(ChainNode *next);
    T GetData();
private:
    T m_data;
    ChainNode *m_next;
};

//链表类
template<typename T>
class List
{
public:
    List();
    virtual ~List();

    List(const List &l); //拷贝构造函数
    List &operator=(const List &l); //拷贝赋值运算符

    bool Append(T data);   //往后追加
    bool Insert(int pos, T data); //插入链表,pos: 1..n, n小于链表结点数
    bool Delete(int pos);     //删除
    void Clear(); //清空链表

    bool Traverse(int (* visit)(T data)); //遍历链表
    ChainNode<T> *GetAddr(int pos);   //获取指向pos结点的指针
private:
    ChainNode<T> *m_head;
    ChainNode<T> *m_tail;
};
#endif // __LIST_H

 

#include "list.h"

template<typename T>
 ChainNode<T>::ChainNode()
 {
      m_data = 0;
      m_next = nullptr;
 }

 template<typename T>
 ChainNode<T>::ChainNode(T data)
 {
     m_data = data;
     m_next = nullptr;
 }

 template<typename T>
  void ChainNode<T>::SetNext(ChainNode *next)
  {
      m_next = next;
  }

 template<typename T>
 ChainNode<T> *ChainNode<T>::GetNext()
 {
    return m_next;
 }

 template<typename T>
 T ChainNode<T>::GetData()
 {
     return m_data;
 }


 template<typename T>
 List<T>::List()
 {
    m_head = new ChainNode<T>();
    m_tail = m_head;
 }

template<typename T>
 List<T>::~List()
 {
    delete m_head;
 }

 template<typename T>
 List<T>::List(const List &l)
 {
    m_head = new ChainNode<T>(*l.m_head);
 }

 template<typename T>
 List<T> &List<T>::operator=(const List &l)
 {
    ChainNode<T> *newp = new ChainNode<T>(*l.m_head);
    delete m_head;
    m_head = newp;
    return *this;
 }

 template<typename T>
  bool List<T>::Append(T data)
 {
    ChainNode<T> *newp = new ChainNode<T>(data);
    m_tail->SetNext(newp);
    m_tail = newp;
    return true;
 }

 template<typename T>
 bool List<T>::Delete(int pos)
 {
     ChainNode<T> *pre = GetAddr(pos - 1);

     if((pre != nullptr) && (pre->GetNext() != nullptr))
     {
         ChainNode<T> *p = pre->GetNext();
         pre->SetNext(p->GetNext());

         if(m_tail == p)
         {
            m_tail = pre;
         }
         delete p;
         return true;
     }else
     {
         return false;
     }


 }

  template<typename T>
  ChainNode<T> *List<T>::GetAddr(int pos)
  {
      int n = 0;
      ChainNode<T> *p = m_head;

      if(pos < 0)
      {
          return nullptr;
      }

      while((p != nullptr) && n < pos)
      {
            p = p->GetNext();
            n++;
      }

      return p;
  }

template<typename T>
   void List<T>::Clear()
   {
       while(Delete(1));
   }

 template<typename T>
 bool List<T>::Insert(int pos, T data)
 {
     ChainNode<T> *newp = new ChainNode<T>(data);
     ChainNode<T> *pre = GetAddr(pos - 1);

     if(pre == nullptr)
     {
         return false;
     }

     newp->SetNext(pre->GetNext());
     pre->SetNext(newp);

     if(newp->GetNext() == nullptr)
     {
            m_tail = newp;
     }

     return true;
 }

 template<typename T>
 bool List<T>::Traverse(int (* visit)(T data))
 {
     ChainNode<T> *p = m_head->GetNext();
     while(p != nullptr)
     {
         if(!visit(p->GetData()))
         {
             return false;
         }
         p = p->GetNext();
     }
     return true;
 }

 

#include "list.h"
#include "list.cpp"
int visit(int data);

int main()
{
    List<int> *lp = new List<int>();
    lp->Append(6);
    lp->Append(7);
    lp->Append(8);
    lp->Insert(4, 9);
    lp->Append(3);
    lp->Delete(5);
    lp->Append(2);
   // lp->Clear();
    lp->Traverse(visit);
    return 0;
}

int visit(int data)
{
    cout << data << endl;
    return 1;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值