C++通用链表构建(二)
2009-04-26 12:15
176 查看
昨日转载了一篇如何构建C++通用链表的文章,自己对C++不熟悉,看了许久没有看明白这到底是如何实现的。于是打算不管三七二十一了,直接硬搬硬套。不过后来有个比较懂C++的同学帮我看了程序给我讲解了那个程序是如何实现的通用链表。
(注:只看来 C++类实现的方法)
该方法采用了C++硬编码的方式实现通用链表。我们常用的链表,每一个节点都是包含数据区及指针区。但是为了通用,也就是数据区并不确定,因此,程序在写链表节点的Struct时只分配了指针区,但是,这样一个链表就相当与一条指针指向一条指针,完全没有数据是没有意义的。那么,它是如何实现通用链表的呢?首先来讲解它的增加节点。在增加节点函数中,传入参数数据的指针及数据的长度。分配一个新的节点newlist。通过语句
newlist = (pND_LIST)malloc(datasize+sizeof(ND_LIST));来强行扩大节点newlist所占的内存大小,扩大的大小即为传入的数据的大小,然后将数据赋值到此扩大的区域。在进行删除的时候,应分别将该节点删除,同时,将扩大的内存区域清空。
虽然这样的方法能够实现想要的目标,但是,总觉得比较蛮横。
于是自己想到了一个类继承的方法实现。
就是链表的节点类中的数据区域存放的不是简单的数据,而是指向class nodedate的指针。用自己想要的数据继承这个你哦的date,就可以实现想要的通用链表了。
参看:
//节点包含数据类的基类
class nodeDate
{
};
//点的节点类
class nodeVertex :public nodeDate
{
public:
void set(Vertex v);
private:
Vertex ver;
int position;
};
//边的节点类
class nodeSegment :public nodeDate
{
public:
void set(Segment s);
private:
Segment seg;
bool isDefinition;
};
//三角形的节点类
class nodeTriangle : public nodeDate
{
public:
void set(Triangle t);
private:
Triangle tri;
};
//节点类,注此节点是指针节点,指向nodeDate
class node
{
public:
node();
~node();
void setP(nodeDate * p);
void setNext(node * n);
private:
nodeDate * pND;
node * nextN;
};
//链表类
class list
{
public:
//构造函数;
list();
//析构函数
~list();
//清空整个链表
void deleteAll();
//链表复位,使第一个节点成为当前节点
void reset();
//判断链表是否为空
bool isEmpty();
//判断当前节点是否为最后一个节点
bool isEnd();
//返回当前节点的下一个节点,并使其成为当前节点
node nextNode();
/
/返回当前节点中指针pND所指向的nodeDate
nodeDate currentNode();
//向链表中插入一个节点,使其称为当前节点
bool insert(nodeDate nd);
//返回链表的大小
int size();
//删除当前节点,下一个节点成为当前节点,如果移出的节点是最后一个节点,则上一个节点成为当前节点
nodeDate remove();
//返回当前节点的指针
node cursor();
protected:
private:
node *Head;
node *Tail;
node *Pointer;
int length;
};
(注:只看来 C++类实现的方法)
该方法采用了C++硬编码的方式实现通用链表。我们常用的链表,每一个节点都是包含数据区及指针区。但是为了通用,也就是数据区并不确定,因此,程序在写链表节点的Struct时只分配了指针区,但是,这样一个链表就相当与一条指针指向一条指针,完全没有数据是没有意义的。那么,它是如何实现通用链表的呢?首先来讲解它的增加节点。在增加节点函数中,传入参数数据的指针及数据的长度。分配一个新的节点newlist。通过语句
newlist = (pND_LIST)malloc(datasize+sizeof(ND_LIST));来强行扩大节点newlist所占的内存大小,扩大的大小即为传入的数据的大小,然后将数据赋值到此扩大的区域。在进行删除的时候,应分别将该节点删除,同时,将扩大的内存区域清空。
虽然这样的方法能够实现想要的目标,但是,总觉得比较蛮横。
于是自己想到了一个类继承的方法实现。
就是链表的节点类中的数据区域存放的不是简单的数据,而是指向class nodedate的指针。用自己想要的数据继承这个你哦的date,就可以实现想要的通用链表了。
参看:
//节点包含数据类的基类
class nodeDate
{
};
//点的节点类
class nodeVertex :public nodeDate
{
public:
void set(Vertex v);
private:
Vertex ver;
int position;
};
//边的节点类
class nodeSegment :public nodeDate
{
public:
void set(Segment s);
private:
Segment seg;
bool isDefinition;
};
//三角形的节点类
class nodeTriangle : public nodeDate
{
public:
void set(Triangle t);
private:
Triangle tri;
};
//节点类,注此节点是指针节点,指向nodeDate
class node
{
public:
node();
~node();
void setP(nodeDate * p);
void setNext(node * n);
private:
nodeDate * pND;
node * nextN;
};
//链表类
class list
{
public:
//构造函数;
list();
//析构函数
~list();
//清空整个链表
void deleteAll();
//链表复位,使第一个节点成为当前节点
void reset();
//判断链表是否为空
bool isEmpty();
//判断当前节点是否为最后一个节点
bool isEnd();
//返回当前节点的下一个节点,并使其成为当前节点
node nextNode();
/
/返回当前节点中指针pND所指向的nodeDate
nodeDate currentNode();
//向链表中插入一个节点,使其称为当前节点
bool insert(nodeDate nd);
//返回链表的大小
int size();
//删除当前节点,下一个节点成为当前节点,如果移出的节点是最后一个节点,则上一个节点成为当前节点
nodeDate remove();
//返回当前节点的指针
node cursor();
protected:
private:
node *Head;
node *Tail;
node *Pointer;
int length;
};
相关文章推荐
- 在 C/C++中如何构造通用的对象链表
- buildconfiguration[C/C++]_[从netbeans里提取的通用构建C++项目的Makefile文件]
- C、C++中构造通用链表(转载)
- 在 C/C++中如何构造通用的对象链表
- C++ 多态 虚函数 通用链表用c++多态实现(不用模板)
- C++实现的单链表通用模板
- 构建链表 c++
- c++小项目(通用链表实现)
- 技巧:在 C/C++中如何构造通用的对象链表
- 技巧:在 C/C++中如何构造通用的对象链表
- [C/C++]_[从netbeans里提取的通用构建C++项目的Makefile文件]
- 技巧:在 C/C++中如何构造通用的对象链表
- 在 C/C++中如何构造通用的对象链表
- [C/C++]_[从netbeans里提取的通用构建C++项目的Makefile文件]
- 技巧:在 C/C++中如何构造通用的对象链表
- 技巧:在 C/C++中如何构造通用的对象链表[转]
- 在C/C++ 中如何构造通用的对象链表
- 技巧:在 C/C++中如何构造通用的对象链表
- 单链表构建学生信息管理系统(C++)
- 使用protobuf(c++)的构建通用的数据系统(转)