以下天真代码实现了一个链表,而不打印main函数中的所有元素,一切都会好的。但是,LinkedList::printll
函数将触发设置错误(Gcc 5.3.0),问题与我认为的头节点的适当处理有关...
那么,有没有办法让这段代码能够最少修改printll
函数?
#include <iostream>
using namespace std;
struct Node{
int value;
Node* next;
};
struct LinkedList{
Node* head= NULL ;
void append(int);
void printll();
};
void LinkedList::append(int data){
Node* cur = head;
Node* tmp = new Node;
tmp->value = data;
tmp->next = NULL;
if(!cur){
cur = tmp; // cur-> head
}
else{
while(cur->next != NULL){
cur = cur->next;
}
cur->next = tmp;
}
std::cout<<cur->value<<std::endl; // cur-> temp
delete tmp; // comment out
}
void LinkedList::printll(){
Node* cur = head;
while(cur->next != NULL){ //
std::cout<<cur->value<<std::endl;
cur = cur->next;
}
}
int main(){
LinkedList LL;
LL.append(5);
LL.append(6);
LL.append(7);
LL.printll(); // --without this, the program is fine
return 0;
}
答案 0 :(得分:3)
append
中有一些错误:
if(!cur){
cur = tmp;
}
这仅分配给本地副本。我假设你在这里设置head
,所以这样做:head = tmp;
。请注意,在这种情况下,您无法打印cur
,因为您尚未设置它。您可以打印tmp->value
。
然后:
delete tmp;
您刚刚创建并将其分配到位 - 为什么要删除它?你知道仍然有一个指向它的指针。当你完成清单时,只有delete
来清理清单(你现在根本不做清理)。
除此之外,您的printll
不会打印最后一个元素 - 考虑它什么时候停止:
A -> B -> C -> NULL
它将在节点C
上停止,但永远不会打印C
的值。你可以直接替换:
while(cur->next != NULL){
与
while(cur != nullptr){
(另外,我不喜欢endl
)。
See here for these changes running:
#include <iostream>
struct Node{
int value;
Node* next;
};
struct LinkedList{
Node* head = nullptr ;
void append(int);
void printll();
};
void LinkedList::append(int data){
Node* cur = head;
Node* tmp = new Node;
tmp->value = data;
tmp->next = nullptr;
if(!cur){
head = tmp;
}
else{
while(cur->next != nullptr){
cur = cur->next;
}
cur->next = tmp;
}
}
void LinkedList::printll(){
Node* cur = head;
while(cur != nullptr){
std::cout << cur->value << '\n';
cur = cur->next;
}
}
int main(){
LinkedList LL;
LL.append(5);
LL.append(6);
LL.append(7);
LL.printll();
}
答案 1 :(得分:0)
1.你不能
delete tmp;
因为tmp是一个指针,当你运行delete tmp时,你删除了该对象。
2.打印功能应该是这样的:
void LinkedList::printll(){
Node* cur = head;
while(cur->next != NULL){ // -> problems is here
std::cout<<cur->value<<std::endl;
cur = cur->next;
}
std::cout<<cur->value<<std::endl;
}