c - 指针和堆栈实现的问题

标签 c pointers stack

我正在尝试创建一个在 C 中实现堆栈的程序。

目前,我的堆栈显示为空。

我认为这是因为我传递了堆栈而不是指向堆栈的指针。

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

typedef struct node
{
    int info;
    struct node * ptr;
}node;

//create
//push
//pop
//destroy
//display
void push(int, node * top_node);
void pop(node * top_node);
void destroy(node * top_node);
void display(node * top_node);
int main(int argc, char** argv) 
{
    node * top_node = NULL;

    push(1, top_node);
    push(5, top_node);
    push(55, top_node);
    display(top_node);
    pop(top_node);
    display(top_node);
    pop(top_node);
    display(top_node);
    pop(top_node);
    display(top_node);
    push(1, top_node);
    display(top_node);
    destroy(top_node);
    return (EXIT_SUCCESS);
}

void display(node * top_node)
{
    node * temp = top_node;
    if(top_node == NULL)
    {
        printf("The stack is empty\n");
        return;
    }
    while(temp != NULL)
    {
        printf("%d\n ", temp-> info);
        temp = top_node -> ptr;
    }
}

void push(int data, node * top_node)
{
    if(top_node == NULL)
    {
        top_node = (struct node **) malloc(1*sizeof(struct node));
        top_node ->ptr = NULL;
        top_node -> info = data;         
    }
    else
    {
        node * temp = (struct node *) malloc(1*sizeof(struct node));
        temp -> ptr = top_node;
        temp -> info = data;
        top_node = &temp;
    }  
}

void pop(node * top_node)
{
    node * new_top = top_node;
    if(new_top == NULL)
    {
        printf("\nERROR, the stack is empty");
        return;
    }
    else
    {
        new_top = new_top -> ptr;
        printf("popped value = %d", top_node -> info);
        free(top_node);
        top_node = new_top;
    }
}

void destroy(node * top_node)
{
    node * temp = top_node;
    while(temp != NULL)
    {
        temp = top_node -> ptr;
        free(top_node);
        top_node = temp;
        temp = temp->ptr;   
    }
    free(temp);
}

我得到的输出是这样的:

The stack is empty
ERROR, the stack is emptyThe stack is empty
ERROR, the stack is emptyThe stack is empty
ERROR, the stack is emptyThe stack is empty
The stack is empty

RUN SUCCESSFUL (total time: 227ms)

我相信我应该传递一个指向堆栈的指针,我尝试实现它,但它抛出了一堆错误。

如果没有给我完整的答案,我将不胜感激。

最佳答案

除了这个问题之外,关于按值调用top_node,由iharobCherubim Anand识别>,还有其他问题:

  • 所有必须修改 top_node 的函数都必须使用 node ** 获取传入的地址,display 除外,因为它只读取 top_node,无需修改它。
  • 对此类修改函数的调用必须传入 top_node 的地址,使用 & 运算符,如 pop(&top_node); ,而不是像 display(top_node); 这样的 display 函数那样传递其值。
  • 在此类函数中使用 top_node 必须使用 * 运算符(如 *top_node)进行一级解引用,但 中除外显示,其中仅传递值。
  • display 函数中,temp = top_node -> ptr; 行始终将 temp 设置为导致循环迭代的第二个元素永远。它应该是 temp = temp->ptr;
  • push 中的
  • (struct node **) malloc(1*sizeof(struct node)); 不正确,应更改为 (struct node* )malloc(sizeof(结构节点));.任何数字乘以 1 保持不变。
  • destroy 函数中的最后两条语句是错误的,必须删除以保留正确的功能。

修改后的代码如下:

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

typedef struct node
{
    int info;
    struct node *ptr;
}node;

//create
//push
//pop
//destroy
//display
void push(int, node ** top_node);
void pop(node ** top_node);
void destroy(node ** top_node);
void display(node * top_node);
int main(int argc, char** argv) 
{
    node *top_node = NULL;

    push(1, &top_node);
    push(5, &top_node);
    push(55, &top_node);
    display(top_node);
    pop(&top_node);
    display(top_node);
    pop(&top_node);
    display(top_node);
    pop(&top_node);
    display(top_node);
    push(1, &top_node);
    display(top_node);
    destroy(&top_node);
    return (EXIT_SUCCESS);
}

void display(node * top_node)
{
    node * temp = top_node;
    if(top_node == NULL)
    {
        printf("The stack is empty\n");
        return;
    }
    while(temp != NULL)
    {
        printf("%d\n", temp->info);
        temp = temp->ptr;
    }
}

void push(int data, node ** top_node)
{
    if(top_node == NULL)
    {
        *top_node =  (struct node*)malloc(sizeof(struct node));
        (*top_node)->ptr = NULL;
        (*top_node)-> info = data;
    }
    else
    {
        node * temp = (struct node*)malloc(sizeof(struct node));
        temp -> ptr = *top_node;
        temp -> info = data;
        *top_node = temp;
    }
}

void pop(node ** top_node)
{
    node * new_top = *top_node;
    if(new_top == NULL)
    {
        printf("ERROR, the stack is empty\n");
        return;
    }
    else
    {
        new_top = new_top -> ptr;
        printf("Popped value = %d\n", (*top_node)-> info);
        free(*top_node);
        *top_node = new_top;
    }
}

void destroy(node ** top_node)
{
    node * temp = *top_node;
    while(temp != NULL)
    {
        temp = (*top_node)-> ptr;
        free(*top_node);
        *top_node = temp;
    }
}

关于c - 指针和堆栈实现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37626146/

相关文章:

c++ - 在 Linux 中获取当前进程创建时间

无法在mac上执行C代码(最初在DevC++中执行)

java - C++/C/Java : Anagrams - from original string to target;

c++ - 需要大尺寸静态数组

Python堆栈重叠元素累加

创建文件系统,需要 C 的建议

c - 在c中使用atof时出现奇怪的错误

c++ - 删除指针时出现段错误

c++ - 我可以获取数组的最后一个元素的地址吗?

c - 在 C 中重新分配无效指针