总结报告
感谢所有有用的反馈。cin.clear()
很有帮助;关于设置next
为 NULL 的评论也是如此。但是最后一个问题(正如评论中所诊断的)是我Ctrl+D
用来逃避,并且cin >> k
没有正确处理这个问题。当我添加k > 0
到 while 条件(参见更新的代码)并用负数转义时,一切都开始工作了。
我讨厌发布大量代码,但我认为我不能进一步修剪它。关键是我的程序在第一次复飞时有效,但不是第二次。(跳到main
看看我的意思。)
#include <iostream>
using namespace std;
struct ListNode {
int data;
ListNode* next;
};
void print_list(ListNode* node) {
cout << node->data << endl;
while ((node = node->next) != NULL) {
cout << node->data << endl;
}
}
ListNode* read_list() {
ListNode *head, *tail;
int k;
head = NULL;
while ((cin >> k) && k > 0) {
if (head == NULL) {
head = tail = new ListNode;
} else {
tail->next = new ListNode;
tail = tail->next;
}
tail->data = k;
tail->next = NULL;
}
return head;
}
int main() {
ListNode *list1, *list2;
list1 = read_list();
print_list(list1); // Works
list2 = read_list();
print_list(list2); // Does not work!
return 0;
}
然后是输出:
Press ENTER or type command to continue
1
3
5
7
List1
1
3
5
7
List2
Command terminated
你看到它在打印之前是如何终止的List2
吗?(前四行来自标准输入。请参阅main
。)这里出了什么问题?我不明白为什么相同的逻辑第一次会起作用,但第二次不会。
也许是因为我没有为第一个链表释放内存?