我正在尝试制作一个循环链接列表,但遇到了问题。
如果我使用上面的两行代码运行该程序,则在我编译和运行时,如果元素数大于2,它将得到cin的无限循环。如果没有,它们会正常工作,但现在不再有效了循环链表。你能帮我吗 ?
问题就在这里
toPush->next = head;
head->pred = toPush;
完整代码:
#include <iostream>
using namespace std;
typedef int data;
// Nodes
struct elements {
data value;
elements* next;
elements* pred;
};
// Function that pushes the element to the end
void insertElementEnding(elements* &head, data var) {
elements* toPush = new elements;
toPush->value = var;
toPush->next = NULL;
toPush->pred = NULL;
if(head == NULL) {
head = toPush;
} else {
elements* node = new elements;
node = head;
while(node->next != NULL) {
node = node->next;
}
node->next = toPush;
toPush->pred = node;
toPush->next = head;
head->pred = toPush;
}
}
// Function that prints the list
void showList(elements* head, int numbers) {
for(int i = 0; i < numbers && head != NULL; i++) {
cout << head->value;
head = head->next;
}
}
int main() {
elements* head = NULL;
int var, n;
cout << "Introduce the number of elements: ";
cin >> n;
for(int i = 0; i < n; i++) {
cin >> var;
insertElementEnding(head, var);
}
showList(head, n);
return 0;
}
谢谢。
答案 0 :(得分:3)
您需要寻找循环的开始,而不是NULL,即
while(node->next != NULL)
应该是
while(node->next != head)
作为旁注,在C ++中,您应该使用nullptr
而不是NULL
。
您的程序中也有内存泄漏。您不需要分配新的内存就可以获取用于迭代列表的指针。这就是问题所在:
elements* node = new elements;
node = head;
一个更好的方法就是
elements* node = head;
答案 1 :(得分:0)
首先,对NULL的验证仅在将第一个元素插入列表之前检查列表是否未初始化才有意义。
在所有其他情况下,这都是多余的,因为圆头应该始终具有前后的元素。如果它至少是一个,它就指向自己。
然后,如果您稍微更改功能,它将解决问题
void insertElementEnding(elements* &head, data var) {
elements* toPush = new elements;
toPush->value = var;
if(head == NULL) {
head = toPush;
head->next = toPush;
head->pred = toPush;
} else {
// insert the new element before the head
head->pred->next = toPush;
head->pred = toPush;
}
}