0

以下のセグメントを手伝ってください。n がスタックの一番上から削除され、スタックが空の場合、出力は「-1 popped」になるはずです (0 atm を取得しています)。

void pop(void) {
    struct node *temp;
    int n;
    if (top == NULL) {
        printf("%d popped\n", top);
        return;
    }
    n = top->item;
    temp = top;
    top = top->prev;
    free(temp);
    printf("%d popped\n", n);
    return;
}
4

3 に答える 3

1

論理エラーです。ゼロと比較していて、-1 の出力が必要です!!!

 if (top == NULL) {
         printf("%d popped\n", top);    
     return;  
   } 

する必要があります

  if (top == NULL) {
         printf("%d popped\n",-1);    
     return;  
   } 
于 2012-08-10T10:12:03.013 に答える
1

NULL はヌル ポインター (つまり、何もないポインター) であり、通常は値が 0 であるためです。

線を変えるだけ

printf("%d popped\n", top);

printf("-1 popped\n");
于 2012-08-10T10:12:08.307 に答える
0

これはあなたの意図によりよく合うと思います:

void pop(void) {
    int n;
    if (top == NULL) {
        // empty: magic sentinel value
        n = -1;
    } else {
        n = top->item;
        // not empty: update the stack
        struct node *temp = top;
        top = top->prev;
        free(temp);
    }
    printf("%d popped\n", n);
    return;
}

EdとAnonが正しく指摘しているように、明示的に印刷することで元のバグを修正できます-1。ただし、そもそもロジックの脆弱性を低くする(そして偶然にこの特定のバグを修正する)ことは、私にとって大きな勝利のように思えます。

于 2012-08-10T10:16:54.277 に答える