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))
随后。你能否告诉我上面的课程代表一个链表。我想是的它有包含下一个节点地址的节点。如果我错了,请纠正我
答案 0 :(得分:2)
是的,这种类型肯定代表一个单独链接的列表结构,因为它有一个数据槽和一个下一个指针。
我要改变的一件事是insert
方法。恕我直言,这种方法采用数据类型更方便,在本例中为int
,让LinkedList
类承担分配数据结构的工作。
例如。
void insert(int data) {
while(this->next != 0)
this = this->next;
this->next = new LinkedListNode(data);
}
答案 1 :(得分:1)
您已将最后一个节点的下一个指向NULL
void insert(LinkedList * node)
{
while(this-> next!= 0)
this = this-> next;
this->next = node;
node->next = 0;
}
答案 2 :(得分:1)
如果您需要链接列表,请使用它的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并将其从列表中删除,在给定的位置插入在列表中的位置,而不仅仅是头部或尾部...)您将在界面中提出其他要求,然后您只需要在代码中满足这些要求,这总是更简单:)
答案 3 :(得分:0)
};
。node
和list
类更简单,因为在您的情况下,内存管理完全落在用户身上,使得这个类的使用变得很痛苦。 / LI>
醇>
答案 4 :(得分:0)
成员'next'在哪里定义?
你的insert()使用'this-> next', 但是只有成员'数据'和'ptr'。
答案 5 :(得分:0)
我的问题是你没有从列表的节点中对列表进行分类 这会导致您没有空指针而没有空指针的问题:
我将创建一个头节点,如head = new LinkedList(4)
代码:
class LinkedList
{
struct Node
{
Node(int d): data(d) {next = NULL;}
~Node() {delete next;}
int data;
Node* next;
};
std::auto_ptr<Node> head;
Insert(int data)
{
if (head.get() == NULL)
{
head.reset(new Node(data));
}
else
{
Node* loop;
for(loop = head.get();loop->next != NULL;loop = loop->next) {};
loop->next = new Node(data);
}
}
};
LinkedList list;