C堆栈推送功能

时间:2016-06-22 12:04:05

标签: c pointers stack

我尝试在C中实现堆栈但是我得到一个非常奇怪的错误。由于某种原因,我的推送功能不起作用..

typedef struct node
{
    int v;
    struct node* next;
}Node;

void push(Node *stack,int val)
{
    Node *p = (Node *)calloc(1,sizeof(Node));
    p->v = val;
    Node *aux = stack;
    if(aux == NULL)
    {
        stack = p;
        return;
    }
    while(aux->next != NULL)
        aux = aux->next;
    aux->next = p;
}

我用NULL

初始化我的堆栈
Node *stack = NULL;

我把这个函数叫做这样的

push(stack,value)

L.E。 我尝试使用参数双指针创建一个pop函数,但结果与push相同。

void pop(Node **l)
{
    if((*l) == NULL)
        return;
    else
    {

        Node *aux,*prev;
        prev = *l;
        aux = prev->next;
        if(aux == NULL)
        {
            free(prev->v);
            free(prev);
            return;
        }
        while(aux != NULL)
        {
            prev = aux;
            aux = aux->next;
        }
        prev->next = NULL;
        free(aux->v);
        free(aux);
    }
}

4 个答案:

答案 0 :(得分:1)

你的push函数需要一个指向堆栈节点的指针。

void push(Node **stack, int val) {
  ...
  *stack = p;
  ....
}

push(&stack, value);

答案 1 :(得分:1)

首先,堆栈是满足策略LIFO(上一个输入优先输出)的数据组织。这是一个新的数据添加在堆栈的顶部,并从堆栈的顶部弹出。

您不应添加循环来查找要添加新数据的堆栈尾部。

你需要通过引用传递堆栈的顶部。考虑到函数参数是它的局部变量。因此在你的功能

void push(Node *stack,int val);

您正在更改退出函数后将被销毁的函数的局部变量stack。原始论点不会改变。

内存分配也可能失败您应该以某种方式报告错误。

这是一个演示程序,显示如何实现pushpop函数

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

typedef struct node
{
    int v;
    struct node *next;
} Node;

int push( Node **stack, int val )
{
    Node *p = malloc( sizeof( Node ) );
    int success = p != NULL;

    if ( success )
    {
        p->v = val;
        p->next = *stack;
        *stack = p;
    }

    return success;
}

int pop( Node **stack, int *val )
{
    int success = *stack != NULL;

    if ( success )
    {
        Node *p = *stack;
        *stack = ( *stack )->next;
        *val = p->v;
        free( p );
    }       

    return success;
}

int main(void) 
{
    const int N = 10;
    Node *stack = NULL;

    int i = 0;
    int val;

    while ( i < N && push( &stack, i ) ) i++;

    while ( i != 0 && pop( &stack, &val ) ) printf( "%d ", val );

    printf( "\n" );

    return 0;
}

它的输出是

9 8 7 6 5 4 3 2 1 0 

答案 2 :(得分:0)

您需要通过引用传递堆栈:

void push(Node **stack,int val)
{
    Node *p = (Node *)calloc(1,sizeof(Node));
    p->v = val;
    Node *aux = *stack;
    if(aux == NULL)
    {
        *stack = p;
        return;
    }
    while(aux->next != NULL)
        aux = aux->next;
    aux->next = p;
}

Andcall as push(&amp; stack,value)

答案 3 :(得分:0)

请记住将下一个字段初始化为NULL(p-&gt; next)

由于stack是一个传递给push函数的指针,因此函数中指针值的变化不会反映在函数之外。

即:如果在push函数中,我们设置stack = something,函数外部的堆栈指针不会被设置为。

绕过它的方法是将堆栈作为指针传递给指针,然后你可以修改指针值)

void push(Node **stack,int val)
{
  Node *p = (Node *)calloc(1,sizeof(Node));
  p->v = val;
  p->next = NULL;
  Node *aux = *stack;
  if(aux == NULL)
  {
      *stack = p;
      return;
  }
  while(aux->next != NULL)
    aux = aux->next;
  aux->next = p;
}

通过以下方式致电:

push(&stack, 10);

也许初学者更容易理解,从推送功能返回堆栈值。

Node * push(Node *stack,int val)
{
  Node *p = (Node *)calloc(1,sizeof(Node));
  p->v = val;
  p->next = NULL;
  Node *aux = stack;
  if(aux == NULL)
  {
    stack = p;
    return stack;
  }
  while(aux->next != NULL)
    aux = aux->next;
  aux->next = p;

  return stack;
}

致电:

stack = push(stack, 10);