假设该列表仅包含一个元素。在这种情况下,这个循环
while(current->next!=NULL)
{
c++;
s.push(current->data);
current=current->next;
}
将永远不会执行,因此堆栈将为空。此外,当列表依次为空且因此head
等于NULL并且您可能无法访问current->next
数据成员时,该函数最初具有未定义的行为。
现在我们假设该列表恰好包含两个元素。循环将只执行一次,变量c
的值为2.变量mid
的计算值将等于1。
所以该环路
for(int i=0;i<mid;i++)
{
cout<<current->data<<"\t";
current=current->next;
}
只执行一次迭代和第一元件被输出。
然而下一循环
for(int i=mid;i>1;i--)
{
std::cout<<s.top()<<"\t";
s.pop();
}
意愿;因为它的条件i > 1
得到false
,因为mid等于1.
所以程序有两个错误循环,应该被重写。
下面是一个演示程序,显示如何实现该功能。
#include <iostream>
#include <stack>
struct node
{
int data;
node *next;
} *head = nullptr;
void append(int data)
{
node **current = &head;
while (*current) current = &(*current)->next;
*current = new node { data, nullptr };
}
void clear()
{
while (head)
{
node *tmp = head;
head = head->next;
delete tmp;
}
}
void reverse()
{
std::stack<int> s;
for (node *current = head; current; current = current->next)
{
s.push(current->data);
}
std::stack<int>::size_type middle = (s.size() + 1)/2;
std::stack<int>::size_type i = 0;
for (node *current = head; i < middle; i++)
{
std::cout << current->data << '\t';
current = current->next;
}
for (i = s.size() - i; i != 0; i--)
{
std::cout << s.top() << '\t';
s.pop();
}
std::cout << std::endl;
}
int main()
{
const int N = 10;
for (int i = 0; i < N; i++)
{
for (int j = 0; j <= i; j++) append(j);
reverse();
clear();
std::cout << std::endl;
}
return 0;
}
程序输出是这里
0
0 1
0 1 2
0 1 3 2
0 1 2 4 3
0 1 2 5 4 3
0 1 2 3 6 5 4
0 1 2 3 7 6 5 4
0 1 2 3 4 8 7 6 5
0 1 2 3 4 9 8 7 6 5
偏题:'cout < data <<“\ t”;'建议使用namespace std;正在发挥作用。注意你不会意外地调用'std :: reverse'。 –
user4581301
关于主题:看起来像一个问题,可以通过使用调试软件逐步完成功能轻松识别。调试器几乎肯定会随您的开发环境一起提供,并且学习如何使用它是符合您的最佳利益的。 – user4581301