0

単一リンクリストを使用して C でスタックを実装しようとしていますが、スタックが空でない限り、すべて正常に動作します。空になると、ポップメソッドは空であることを検出しませんが、ランダムな値を与えます。スタックが空であることを知る方法はありますか? これは、サンプルのメインプログラム出力とともに使用している pop メソッドです。

int main(int argc, char const *argv[])
{
    Node* top;
    push(&top,5);
    printf("Popped Element: %d\n",pop(&top));
    printf("Popped Element: %d\n",pop(&top));

    return 0;
}

int pop(Node** top)
{
    if(*top == NULL)
    {
        printf("Error: Stack is empty!\n");
        return;
    }
    int temp = (*top)->iData;
    *top = (*top)->next;
    return temp;
}

出力:

Popped Element: 5
Popped Element: 1707388

編集:プッシュのコードは次のとおりです

void push(Node** top ,int num)
{
    Node* temp = (Node* )malloc(sizeof(Node));
    temp->iData = num;
    temp->next = *top;
    *top = temp;
}
4

7 に答える 7

0

新しいノードを作成してリストに追加するときに、NULL の隣で初期化します。と使用

return -1;

それ以外の

return;

編集:

main like で *top =NULL を初期化する

   int main(int argc, char const *argv[])
{
    Node* top=NULL;
    push(&top,5);
    printf("Popped Element: %d\n",pop(&top));
    printf("Popped Element: %d\n",pop(&top));

    return 0;
}
于 2012-09-21T10:10:41.190 に答える
0

問題はノード宣言にあると思います.Node *を宣言する場合は、使用する前に割り当てる必要があります。たぶんこれをテストしてください(このコンピューターにはコンパイラがないので、自分でテストすることはできません)

    int main(int argc, char const *argv[])
{
    Node* top;
    top = malloc(sizeof(*top));
    push(&top,5);
    printf("Popped Element: %d\n",pop(&top));
    printf("Popped Element: %d\n",pop(&top));

    return 0;
}

int pop(Node** top)
{
    if(*top == NULL)
    {
        printf("Error: Stack is empty!\n");
        return;
    }
    int temp = (*top)->iData;
    *top = (*top)->next;
    return temp;
}

これで問題が解決することを願っています。

于 2012-09-21T10:02:30.943 に答える
0

スタックの使用法を記憶するグローバル変数または静的変数を定義します。スタックに何かをプッシュするたびに、カウンターの値を SizeOf(...) と pop の逆数で調整します。

于 2012-09-21T10:02:46.707 に答える
0

ノードの Ctor 内の NULL の次に初期化します。スタックが空の場合は値 (例では -1) を返します。

編集:

あなたがCtorを持っていない場合。(mallocを使用します)次に、スタックの最初のノードの次のフィールドをNULLに初期化する必要があります

于 2012-09-21T10:00:21.503 に答える
0

pop関数は整数を返す必要があります。したがって、このコードのスニペットは

if(*top == NULL)
    {
        printf("Error: Stack is empty!\n");
        return;
    }

修正する必要があります。

pop値を持つ整数へのポインターを取得しpop、その場合は関数が true を返します。

だからreturn読んでくださいreturn(-1);

また

int pop(Node** top, int *value)
{
    if(*top == NULL)
    {
        printf("Error: Stack is empty!\n");
        return 0;
    }
    *value = (*top)->iData;
    *top = (*top)->next;
    return 1;
}

編集

Node *top = NULL次のコードを変更した後push

void push(Node **top, int value)
{
    Node *newTop = malloc(sizeof(Node));
    newTop->next = *top;
    *top = newTop;
    newTop->iData = value;
}
于 2012-09-21T09:59:32.480 に答える
0

ノードの作成中、つまりpush()で、最初の(ヘッド)要素の次がNULLの場合。

あなたの場合、(*top)->nextNULLではありません。

それで

printf("Error: Stack is empty!\n");
return;

実行されません。

編集用:

void push(Node** top ,int num)
{

    Node* temp = (Node* )malloc(sizeof(Node));

     if(*top == NULL)
     {
         temp->next = NULL;
     }
     else
     {
         temp->next = *top;
     }
    temp->iData = num;    
    *top = temp;
}

更新されたコード

#include <stdlib.h>

typedef struct
{
int iData;
struct Node *next;
}Node;

int pop(Node** top)
{
    if(*top == NULL)
    {
        printf("Error: Stack is empty!\n");
        return 0;
    }

    Node *tmp = *top;
    int temp = tmp->iData;
    *top = tmp->next;
    free(tmp);
    return temp;
}

void push(Node** top ,int num)
{

    Node* temp = (Node* )malloc(sizeof(Node));

     if(*top == NULL)
     {
         temp->next = NULL;
     }
     else
     {
         temp->next = *top;
     }
    temp->iData = num;
    *top = temp;
}

int main(int argc, char const *argv[])
{
    Node* top;
    push(&top,5);
    printf("Popped Element: %d\n",pop(&top));
    printf("Popped Element: %d\n",pop(&top));

    return 0;
}

これは印刷されます

Popped Element: 5
Error: Stack is empty!
Popped Element: 0

2 つ目Popped Element: 0は、pop() を 2 回呼び出すためです。とにかくStack Emptyが検出されます。

于 2012-09-21T10:04:14.990 に答える
0

ノードが である場合、整数ではなくノードを返すだけでよくNULL、リストは空です。それ以外の場合は、ノード データを取得できます。

Node *pop (Node **top)
{
    Node *ret = NULL;

    if (*top != NULL)
    {
        ret = *top;
        *top = (*top)->next;
    }

    return ret;
}
于 2012-09-21T10:04:28.900 に答える