The C++ Programming Language 读书笔记 ch13

原创 2007年09月18日 22:48:00

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

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

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

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

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

《The C++ Programming Language》第四章读书笔记之忠告

【1】保持较小的作用域; 4.9.4节。 【2】不要在一个作用域和他外围的作用域里使用同样的名字; 4.9.4节。         例如: int x; //局部变量 x = 1; { in...

The Java Programming Language4th读书笔记-第三章 类的扩展

在类的外部可以访问的方法和字段的集合,加上它们应具有的行为的描述,通常称为该类的契约。契约是类的设计者对类的行为所做的承诺。 如果扩展类构造器的第一条可执行语句既不是调用超类构造器的语句,也不是调用扩...

The C programming language --第二章 类型、运算符与表达式 读书笔记

1

《The C Programming Language》读书笔记总结 <一>.基础篇

写了这么多年的C代码,回过头来再看《The C Programming Language》这本书,作者Brian W. Kernighan和C语言之父Dennis M. Ritchie。感觉里面的知识...

TCPL(The C Programming Language)读书笔记 第五章 指针与数组

1、指针与地址   指针是一种保存变量地址的变量。机器的一个字节可以存放一个char类型的数据,两个相邻的字节存储单元可存储一个short(短整型)类型的数据,而4个相邻的字节存储单元可存储一个lon...

TCPL(The C Programming Language)读书笔记 第一章导言

1.1             入门一个C语言程序,无论大小如何,都是由函数和变量组成的。函数中包含一些语句,以指定所要执行的计算操作;变量则用于存储计算过程中使用的值。函数之间进...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)