假設該列表僅包含一個元素。在這種情況下,這個循環
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