快速业务通道

数据结构学习(C++)之单链表

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30

节点类

#ifndef Node_H
#define Node_H
template <class Type> class Node //单链节点类
{
 public:
  Type data;
  Node<Type> *link;
  Node() : data(Type()), link(NULL) {}
  Node(const Type &item) : data(item), link(NULL) {}
  Node(const Type &item, Node<Type> *p) : data(item), link(p) {}
 };
#endif

【说明】因为数据结构里用到这个结构的地方太多了,如果用《数据结构》那种声明友元的做法,那声明不知道要比这个类的本身长多少。不如开放成员,事实上,这种结构只是C中的struct,除了为了方便初始化一下,不需要任何的方法,原书那是画蛇添足。下面可以看到,链表的public部分没有返回Node或者Node*的函数,所以,别的类不可能用这个开放的接口对链表中的节点操作。

【重要修改】原书的缺省构造函数是这样的Node() : data(NULL), link(NULL) {} 。我原来也是照着写的,结果当我做扩充时发现这样是不对的。当Type为结构而不是简单类型(int、……),不能简单赋NULL值。这样做使得定义的模板只能用于很少的简单类型。显然,这里应该调用Type的缺省构造函数。 这也要求,用在这里的类一定要有缺省构造函数。在下面可以看到构造链表时,使用了这个缺省构造函数。当然,这里是约定带表头节点的链表,不带头节点的情况请大家自己思考。

【闲话】请不要对int *p = new int(1);这种语法有什么怀疑,实际上int也可以看成一种class。

单链表类定义与实现

#ifndef List_H
#define List_H
#ifndef TURE
 #define TURE 1
#endif
#ifndef FALSE
 #define FALSE 0
#endif
typedef int BOOL;
#include "Node.h"
template <class Type> class List //单链表定义
{
 //基本上无参数的成员函数操作的都是当前节点,即current指的节点
 //认为表中“第1个节点”是第0个节点,请注意,即表长为1时,最后一个节点是第0个节点
 public:
  List() { first = current = last = new Node<Type>; prior = NULL; }
  ~List() { MakeEmpty(); delete first; }
   void MakeEmpty() //置空表
  {
   Node<Type> *q;
   while (first->link != NULL)
   {
    q = first->link;
    first->link = q->link;
    delete q;
   }
   Initialize();
  }
  BOOL IsEmpty()
  {
   if (first->link == NULL)
   {
    Initialize();
    return TURE;
   }
   else return FALSE;
  }
  int Length() const //计算带表头节点的单链表长度
  {
   Node<Type> *p = first->link;
   int count = 0;
   while (p != NULL)
   {
    p = p->link;
    count++;
   }
   return count;
  }
  Type *Get()//返回当前节点的数据域的地址
  {
   if (current != NULL) return &current->data;
   else return NULL;
  }
  BOOL Put(Type const &value)//改变当前节点的data,使其为value
  {
   if (current != NULL)
   {
    current->data = value;
    return TURE;
   }
   else return FALSE;
  }
  Type *GetNext()//返回当前节点的下一个节点的数据域的地址,不改变current
  {
   if (current->link != NULL) return &current->link->data;
   else return NULL;
  }
  Type *Next()//移动current到下一个节点,返回节点数据域的地址
  {
   if (current != NULL && current->link != NULL)
   {
    prior = current;
    current = current->link;
    return &current->

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号