我正在编写一个锻炼程序,被告知要编写一个与链表一起使用的堆栈处理程序。这是代码:
#include <stdio.h>
#include <stdlib.h>
struct stackNode {
char data;
struct stackNode *nextPtr;
};
typedef struct stackNode StackNode;
typedef struct stackNode *StackNodePtr;
void push(StackNodePtr *topPtr, char value)
{
StackNodePtr firstNode = *topPtr;
while (1) {
if (*topPtr == NULL) {
*topPtr = (StackNodePtr) malloc(sizeof(StackNode));
if (*topPtr == NULL) {
puts("Error: Out of memory for push.");
return;
}
(*topPtr)->nextPtr = NULL;
(*topPtr)->data = value;
break;
}
*topPtr = (*topPtr)->nextPtr;
}
*topPtr = firstNode;
}
int main()
{
StackNodePtr stack = NULL;
push(&stack, 'c'); // Program terminates in this function
putchar(stack->data);
return 0;
}
我没有声明并实现pop函数,因为我没有问题。问题出在推送功能上。我希望程序将'c'字符压入堆栈,然后打印它,但是它终止了。您可以更正我的代码吗?
最佳答案
您的推送不必要地循环,并且不必要地尝试说明您真的不应该在意一种方式(无论*topPtr
是否为null)的情况:
void push(StackNode **topPtr, char value)
{
StackNode *p = malloc(sizeof *p);
if (p != NULL)
{
p->data = value;
p->next = *topPtr;
*topPtr = p;
}
else
{
perror("Failed to push value on stack");
}
}
而已。您的原始代码看起来像您在尝试实现一个队列,而不是堆栈。不同的野兽。堆栈实际上更容易,因为它不需要在插入之前就跳入序列的另一端。