c++ - Visual Studio 2017 代码在某行后未输出
问题描述
我正在编写一个程序,它需要 8 个用户输入的整数并从中创建一个链表。我让程序打印链接列表,然后删除最后一个节点并反向打印列表。在此过程中,我一直在测试程序以确保每个部分都能正常工作,并且一直到打印出原始链接列表的地步。
当我写完修改的代码然后打印部分时,我遇到了一个问题——打印出原始列表后程序不会输出任何东西。例如,如果我输入 1,2,3,4,5,6,7,8,它将输出:1 2 3 4 5 6 7 8 就是这样。我试过把 cout << "testing"; 在不同的点查看我的代码停止输出的位置以及它成功输出的最新点就在 while 循环之前。
我不确定为什么 while 循环会导致程序直接停止输出任何内容,甚至是与 while 循环本身无关的任意 cout 语句,所以我想我会在这里问。如果有帮助,我正在使用 Visual Studio 2017。感谢您的任何帮助!
#include <iostream>
using namespace std;
void getdata(int & info); //function that assigns a user inputted value to each node
const int nil = 0;
class node_type // declaration of class
{
public:
int info;
node_type *next;
};
int main()
{
node_type *first, *p, *q, *r, *newnode;
first = new node_type;
newnode = new node_type;
int info;
getdata(info); //first node
(*first).info = info;
(*first).next = nil;
getdata(info); //second node
(*newnode).info = info;
(*first).next = newnode;
(*newnode).next = nil;
p = newnode;
for (int i = 2; i < 8; i++) //nodes 3-8
{
newnode = new node_type;
getdata(info);
(*newnode).info = info;
(*p).next = newnode;
p = newnode;
(*newnode).next = nil;
}
q = first;
while (q != nil) // printing linked list
{
cout << (*q).info << "\n";
q = (*q).next;
}
//deletes last node then reverses list
p = first;
q = (*p).next;
r = (*q).next;
if (first == nil) //if list is empty
cout << "Empty list";
else if ((*first).next == nil) //if list has one node
first = nil;
else if (r == nil) //if list has two nodes
q = nil;
else //general case
{
(*first).next = nil; //last line where when i put a cout << ""; it prints in the output window
while ((*r).next != nil)
{
(*q).next = p;
(*r).next = q;
p = q;
q = r;
r = (*r).next;
}
(*q).next = p;
first = q;
}
q = first;
while (q != nil) // printing newly modified list.
{
cout << (*q).info << "\n";
q = (*q).next;
}
return 0;
}
void getdata(int & info)
{
cout << "Enter number: \n";
cin >> info;
}
解决方案
else //general case
{
(*first).next = nil; //last line where when i put a cout << ""; it prints in the output window
while ((*r).next != nil)
{
(*q).next = p;
(*r).next = q;
p = q;
q = r;
r = (*r).next;
}
(*q).next = p;
first = q;
}
反转列表时会陷入无限循环。这就是它不输出任何内容的原因。
将元素 2 链接到元素 3 后,在下一步中将元素 3 链接到元素 2。
在反转列表时迭代列表时会导致无限循环。
在一般情况下扭转它的正确方法是这样的:
else //general case
{
node_type* current = first;
node_type* next = first->next;
(*first).next = nil; //last line where when i put a cout << ""; it prints in the output window
while (next)
{
node_type* temp = next->next;
next->next = current;
current = next;
next = temp;
}
first = current;
}
在旁注中,您应该使用bla->foo
to 取消引用,而不是(*bla).foo
.
推荐阅读
- android - 谷歌地图如何在自定义地点显示我的位置标记?
- sql - 在事务期间在 HSQLDB 中进行查询
- javascript - for循环完成后如何在Javascript中调用函数?
- sql - 从 SQL Server 中的重复表恢复表
- visual-studio-code - 在 VS Code 中选择刚刚粘贴的文本
- javascript - 在使用 node-fetch 解析为 JSON 之前替换原始数据中的字符
- python - 底部的矩形被删除而不是最上面的
- css - 使用带有拉丁子集和特殊字符的 Google 字体
- email - Multiple mx records for one domain so some users use g suite and others use roundcube from server
- security - 如果系统在线,如何防止 JWTToken 在同一个网络中暴露?