我正在编写一个锻炼程序,被告知要编写一个与链表一起使用的堆栈处理程序。这是代码:

#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");
    }
}


而已。您的原始代码看起来像您在尝试实现一个队列,而不是堆栈。不同的野兽。堆栈实际上更容易,因为它不需要在插入之前就跳入序列的另一端。

10-08 08:20
查看更多