2016-08-22 18 views
-7

私は構造に新しく、スタックにデータをプッシュしてそれらを印刷する操作をスタックに実装しようとしています。しかし、私はいくつかの問題に遭遇しました。Cのスタックのデータ構造

コードが正しくコンパイルされたtutorialpointsが提供するコンパイラを使用しましたが、出力に「PushNode」または「PrintStackData」に存在すると想定されるセグメンテーションエラーが含まれています。

、いつI出力(カウンタを使用して)スタック内のノードの数、数が正しいものより1であるが、I入力5つのデータを言うが、それは6

はどうもありがとうございまし出力します!

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 



//Define data node 
typedef struct Node{ 
    int data; //Data of data node in Stack 
    struct Node *Next; // Pointer pointing to next data node or null 
}NODE; 

//Define head node for stack 
typedef struct StackHead{ 
    int Counter; 
    NODE *Top; 
}STACKHEAD; 

// function to create a blank stack 
void CreateStack(STACKHEAD *Head){  
    Head= (STACKHEAD*)malloc(sizeof(STACKHEAD)); 
    Head->Counter=0; 
    Head->Top = NULL; 
}; 

//Function to push a data node in stack 
void PushNode(STACKHEAD *Head){ 

    NODE *pNew=(NODE*)malloc(sizeof(NODE)); //Must allocate memory to initialise it otherwise segmentation error. 
    printf("Enter value for new data Node: "); 
    scanf("%d",&(pNew->data)); //Assign input to data of new node 

    if(Head->Top==NULL){ 
     pNew->Next=NULL; 
    } 
    else{ 
     pNew->Next=Head->Top; 
    } 
    Head->Top=pNew; 
    Head->Counter++; 
}; 

//Function to print out each data node in the Stack 
void PrintStackData(STACKHEAD *Head){ 

    STACKHEAD *Position=(STACKHEAD*)malloc(sizeof(STACKHEAD)); 

    //Position->Top=Head->Top; 
    Position = Head; 

    printf("The data in the Stack is: "); 
    while(Position->Top!=NULL){ 
     printf("%d, ",Position->Top->data); 
     Position->Top= Position->Top->Next; 
    } 
} 

int main() 
{ 
    int numOfData; // Number of data that users want to insert into the stack 
    STACKHEAD *Head; //Declare and initialise a new Stack Head 
    CreateStack(Head); // Initialise the Stack 

    printf("How many data do you want to insert to the Stack?"); 
    scanf("%d", &numOfData); 

    for(int i=0;i<numOfData;i++){ 
     PushNode(Head); 
    } 
    printf("The data value of the top Node is %d\n", Head->Top->data); 

    PrintStackData(Head); //print out each data node in Stack using function. 

    printf("\nThe number of data in the Stack is: %d\t", Head->Counter); 

    printf("\nThe data value of the top Node is %d\t", Head->Top->data); 
    getchar(); 

} 
+1

c *の*を参照してパスをエミュレートすることを検索して読んでください。または関数から値を返す方法。 –

+2

"私のコードをデバッグしてください"という質問はトピック外です/許可されていません。 –

+0

'Head'は初期化されていません。 'CreateStack'関数内の' Head'に代入しても、呼び出し元の変数は変更されません。 – Barmar

答えて

1

CreateStackを呼び出すと、ポインタは値渡しされます。関数内のmallocの呼び出しによって返されるポインタは決してSTACKHEADに割り当てられません。

作成されるスタックへのポインタを返すCreateStack関数を記述してください。それは引数を取るべきではありません。

+0

クリス、ありがとう、私はそれを試してみます。そして皆さんにも感謝しています、皆さんは私を改善してくれます:) –