class LinkedList
{
private:
int data;
LinkedList *ptr;
public:
LinkedList(int i_data)
{
data = i_data;
ptr = 0;
}
~LinkedList()
{
delete ptr ;
}
void insert(LinkedList *node)
{
while(this->ptr!= 0)
this = this->ptr;
this->ptr= node;
}
}我将创建一个像head = new LinkedList(4)这样的头节点,然后像head->insert(new LinkedList(5))一样调用,然后再调用。你能告诉我上面的类代表一个链表吗?我想是的,它有包含下一个节点地址的节点。如果我说错了,请纠正我
发布于 2010-03-22 15:00:26
是的,这个类型当然代表了一个奇特的链表结构,因为它有一个数据槽和一个下一个指针。
不过,我要更改的一件事是insert方法。我的意思是,这个方法接受数据类型会更方便,在本例中是int,让LinkedList类承担分配数据结构的工作。
例如。
void insert(int data) {
while(this->next != 0)
this = this->next;
this->next = new LinkedListNode(data);
}发布于 2010-03-22 15:07:23
您也将最后一个节点的下一个节点指向NULL
无效插入(LinkedList*节点)
{
while(this->next != 0) this = this->next; this->next = node;
node->next = 0;}
发布于 2010-03-22 17:06:11
如果需要链表,请使用链表的STL版本。它已经被实现和测试了,在大多数情况下,大多数人都不会实现比它更好的东西。
从代码的角度来看,您不能赋值给this,因此insert方法将不会被编译--在这里考虑使用尾递归。在稍高一点的级别上,你应该更喜欢初始化列表而不是构造函数体中的赋值。您可以考虑使用智能指针来减轻手动管理内存的需要,即使在这种简单的情况下这不是问题。
您应该始终首先考虑接口,然后再考虑如何为其提供实现。特别是,您可能需要的最简单的接口是:
class List {
public:
List(); // creates an empty list
void append( int value ); // adds a new element at the tail of the list
// push_front( value ) in STL sequence containers
void insert( int value ); // inserts a new element before the head of the list
// push_back( value ) in STL sequence containers
// some way of iterating (I like STL iterators,
// but Java style iterator --even if worse-- could suffice)
};事实上,我希望在接口中有更多的东西,但上面的设置是一个最小的方法(其中不包括析构函数,但我当然希望通过实现来管理资源!)。现在,使用您对LinkedList的定义(实际上更接近于节点的定义),您不能创建空列表。您可以在列表的末尾插入append,但不能在列表的第一个元素之前插入。您没有提供从列表中提取数据的工具(!!)
如果您花了几分钟时间思考您可能想要从链表中获得的额外特性(通过迭代器删除给定的元素,以便您可以搜索值X并将其从列表中删除,在列表中的给定位置插入,而不仅仅是头或尾...)您将在接口中提出其他需求,然后您只需要在代码中满足这些需求,这通常要简单得多:)
https://stackoverflow.com/questions/2490450
复制相似问题