我尝试在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);
}
}
答案 0 :(得分:1)
你的push函数需要一个指向堆栈节点的指针。
void push(Node **stack, int val) {
...
*stack = p;
....
}
push(&stack, value);
答案 1 :(得分:1)
首先,堆栈是满足策略LIFO(上一个输入优先输出)的数据组织。这是一个新的数据添加在堆栈的顶部,并从堆栈的顶部弹出。
您不应添加循环来查找要添加新数据的堆栈尾部。
你需要通过引用传递堆栈的顶部。考虑到函数参数是它的局部变量。因此在你的功能
void push(Node *stack,int val);
您正在更改退出函数后将被销毁的函数的局部变量stack
。原始论点不会改变。
内存分配也可能失败您应该以某种方式报告错误。
这是一个演示程序,显示如何实现push
和pop
函数
#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);