基于模板类的链表(转)[@more@]基于模板类的链表
链表的使用,克服了许多基于数组表的局限性,但是传统的使用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<<;
obj.DeleteNode(p, 10);
obj.DeleteNode(p, 32);
obj.InsertNode(p, 120);
obj.Show(p);
}
是不是很简单呢?这段代码稍稍修改就可以应用在许多方面,我们可以使用Node来建立字典等等有用的功能。
DarkSpy 2001/04/27
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10796304/viewspace-962550/
,如需转载,请注明出处,否则将追究法律责任。