指针和堆栈实现的麻烦

时间:2016-06-04 03:48:29

标签: 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);
}

我得到的输出是:

  

堆栈是空的   错误,堆栈是空的。堆栈是空的   错误,堆栈是空的。堆栈是空的   错误,堆栈是空的。堆栈是空的   堆栈是空的   
  RUN SUCCESSFUL(总时间:227ms)

我相信我应该将指针传递给堆栈,我尝试实现它但是却发现了一堆错误。

在没有给出完整答案的情况下朝着这个方向迈出的任何一步都将不胜感激。

2 个答案:

答案 0 :(得分:1)

top_node中分配给push()无效,因为该指针是在本地声明的,并且只存在于push()函数本身的堆栈帧中。相反,您可以将指针传递给main()函数中声明的指针,如此

void 
push(int data, node **top_node)
{
    if (*top_node == NULL)
    {
        *top_node = malloc(sizeof(**top_node));
        if (*top_node == NULL)
            return; // maybe warn about the error or abort the whole program
        (*top_node)->ptr = NULL;
        (*top_node)->info = data;
    }    
    else
    // append the node       
}

否则,分配的空间将永远丢失,从而导致内存泄漏,因为当函数返回时,持有它的加法器的指针将被销毁。

答案 1 :(得分:1)

除了 iharob Cherubim Anand 所识别的按价值调用top_node之外,还有还有其他问题:

  • 所有必须修改top_node的函数必须使用node **display之外的地址传递其地址,因为它只需读取top_node而无需修改它。
  • 对此类修改函数的调用必须使用top_node &运算符传递pop(&top_node);的地址,而不是像{{display那样传递其值。 1}}功能类似于display(top_node);
  • 此类函数中top_node的使用必须使用*运算符(*top_node除去display之外的display运算符进行一级解除引用,其中temp = top_node -> ptr;只传递值。
  • temp函数中,行temp = temp->ptr;将始终将(struct node **) malloc(1*sizeof(struct node));设置为第二个元素,从而导致循环永远迭代。它应该是push
  • (struct node*)malloc(sizeof(struct node));中的
  • 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; } } 都保持不变。
  • clusters: test: tag_cl: tag0 mtest: tag_cl: tag1, tag12 ctest3: tag_cl: tag2, tag22 函数中的最后两个语句是错误的,必须删除才能保留正确的功能。

以下是修改后的代码:

tag_cl