【发布时间】:2019-11-24 20:12:59
【问题描述】:
我正在编写一个练习程序,我被告知要编写一个与链表一起使用的堆栈处理程序。代码如下:
#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 函数,因为我对它没有任何问题。问题在于 push 函数。我希望程序将'c'字符压入堆栈然后打印它,但它终止了。你能更正我的代码吗?
【问题讨论】:
-
*topPtr = firstNode;你先*topPtr = malloc。然后你只需break并用初始值覆盖它。firstNode会发生什么? -
不需要特殊情况下的初始插入堆栈。分配一个新节点,将新节点的
next设置为当前栈顶(可能为null),设置节点的value成员,最后将栈设置为新节点。完毕。没有循环。不相关的,在 typedef 别名中隐藏指针类型既没有帮助也没有必要。只有两种情况真正具有优势(黑盒“处理”API 和回调函数规范),而这两种情况都不是。 C 程序员想要看到星号。相信我。 -
类型定义指针不是必需的,但我认为它可能会有所帮助。如果明确标识为指针(如 OP 在上面使用 'Ptr' 后缀所做的那样),它会避免显式双指针。我觉得这比星星的瘟疫更清晰、更干净:)