我一直试图弄清楚如何实现一个可以容纳任何内容的NODE链接列表(通过模板)。
我已经准备好Node类并且正在工作(使用我的Stack类测试)。
我很好奇我在创建名为insertAtIndex的函数时可能会出错,我在其中存储要存储的数据以及应该存储它的索引。
我的节点类
template <class T>
class Node
{
public:
T *data; //the object information
Node<T> *next; //pointer to the next node element
Node()
{
next = 0;
data = 0;
}
};
到目前为止,这是我的Linked List类
template <class T>
class LinkedList
{
private:
Node<T> *head;
int count;
public:
LinkedList()
{
head = 0;
count = 0;
}
int getCount()
{
return count;
}
void insertAtIndex(T* dat, int index)
{
Node<T> * temp = new Node<T>(dat);
if(index == 0)
{
temp = head;
temp->data = dat;
temp->next = temp->next;
temp->next = temp;
delete temp;
count++;
}
else if(index <= count)
{
Node<T> *cursor = new Node<T>();
for(int i = 0; i < index - 1; i++)
{
cursor = cursor->next;
}
Node<T> * temp = new Node<T>();
temp->data = dat;
temp->next = cursor->next;
cursor->next = temp;
count++;
}
}
void Print()
{
// Temp pointer
Node<T> *tmp = head;
// No nodes
if ( tmp == NULL ) {
cout << "EMPTY" << endl;
return;
}
// One node in the list
if ( tmp->next == NULL ) {
cout << *tmp->data;
cout << " --> ";
cout << "NULL" << endl;
}
else
{
// Parse and print the list
do
{
cout << *tmp->data;
cout << " --> ";
tmp = tmp->next;
}
while ( tmp != NULL );
cout << "NULL" << endl;
}
}
};
答案 0 :(得分:0)
您应该将Node(T *)构造函数添加到Node类:
template <class T>
class Node
{
public:
T *data; //the object information
Node<T> *next; //pointer to the next node element
Node()
{
next = 0;
data = 0;
}
Node(T* newData) { // <<---------- Here it is
next = 0;
data = newData;
}
};
答案 1 :(得分:0)
您需要重新考虑如何将节点添加到列表中。这是您的代码,其中包含对实际操作的评论。
Node<T> * temp = new Node<T>(dat); // Create new node, good
if(index == 0)
{
temp = head; // Throw away pointer to new node, bad. temp is now head.
temp->data = dat; // Overwrite head's data, bad
temp->next = temp->next; // Set a variable to itself, does nothing.
temp->next = temp; // Change head's next to point to itself, bad
delete temp; // delete the head node, bad
count++;
}
你真正想做的是:
这就是全部 - 不要删除任何内容。
一旦你有了这个工作,继续前进到将节点添加到中间或列表(你的其他部分)的更复杂的部分。
调试器(或至少是输出语句)对于了解代码出错的地方至关重要。您可以在每个点查看变量的状态。
答案 2 :(得分:0)
您可能想要考虑只有下一个指针作为成员的基节点类,然后是添加模板数据成员的继承类。公共列表函数可用于基类。