我正在使用 C 中的 struct 創建一個堆疊,我在 gcc 除錯器中運行它并注意到在提供 'ele' 的值后的 push() 函式中,arr[0] 設定為 'ele' 并且 'top' 變為0.
但是,一旦我退出 push(),arr[0] 就會再次回傳垃圾值,而 top 變為 -1。為什么會這樣。如何使 arr[0] 保持我提供的值并保持為 0。
#include <stdio.h>
#define MAX 10
typedef struct
{
int top;
int arr[MAX];
int ele;
} STACK;
void push(STACK st)
{
printf("Enter element ");
scanf("%d", &st.ele);
if (!isFull(st))
{
st.arr[ (st.top)] = st.ele;
}
else
{
printf("****Stack is full****\n");
}
}
int main()
{
STACK st;
st.top = -1;
int choice;
for (;;)
{
printf("Stack elements : \n");
printf("Enter choice \n");
printf("1.Push\n2.Pop\n3.Display\n4.Peek Top element\n");
scanf("%d", &choice);
switch (choice)
{
case 1:
push(st);
break;
}
}
return 0;
}
uj5u.com熱心網友回復:
對于初學者來說ele,這個結構定義中的資料成員是多余的
typedef struct
{
int top;
int arr[MAX];
int ele;
} STACK;
定義結構如
typedef struct
{
int top;
int arr[MAX];
} STACK;
函式 push 按值接受其引數
void push(STACK st)
這意味著該函式處理原始引數的副本。更改副本不會影響用作引數的原始物件。
您需要通過參考傳遞結構型別的原始物件。
在 C 中,通過參考傳遞意味著通過指向物件的指標間接傳遞物件。
此外,在該函式中,您首先需要在輸入新值之前檢查堆疊是否已滿。
所以函式應該通過以下方式宣告和定義
void push( STACK *st )
{
if (!isFull( st))
{
printf("Enter element ");
int ele;
if ( scanf("%d", &ele ) == 1 )
{
st->arr[ (st->top)] = ele;
}
else
{
puts( "****i/o error occured****" );
}
}
else
{
printf("****Stack is full****\n");
}
}
在你需要寫的函式中
st->arr[ (st->top)] = ele;
該函式被稱為
push( &st );
注意函式 isFull 依次宣告為
int isFull( const STACK *st );
uj5u.com熱心網友回復:
void push(STACK st)
需要是
void push(STACK *st)
發生的事情是您正在修改 st 的副本,而不是您傳遞給 push 的 st。
uj5u.com熱心網友回復:
該push()功能正在接收副本st并在該副本中進行更改。請注意,引數STACK st是本地的push(). 您對其值所做的任何更改在push().
傳入STACK結構體的地址push(),像這樣
push(&st);
在push()-
修改push()【引數型別應該是STACK指標】的原型:
void push(STACK * st)
其他變化push()將是:
void push(STACK * st) {
....
scanf("%d", &(st->ele));
....
....
st->arr[ (st->top)] = st->ele;
....
....
}
此外,您必須對isFull()從push(). 讓更改isFull()函式接收STACK指標型別引數是個好主意。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/393257.html
下一篇:無法理解C中的字串宣告
