C语言栈的数据结构

C语言栈的数据结构,c,data-structures,stack,C,Data Structures,Stack,我是一个新的结构,并试图实现一个堆栈连同操纵推动数据在堆栈和打印他们。然而,我遇到了一些问题,你能帮我解决吗 我使用了tutorialpoints提供的编译器,其中代码已成功编译,但输出包含一个分段错误,我假设该错误存在于“PushNode”或“PrintStackData”中 当我输出堆栈中的节点数时(使用计数器),这个数比正确的多一个,比如说我输入了5个数据,但它输出了6个 多谢各位 #include <stdio.h> #include <string.h> #in

我是一个新的结构,并试图实现一个堆栈连同操纵推动数据在堆栈和打印他们。然而,我遇到了一些问题,你能帮我解决吗

我使用了tutorialpoints提供的编译器,其中代码已成功编译,但输出包含一个分段错误,我假设该错误存在于“PushNode”或“PrintStackData”中

当我输出堆栈中的节点数时(使用计数器),这个数比正确的多一个,比如说我输入了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();

}
#包括
#包括
#包括
//定义数据节点
类型定义结构节点{
int data;//堆栈中数据节点的数据
struct Node*Next;//指向下一个数据节点的指针或null
}节点;
//定义堆栈的头节点
typedef结构堆栈头{
整数计数器;
节点*顶部;
}堆垛头;
//函数创建空白堆栈
void CreateStack(STACKHEAD*Head){
Head=(STACKHEAD*)malloc(sizeof(STACKHEAD));
头部->计数器=0;
Head->Top=NULL;
};
//函数在堆栈中推送数据节点
空推节点(堆头*堆头){
NODE*pNew=(NODE*)malloc(sizeof(NODE));//必须分配内存对其进行初始化,否则会出现分段错误。
printf(“输入新数据节点的值:”);
scanf(“%d”,&(pNew->data));//将输入分配给新节点的数据
if(Head->Top==NULL){
pNew->Next=NULL;
}
否则{
pNew->Next=头部->顶部;
}
头部->顶部=pNew;
头部->计数器++;
};
//函数打印出堆栈中的每个数据节点
无效打印堆栈数据(堆栈头*堆栈头){
堆头*位置=(堆头*)malloc(堆头大小);
//位置->顶部=头部->顶部;
位置=头部;
printf(“堆栈中的数据为:”);
while(位置->顶部!=NULL){
printf(“%d”,位置->顶部->数据);
位置->顶部=位置->顶部->下一步;
}
}
int main()
{
int numOfData;//用户要插入堆栈的数据数
STACKHEAD*Head;//声明并初始化新的堆栈头
CreateStack(Head);//初始化堆栈
printf(“您希望向堆栈插入多少数据?”);
scanf(“%d”和numOfData);
用于(INTI=0;iTop->data);
PrintStackData(Head);//使用函数打印堆栈中的每个数据节点。
printf(“\n堆栈中的数据数为:%d\t”,Head->Counter);
printf(“\n顶部节点的数据值为%d\t”,Head->top->data);
getchar();
}

调用CreateStack时,指针按值传递。函数中调用malloc返回的指针永远不会分配给STACKHEAD


尝试编写一个CreateStack函数,返回指向所创建堆栈的指针。它不应该接受任何参数。

搜索并阅读有关在c中模拟按引用传递的内容。或者如何从函数返回值。“请调试我的代码”问题是离题的/不允许的。您从未初始化过
Head
。在
CreateStack
函数中分配给
Head
不会修改调用方的变量。
CreateStack
应该返回分配的结构,而不是将其作为参数。顺便说一句,
PrintStackData
函数包含内存泄漏。还有一个非常糟糕的逻辑错误,您重写了堆栈(并导致更多内存泄漏)。谢谢Chris,我会尝试一下。还要感谢大家,你们让我进步了:)