C++ 为什么是C++;链表程序终止?
总结报告 感谢所有有用的反馈C++ 为什么是C++;链表程序终止?,c++,linked-list,C++,Linked List,总结报告 感谢所有有用的反馈cin.clear()非常有用;关于将next设置为NULL的评论也是如此。但是最后一个问题(正如在评论中诊断的那样)是我使用了Ctrl+D来逃避,而cin>>k没有正确处理这个问题。当我将k>0添加到while条件中(请参见更新的代码)并用负数转义时,它就开始工作了 我讨厌发布大量的代码,但我认为我不能再进一步删减它了。关键是我的程序在第一次循环中有效,但在第二次循环中无效。(跳到main了解我的意思。) 您看到它在打印列表2之前是如何终止的吗?(前四行来自std
cin.clear()
非常有用;关于将next
设置为NULL的评论也是如此。但是最后一个问题(正如在评论中诊断的那样)是我使用了Ctrl+D
来逃避,而cin>>k
没有正确处理这个问题。当我将k>0
添加到while条件中(请参见更新的代码)并用负数转义时,它就开始工作了
我讨厌发布大量的代码,但我认为我不能再进一步删减它了。关键是我的程序在第一次循环中有效,但在第二次循环中无效。(跳到
main
了解我的意思。)
您看到它在打印列表2
之前是如何终止的吗?(前四行来自stdin。请参阅main
)这里出了什么问题?我不明白为什么同样的逻辑第一次有效,第二次却不行
可能是因为我没有为第一个链表释放内存?此代码存在多个问题
next
设置为NULL
。这将导致任何非空列表崩溃std::cin.clear()
。EOF标志为“粘性”print\u list()
函数不处理空列表。这将导致任何空列表崩溃- GDB(运行
而不是GDB./a.out
,记住使用/a.out
编译)-g
- 挡泥板(使用
编译)-fmudflap-lmudflap
- Valgrind(运行
而不是Valgrind./a.out
)/a.out
- 铿锵静态分析仪
因此,您应该至少使用这四种工具中的一种。我喜欢在同一个项目中使用这四种代码。此代码存在多个问题
head = NULL;
while (cin >> k) {
if (head == NULL) {
head = tail = new ListNode;
} else {
next
设置为NULL
。这将导致任何非空列表崩溃std::cin.clear()
。EOF标志为“粘性”print\u list()
函数不处理空列表。这将导致任何空列表崩溃- GDB(运行
而不是GDB./a.out
,记住使用/a.out
编译)-g
- 挡泥板(使用
编译)-fmudflap-lmudflap
- Valgrind(运行
而不是Valgrind./a.out
)/a.out
- 铿锵静态分析仪
head = NULL;
while (cin >> k) {
if (head == NULL) {
head = tail = new ListNode;
} else {
我希望你能看到问题所在。首先将head设置为null,然后检查它是否为null
试着这样做:
ListNode* readList(ListNode* head)
{
int data;
cin >> data;
ListNode* nNode = new ListNode;
nNode->data = data;
nNode->next = 0;
if (head == null)
{
head = nNode;
}
else
{
ListNode* tail = head;
while (tail->next != 0)
{
tail = tail->next;
}
tail->next = nNode;
}
return head;
}
或者类似的事情。自从我上次创建linkedlist已经有一段时间了
我希望你能看到问题所在。首先将head设置为null,然后检查它是否为null
试着这样做:
ListNode* readList(ListNode* head)
{
int data;
cin >> data;
ListNode* nNode = new ListNode;
nNode->data = data;
nNode->next = 0;
if (head == null)
{
head = nNode;
}
else
{
ListNode* tail = head;
while (tail->next != 0)
{
tail = tail->next;
}
tail->next = nNode;
}
return head;
}
或者类似的事情。距离我上次创建linkedlist已经有一段时间了。您应该在第一次读取列表()之后调用cin.clear() 以下代码运行良好:
#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) {
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);
cin.clear(); // ADD this line
list2 = read_list();
print_list(list2);
return 0;
}
您应该在第一次读取列表()之后调用cin.clear() 以下代码运行良好:
#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) {
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);
cin.clear(); // ADD this line
list2 = read_list();
print_list(list2);
return 0;
}
修改打印列表的方式:
void print_list(ListNode* node)
{
while (node)
{
cout << node->data << endl;
node = node->next;
}
}
程序崩溃将得到解决。修改打印列表的方式:
void print_list(ListNode* node)
{
while (node)
{
cout << node->data << endl;
node = node->next;
}
}
程序崩溃将得到解决。我猜这是因为您没有处理来自cin的非整数数据,所以第二个列表永远不会填充。我按Ctrl+D中断对stdin的读取。这就是问题所在吗?我想是的,但我现在脑子里是Java,所以cin的细节不在我脑子里。Dietrich也是对的“下一步”没有设置,这会给你带来问题。因为你从来没有给List2提供任何输入,所以这个列表是空的。调用printList时,node为null,因此node->data将导致分段错误。结果表明,这个适度的注释就是答案。我猜这是因为您不处理来自cin的非int数据,所以第二个列表永远不会填充。我按Ctrl+D中断对stdin的读取。这就是问题所在吗?我想是的,但我现在脑子里是Java,所以cin的细节不在我脑子里。Dietrich也是对的“下一步”没有设置,这会给你带来问题。因为你从来没有给List2提供任何输入,所以这个列表是空的。当你调用printList时,node是空的,所以node->data会导致一个分段错误。事实证明,这个适度的注释就是答案。我想知道这一点。我试过了,但没有解决问题。但似乎我无论如何都应该这么做。@ktm5124:在事情成功之前不要乱动,这是修复坏程序的一种鲁莽的方式。
next
字段未初始化,在您修复该字段之前,您的程序将被破坏。不,我理解。但我只是设置为空,我仍然得到