gpt4 book ai didi

C栈推送函数

转载 作者:太空宇宙 更新时间:2023-11-03 23:21:35 24 4
gpt4 key购买 nike

我尝试在 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);
}
}

最佳答案

首先栈是一种满足后进先出(Last Input First Output)策略的数据组织方式。即在栈顶加入一条新数据,并从栈顶弹出。

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

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

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 

关于C栈推送函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37967503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com