The C++ Programming Language 读书笔记 ch13

        御剑归来, 开始看模板一章, 感觉飘飘悠悠的

template<typename T, int n>

class A

{ };

在模板参数列表中声明的内置数据类型,属于常量.

在VS2005下面, 不支持export, 所以,模板类的声明与定义只能集中在一个文件中, 这个简单的链表模板类有待改进

/******************************************
 * 文件名:linklist.h
 * 功能:定义一个链表的界面
 * 创建日期:2007-9-17
******************************************/

#include <iostream>
using namespace std;

/* 定义链表中结点 */
template <typename T>
class myNode
{
public:
     myNode():next(NULL) { }
     myNode(const T& value):value(value),next(NULL) { }

public:
     T value;
     myNode<T>* next;
};

/*****************************************
 * 定义链表
 * 成员:myNode* front 指向链表第一个结点的指针
 * 操作:addNode() - 在表头添加结点
  deleteNodeby() - 删除结点
  searchby() - 根据具体值遍历链表
  display() - 输出链表
  getMax() - 返回链表最大值
  getSize() - 返回结点总数
  deleteAll() - 删除所有结点,释放内存空间
*****************************************/
template <typename T>
class mylist
{
public:
     mylist():front(NULL) {}
      mylist(const myNode<T>* newNode):front(newNode){}
 
      void addNode(myNode<T>* one); // 通过指针添加
      void addNode(const T& value); // 通过值添加
      bool deleteNodeby(const T& value); // 通过值删除
      bool searchby(const T& value); // 通过值查找,存在则返回该结点指针到e,函数返回true.
             // 否则e置NULL, 函数返回false
      void display(); // 输出所有结点
      myNode<T>* getMax(); // 返回最大值结点指针
      int getSize(); // 返回结点数量
      void deleteAll();

private:
      myNode<T>* front;
};

template <typename T>
void mylist<T>::addNode(myNode<T>* one)
{
      if (front == NULL)
            front = one;
      else
      {
            one->next = front;
            front = one;
      }
}

template <typename T>
void mylist<T>::addNode(const T &value)
{
      myNode<T> *p;
      p = new myNode<T>(value);
      addNode(p);
}

template <typename T>
bool mylist<T>::deleteNodeby(const T& value)
{
      myNode<T> *curr, *prev;
      bool flag; // 找到flag = true, 初始化为false
      curr = front;
      prev = NULL;
      flag = false;
      while ((curr != NULL) && (flag == false))
      {
            if (curr->value == value)
            {
                  myNode<T>* p;
                  p = curr;
                  if (prev == NULL)
                  { 
                        front = front->next;
                        curr = front;
                  }
                  prev->next = curr->next;
                  flag = true;
                  delete p;
            }
            else
            {
                  prev = curr;
                  curr = curr->next;
            }
      }

      return flag;
}

template <typename T>
bool mylist<T>::searchby(const T& value)
{
      myNode<T>* curr;
      bool flag; // 找到flag = true , 初始化为false
      curr = front;
      flag = false;

      while ((curr != NULL) && (flag == false))
      {
            if (curr->value == value)
            {
               //   e = curr;
                  flag = true;
            }
            else
                  curr = curr->next;
      }

      return flag;
}

template <typename T>
void mylist<T>::display()
{
      myNode<T>* curr;
      curr = front;
      while (curr != NULL)
      {
            cout << curr->value << " ";
            curr = curr->next;
      }
}

template <typename T>
myNode<T>* mylist<T>::getMax()
{
      myNode<T> *curr, *max;
      curr = front;
      max = curr;

      while (curr != NULL)
      {
            if (curr->value > max->value)
                  max = curr;
            else
                  curr = curr->next;
      }

           return max; // 这里要考虑一个问题, 局部变量在调用结束时会销毁,但是max所指向的是链表中某个结点的地址
    // 即使销毁了max, 它指向的地址仍然存在. 现在是这样想的
}

template <typename T>
int mylist<T>::getSize()
{
      int count;
      myNode<T>* curr;
      curr = front;
      count = 0;
      while (curr != NULL)
      {
            count++;
            curr = curr->next;
      }

      return count;
}

template <typename T>
void mylist<T>::deleteAll()
{
      myNode<T>* curr;
      while (front != NULL)
      {
            curr = front;
            front = front->next;
            delete curr;
      }
}

链表的声明与定义必要在同一个头文件中

模板这章看得有点乱, 要回头重新细看

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值