[英]linked list not printing correctly?
struct stack_struct
{
int number;
struct stack_struct *next_number;
};
stack_struct *mainStruct;
class stack_class
{
private:
struct stack_struct *head;
public:
stack_class();
//~stack_class();
void pushNumber(int number);
void popANumber();
void findNumber();
void clearStack();
void sizeFinder();
void printStack();
};
stack_struct *pointerFunc,*pointerFunc2,*pointerFunc3,*printPointer;
stack_class::stack_class()
{
head=NULL;
}
void stack_class::pushNumber(int numberFunc)
{
if(head==NULL)
{
head = new stack_struct;
head->number = numberFunc;
head->next_number = NULL;
pointerFunc2=head;
}
else
{
pointerFunc = new stack_struct;
pointerFunc->number=numberFunc;
pointerFunc->next_number=NULL;
head->next_number=pointerFunc;
head=pointerFunc;
}
}
void stack_class::printStack()
{
while(pointerFunc2)
{
cout<<pointerFunc2->number<<endl;
pointerFunc2=pointerFunc2->next_number;
}
}
int optionChosen;
int main()
{
stack_class mainClassStack;
do
{
cin>>optionChosen;
switch(optionChosen)
{
case 1:
{
int pushInt;
cout<<"\n\nEnter Number: ";
cin >> pushInt;
mainClassStack.pushNumber(pushInt);
break;
}
case 2:
{
break;
}
case 3:
{
break;
}
case 4:
{
break;
}
case 5:
{
break;
}
case 6://print
{
mainClassStack.printStack();
break;
}
default:
{
break;
}
}
}while(optionChosen!=7);
return 0;
我正在嘗試使用動態內存(鏈接列表)實現數據列表的堆棧類型。 但是,當我嘗試打印列表時,它只打印一次列表,如果我嘗試使用選項6重新打印,則列表消失了。 我翻閱了兩次代碼,但無法找出問題所在。 有什么建議么?
代碼的問題在於,在打印堆棧后,您不會將pointerFunc2
重置為head
。
可以將其正確重置,也可以在打印功能中使用局部變量。
這是您的函數的更正版本:
void stack_class::printStack()
{
while (pointerFunc2)
{
cout << pointerFunc2->number << endl;
pointerFunc2 = pointerFunc2->next_number;
}
// reset pointerFunc2 so the next iteration
// can start at the head and print again.
pointerFunc2 = head;
}
問題是當您第一次使用此打印堆棧時
pointerFunc2 = pointerFunc2-> next_number;
該pointerFunc2成為第一次迭代后的最后一個元素。 這就是為什么您認為它已經消失了。 打印后,應將pointerFunc2重置為指向頭節點。 因此,請先保存它,然后在遍歷整個列表之后將其還原,以便下次打印堆棧時,將從頭節點開始。
第二次打印不起作用的原因是您使用的是全局變量而不是局部變量:
stack_struct *pointerFunc2;
當在函數或類之外聲明變量時,該變量將成為全局變量。 全局變量在函數調用后仍然存在,並保留最后設置給它們的值。 為了成為局部變量,需要在 printStack
聲明一個變量,將其初始化為堆棧的頭部,然后在退出函數時將其丟棄。 關於pointerFunc
也是如此。
printPointer
和pointerFunc3
變量未使用,可以從源代碼中刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.