首先,我无法使用“代码示例”,因此我正在添加我的代码,如下所述:
Header.h
#ifndef MYHEADER_H
#define MYHEADER_H
#define EMPTY_TOS -1
#define MIN_STACK_SIZE 5
#define FALSE 0
#define TRUE 1
struct Node;
typedef struct Node *Stack;
void *PopStack(Stack);
void *TopOfStack(Stack);
void PushStack(void *val, Stack);
int IsEmptyStack(Stack);
int IsFullStack(Stack);
#endif
Header.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "myheader.h"
#define EMPTY_TOS -1
#define MIN_STACK_SIZE 5
#define FALSE 0
#define TRUE 1
struct Node
{
void *val;
struct Node *next;
};
void PushStack(void *x, Stack s)
{
printf("/n a1");
struct Node *insert;
printf("/n a2");
insert = (struct Node *) malloc(sizeof(struct Node));
printf("/n a3");
if (insert == NULL)
printf("Out of memory space!\n");
else
{ printf("\n a4");
insert->val = x;printf("\n a5");
insert->next= s;printf("\n a6");
s = insert;printf("\n a7");
}
printf("\n a8");
}
void *PopStack(Stack s)
{ printf("\n pop1");
struct Node *remove; printf("\n pop2");
void *val; printf("\n pop3");
if (IsEmptyStack(s))
{
printf("\nThe stack is empty!\n");
}
else
{ printf("\n pop4");
remove = s; printf("\n pop5");
val = remove->val; printf("\n pop67");
s = s->next; printf("\n pop7");
free(remove); printf("\n pop8");
}
return val; printf("\n pop9");
}
void *TopOfStack(Stack s)
{
if (!IsEmptyStack(s))
return s->next->val;
else
{
printf("\nThe stack is empty\n");
return 0;
}
}
int IsEmptyStack(Stack s)
{
printf("empty");
return (s == NULL);
}
int IsFullStack(Stack s)
{
return FALSE;
}
Project.cpp
int main()
{
Stack S = NULL;
int x = 5;
PushStack((void *)x, S);
int z = (int)PopStack(S);
printf("\n z = %d \n", z);
system("PAUSE");
return 0;
}
编辑:我想通过使用PushStack函数将X放入S(大头钉)。然后我想取存储在S中的值(5)并将其打印为Z,这是一个整数。但我看到像4247612这样的数字,只要编译器窗口没有关闭,它就不会改变。
答案 0 :(得分:2)
请注意,PushStack((void *)x, S); int z = (int)PopStack(S);
可能会导致截断,因此,不能保证这样的puncasting类型在所有情况下都能正常工作:void *
不是一个可以保存每个可能值的魔术类型宇宙。 (如果你开始在当代实现上使用double
而不是int
s,它会特别火上浇油。)但是它可能指向一个。
答案 1 :(得分:1)
问题在于您已将Stack
定义为struct Node *
,并且正在尝试在PushStack()
和PopStack()
函数中更新其值。在任一函数中为s
赋值时,它只更新局部变量,而不是主函数中的S
。相反,PushStack()
和PopStack()
可能需要指向堆栈对象(Stack *
),以便您也可以更新调用者的值。
答案 2 :(得分:0)
您的PushStack
和PopStack
例程没有按照您的意愿执行
在PopStack
函数中明确展示它:
void *PopStack(Stack s) { // <-- The s declared here is a LOCAL copy of the s your pass
struct Node *remove;
void *val;
if (IsEmptyStack(s)) {
printf("\nThe stack is empty!\n");
} else {
remove = s;
val = remove->val;
s = s->next; // <-- Changes the local copy, but the original is unchanged
free(remove);
}
return val;
}
因为main中的S
永远不会更新,所以它仍然是NULL。
您可以通过传递Stack *s
并在两个函数中使用*s
访问它来解决此问题。