2017-11-25 7 views
-1

私は現在、ユーザーが入力した値をプッシュしてポップする単純なスタックメニュープログラムを作成しようとしています。 (また、スタックを印刷してください)スタックは値をCに格納しません

これはこれまでのコードです。値を挿入しようとすると(ケース1)、それはうまくいくと思いますが、スタック(ケース3)を印刷しようとすると、「スタックが空です」というメッセージが表示されます。スタックをポップしようとすると(ケース2)、クラッシュするだけです。

私の構造がオフであるか、私のポインタが正しくないかどうか分かりません。

ご協力いただきありがとうございます。私はこの乱雑なコードを非常に残念に思っています。私はまだ非常に新しいです!

#include<stdio.h> 
#include<stdlib.h> 
#define EMPTY 0 

struct node 
{ 
    int data; 
    struct node *link; 
}; 
typedef struct node Stack; 

Stack* get_node() 
{ 
    Stack *tmp; 
    tmp = (Stack*) malloc(sizeof(Stack)); 
    tmp->link = EMPTY; 
    return tmp; 
} 

void push(Stack **top, int data) 
{ 
    Stack *tmp; 
    tmp = *top; 

    *top = get_node(); 

    (*top)->data = data; 
    (*top)->link = tmp; 
} 

void pop(Stack **top) 
{ 
    Stack *tmp; 
    int num; 
    if (top == EMPTY) 
    { 
     printf("Stack is Empty!"); 
    } 
    else 
    { 
     tmp = *top; 
     printf("%d", tmp->data); 
     *top = tmp->link; 
     free(tmp); 
    } 
} 

void stack(Stack *top) 
{ 
    if (top == EMPTY) 
    { 
     printf("Stack is Empty..."); 
    } 
    else 
    { 
     Stack *tmp = top; 
     while (tmp->link != EMPTY) 
     { 
      printf("%d", tmp->data); 
      tmp = tmp->link; 
     } 
    } 
} 

void menu(int choice) 
{ 
    Stack *top = EMPTY; 
    int data; 

    switch (choice) 
    { 
     case 1: 
      printf("Enter Data : "); 
      scanf_s("%d", &data); 
      push(&top, data); 
      break; 

     case 2: 
      pop(&top); 
      break; 

     case 3: 
      stack(top); 
      break; 

     case 4: 
      exit(1); 
    } 
} 

void main() 
{ 
    int choice; 

    printf("< < = M e n u = = >\n"); 
    printf("1.push\n"); 
    printf("2.pop\n"); 
    printf("3.print_all\n"); 
    printf("4.quit\n"); 
    printf("Select : "); 
    while (1) 
    { 
     scanf_s("%d", &choice); 
     menu(choice); 
    } 
} 
+2

"私のコードには何が問題なのですか":これはあなたの質問を表現するための非常に悪い方法です。 –

+0

ああ申し訳ありませんが、私はこのサイトを初めて使用しています。いいタイトルを作る方法がわかりません。どうすればいいですか? – Kitty

+2

[mcve]に問題を絞り込む必要があります。それからあなたはどのタイトルに変更するのか分かります –

答えて

0

あなたはstaticとしてそれをすることはありませんならば、それはzeroで初期化するたびに取得するためstaticmenu()内の関数として作るtoppointerのようないくつかの小さな変更を行います。 stack()機能を

static Stack *top ; 

でこれ

Stack *top = EMPTY; 

を交換したり変更 、すべてのあなたのロジックが正しい残り

void stack(Stack *top) 
{ 
    if (top == EMPTY) 
    { 
     printf("Stack is Empty..."); 
    } 
    else 
    { 
     Stack *tmp = top; 
     while (tmp != EMPTY) // here you wrote as tmp->link 
     { 
      printf("%d \n ", tmp->data); 
      tmp = tmp->link; 
     } 
    } 
} 

として1つの以下の要素を印刷しています。私はそれが助けて欲しい

0

実際にスタックをどこにも保持していません。メニューにオプションを入力するたびに、関数は空のStackで始まります。挿入してからStackを印刷すると、毎回空のStackが表示されます。

void menu(int choice) 
{ 
    Stack *top = EMPTY; // Problem - Always empty Stack for each call 
    int data; 
    ... 
} 

は、この問題を解決するには、グローバル変数Stackを持っているか、使用するために、すべての機能にStackを渡すのいずれかが必要です。

関連する問題