基于模板类的链表
时间:2007-02-17 来源:PHP爱好者
链表的使用,克服了许多基于数组表的局限性,但是传统的使用C描述的链表,使用起来也有一定的局限性,而基于C++模板类构建的链表,方便,快速,能应付很多情况。
现在,DarkSpy就将写好的基于模板类的链表帖上来,如果发现有什么错误,请随时更正我哦。^_^
// 基于模板类的链表 (C) 2001 CONEOS Software Inc.
// by DarkSpy
#include
template
class Node
{
Node *next;
protected:
T data;
public:
Node(){};
Node(Node *t, T & d); //初始化模板类
void InsertNode(Node *p, T d); //插入一个结点
void DeleteNode(Node *&p, T d); //删除一个指定结点
Node *MakeNode(Node *p, T & d); //构建链表
void Show(Node *p); //打印链表
};
template
Node ::Node(Node *t, T & d) : next(t), data(d) //初始化动作
{ }
template
void Node ::InsertNode(Node *p, T d)
{
while(p->next) p = p->next; //插入结点
next = new Node [sizeof(Node )];
p->next = new Node [sizeof(Node )]; //给新结点分配空间
p->next->data = d; //指针指向当前结点的下一结点,然后将当前结点指向新的结点
p->next->next = p->next;
next = p->next;
next->next = NULL;
}
template
void Node ::DeleteNode(Node * & p, T d) //删除结点
{
Node *temp = p; //保存表
Node *pre = NULL;
while(temp!=NULL && temp->data!=d) //遍历表寻找匹配键值
{
pre = temp;
temp = temp->next;
}
if(temp!=NULL)
{
if(pre==NULL) p = p->next; //表示如果在头结点找到键值
else pre->next = pre->next->next;//如果在以后结点找到键值
delete temp; //删除匹配结点
}
}
template
Node *Node ::MakeNode(Node *p, T & d) //构建链表
{
Node *NEW;
NEW = new Node (p, d); //给新结点分配空间
return NEW;
}
template
void Node ::Show(Node *p) //遍历结点并打印
{
while(p){
cout<data<<' ';
p = p->next;
}
}
main ()
{
Node obj, *p;
p = NULL;
for(int i=1; i<=10; i++)
p = obj.MakeNode(p, i);
obj.InsertNode(p, 32);
obj.InsertNode(p, 200);
obj.Show(p); cout<<'n';
obj.DeleteNode(p, 10);
obj.DeleteNode(p, 32);
obj.InsertNode(p, 120);
obj.Show(p);
}
是不是很简单呢?这段代码稍稍修改就可以应用在许多方面,我们可以使用Node 来建立字典等等有用的功能。
DarkSpy 2001/04/27
php爱好者站 http://www.phpfans.net 文章|教程|下载|源码|论坛.
现在,DarkSpy就将写好的基于模板类的链表帖上来,如果发现有什么错误,请随时更正我哦。^_^
// 基于模板类的链表 (C) 2001 CONEOS Software Inc.
// by DarkSpy
#include
template
class Node
{
Node *next;
protected:
T data;
public:
Node(){};
Node(Node *t, T & d); //初始化模板类
void InsertNode(Node *p, T d); //插入一个结点
void DeleteNode(Node *&p, T d); //删除一个指定结点
Node *MakeNode(Node *p, T & d); //构建链表
void Show(Node *p); //打印链表
};
template
Node ::Node(Node *t, T & d) : next(t), data(d) //初始化动作
{ }
template
void Node ::InsertNode(Node *p, T d)
{
while(p->next) p = p->next; //插入结点
next = new Node [sizeof(Node )];
p->next = new Node [sizeof(Node )]; //给新结点分配空间
p->next->data = d; //指针指向当前结点的下一结点,然后将当前结点指向新的结点
p->next->next = p->next;
next = p->next;
next->next = NULL;
}
template
void Node ::DeleteNode(Node * & p, T d) //删除结点
{
Node *temp = p; //保存表
Node *pre = NULL;
while(temp!=NULL && temp->data!=d) //遍历表寻找匹配键值
{
pre = temp;
temp = temp->next;
}
if(temp!=NULL)
{
if(pre==NULL) p = p->next; //表示如果在头结点找到键值
else pre->next = pre->next->next;//如果在以后结点找到键值
delete temp; //删除匹配结点
}
}
template
Node *Node ::MakeNode(Node *p, T & d) //构建链表
{
Node *NEW;
NEW = new Node (p, d); //给新结点分配空间
return NEW;
}
template
void Node ::Show(Node *p) //遍历结点并打印
{
while(p){
cout<data<<' ';
p = p->next;
}
}
main ()
{
Node obj, *p;
p = NULL;
for(int i=1; i<=10; i++)
p = obj.MakeNode(p, i);
obj.InsertNode(p, 32);
obj.InsertNode(p, 200);
obj.Show(p); cout<<'n';
obj.DeleteNode(p, 10);
obj.DeleteNode(p, 32);
obj.InsertNode(p, 120);
obj.Show(p);
}
是不是很简单呢?这段代码稍稍修改就可以应用在许多方面,我们可以使用Node 来建立字典等等有用的功能。
DarkSpy 2001/04/27
php爱好者站 http://www.phpfans.net 文章|教程|下载|源码|论坛.
相关阅读 更多 +