2017-05-08 18 views
-2
struct stack 
{ 
    int value; 
    struct stos *w; 

}; 

struct stack *pnt; 
struct stack *prev; 

void push(value); 
void delete(struct stack *new); 
void print_stack(); 
void push(int x) 
{ 
    prev = pnt; 
    pnt = (struct stack*)malloc(sizeof(struct stack)); 
    pnt->value=x; 
    pnt->w = prev; 
    printf("Top of stack: %d\n", pnt->value); 
} 

void delete(struct stack *new) 
{ 
    if (new!=NULL) 
    { 
     prev = new->w; 
     printf("Deleted: %d\n", new->value); 
     free(new); 
     pnt = prev; 
    } 
    else printf("Stack is empty\n"); 
} 

void print_stack() 
{ 
    printf("Content of stack:\n"); 
    prev = pnt; 
    while (prev!=NULL) 
    { 
     printf("%d\n", prev->value); 
     prev = prev->w; 
    } 
} 

私はそこにポインタについての質問があります。すべてのポインタが意味するものではなく(たぶんスタックトップを意味する)、 'prev'と 'pnt'が意味するものです。 私はまったくそれを得ていない。 'Prev'はおそらくスタックの以前の値ですか? 誰かが私に絵を見せてくれるかもしれません。宣言されたようCでスタックする方法、

+0

Googleを使用する方がよいでしょう。 – Aditya

+1

'struct stos' ?? –

+0

@Weather Vane私の悪い、編集 –

答えて

1

PNTは、それはあなたが他のコードからこの宣言が欠落している

struct stack 
{ 
    int value; 
    struct stos *w; // struct stos should struct stack 

}; 

によって宣言打たスタックを指し、

struct stack *pnt; 
struct stack *prev; 

ポインタです。

問題2つの構造体:

typedef struct stos{ 

    int value; 
    struct stos *next; 

} stos; 

だから、これは

は私たちが

まずSTOSの混乱を修正し始めましょう...問題、問題をたくさん持っているコードを上昇させます同じタイプの構造体へのポインタを含むstruct stackの代わりに、未定義の構造体を探しています(struct stos *next;struct stack* next;

これで、スタックがスタック構造の個別にリンクされたリストとして保持されることがわかりました。それは、変数の名前としてキーワードnewを使用しているため

のはvoid push(int x)

void push(int x) 
{ 
    // point prev to pnt, previous to top of stack 
    prev = pnt; 

    // create a new item to place on the top of the stack 
    pnt = (struct stack*)malloc(sizeof(struct stack)); 

    // initial the value member of the new item with x 
    pnt->value=x; 

    // point the new item's link point to point the previous top of the stack 
    pnt->w = prev; 

    // print the value contained in the new top of the stack item. 
    printf("Top of stack: %d\n", pnt->value); 
} 

を解読してみましょう。この関数では、災害です。はい、newはC++にあります。しかし、なぜ次の人のために物事の混乱を作る。次のように

void delete(struct stos *new) 
{ 
    if (new!=NULL) 
    { 
     prev = new->w; 
     printf("Deleted: %d\n", new->value); 
     free(new); 
     pnt = prev; 
    } 
    else printf("Stack is empty\n"); 
} 

は、Stack *pntStack* pntが言う "スタックを指すポインタと呼ばれるPNT" 対 "PNTと呼ばれるAスタックポインタ" を使用して...

// forward declaration of Stos because it won't be defined until the end of struct it is used in. 

typedef struct { 

    int value; 
    struct Stack* next; 

} Stack; 


Stack* pnt; // pnt = pointer top of stack 
Stack* prev; // prev = pointer to the previous stack item 

を書かれている必要があります。 (これらの宣言を読むのに渦巻きのテクニックがあります。Q.E.D)

void delete(Stack* pNew) 
{ 
    if (pNew) 
    { 
     prev = pNew->w; 
     printf("Deleted: %d\n", pNew->value); 
     free(pNew); 
     pnt = prev; 
    } 
    else printf("Stack is empty\n"); 
} 

私が言ったように、これは混乱です。 重要なことは、質問をして、次のコードに役立ついくつかのことを覚えていることです。

  1. 一度typedefを作成して使用します。

  2. 十分な長さ、将来の読者はStack* pTopOfStack;

  3. は、デリバティブのキーワードである単語を使用しないようにしよう、コードを理解するように変数の名前を作るstruct stackものをドロップnew

  4. ないオーバーを実行します。群集冗長コードとコードif (new)

if (new != NULL)、より良いですif (pNewStackItem)

正しく見える、コンパイルされて実行されるより多くのもので複雑になるのではなく、コードが何をしているのかを完全に理解することをお勧めします。プログラマーを信頼してはいけません。「申し訳ありませんが、私のマシン上で動作します。

+0

'Stack * next'はスタックに入れている次のアイテムのポインタです。 –

+0

@Vanderdecken構造体スタックと構造体スタックは2種類あります。さらに、struct Stackは不完全な型です。 –

+0

@VladfromMoscowええ、コンパイラはmiにいくつかのエラーを与えました...そこで、問題はどこにあるのですか?私は今、 "unknown type name Stack"を持っているからです。私は 'typedef struct Stackを試しました。 typedef struct { \t int値; \t Stack * next; }スタック; Stack * first; Stack * last; ' –

関連する問題