【发布时间】:2018-05-21 00:42:11
【问题描述】:
我正在用 c 编写非常简单的函数来操作堆栈。一切正常,但我想知道如何创建一个 createstack() 函数,该函数将指针设置为创建一个空堆栈。以及如何在我的推送和弹出功能中使用此功能或结构。 这是我的代码:
typedef struct nodeRec
{
int item;
struct nodeRec* next;
} node;
typedef node* nodePtr;
nodePtr top;
int isempty(nodePtr mytop)
{
return mytop == NULL;
}
void push(int value1, nodePtr* mytop)
{
struct nodeRec *newNode;
newNode = (struct nodeRec*)malloc(sizeof(struct nodeRec));
newNode->item = value1;
if (isempty(mytop))
newNode->next = NULL;
else
newNode->next = mytop;
top = newNode;
printf("\nElement added!!!\n");
count++;
}
void pop(nodePtr* mytop)
{
if (isempty(mytop))
printf("\nStack is Empty!!!\n");
else {
struct nodeRec *temp = mytop;
printf("\nDeleted element: %d", temp->item);
top= temp->next;
free(temp);
count--;
}
}
【问题讨论】:
-
您的代码存在一些问题。例如,
nodePtr* mytop的类型为node**,但您将其视为node*。 -
这是一个很好的例子,说明为什么为指针设置类型别名是个坏主意。请不要这样做,它会招致像你这样的错误。此外,你的编译器应该已经告诉你所有这些问题,可能很清楚。
-
好的。我应该省略 nodePtr* mytop 并将 mytop 替换为 top。这工作得很好。但是我的编译器什么也没说,这些函数都起作用了
-
使用您使用的堆栈设计,您永远不需要
createStack函数。nodePtr stack = NULL; push(value, &stack);和pop(&stack);工作正常。另外,你做错的是newNode->next = mytop;(应该是*mytop)。同样,您需要在push和pop中使用isempty(*mytop)。 -
函数“工作”是因为您使用全局变量
top而不是局部变量mytop。我建议你停止使用全局变量,并做一些关于在 C 中模拟传递引用的研究。