【发布时间】:2019-05-26 14:27:13
【问题描述】:
对于我的一项学校作业,我必须制作自己的堆栈库和一个 POSTFIX 计算器。 计算器必须使用堆栈库并进行一些计算。
我将两个不同的数字压入我的堆栈。编号 6 和 3。标头应指向最近添加的节点 (LIFO)。所以当添加 6 时:
标题 -> 6 -> NULL
添加 3 时:
标题 -> 3 -> 6 -> NULL
当我在添加“6”后打印标题的值时,这很好。正在打印 6。 但是,当我在添加“3”之前打印标题的值时,它正在打印“3”。当它仍然应该打印 6。
所以总结一下我的问题: 在我的链表中添加另一个节点时,标题突然指向最新的节点,甚至还没有改变它。
通过一些代码和调试结果,您可能会更好地理解我。 顺便说一句:不要介意 typedef,我不喜欢它们。我的老师希望我们使用它。
typedef struct stackObject* pStackObject_t;
typedef struct stackObject
{
void* obj;
pStackObject_t next;
} StackObject_t;
typedef struct stackMEta* pStackMeta_t;
typedef struct stackMEta
{
pStackObject_t stack;
size_t objsize;
int numelem; //number of elements
int handle; //welke stack
pStackMeta_t next;
} StackMeta_t;
int mystack_push(int handle, void* obj)
{
**DELETED NON RELATED CODE BASED ON FEEDBACK**
if (currentMeta->handle == handle)
{
pStackObject_t newObject = malloc(sizeof(StackObject_t));
newObject->obj = obj;
printf("%s%d\n", "Wanting to push int to stack: ", *(int*)obj);
//First node
if (currentMeta->stack == NULL)
{
currentMeta->stack = newObject;
currentMeta->stack->next = NULL;
printf("%s%d\n", " FIRST Curentmeta->stack pointing to ", *(int*)currentMeta->stack->obj);
return 0;
}
else
{
printf("%s%d\n", "NOT FIRST Currentmeta->stack pointing to ", *(int*)currentMeta->stack->obj);
newObject->next = currentMeta->stack;
currentMeta->stack = newObject;
printf("%s%d\n", "Currentmeta->stack ", *(int*)currentMeta->stack->obj);
printf("%s%d\n", "Currentmeta->stack->next ", *(int*)currentMeta->stack->next->obj);
printf("%s%d\n", "Succesful pushed int to stack: ", *(int*)currentMeta->stack->obj);
return 0;
}
}
return -1;
}
终端:
Created stack with handle: 1 and objsize 4 bytes
Wanting to push int to stack: 6
FIRST Curentmeta->stack pointing to 6
Wanting to push int to stack: 3
NOT FIRST Currentmeta->stack pointing to 3
Currentmeta->stack 3
Currentmeta->stack->next 3
Succesful pushed int to stack: 3
我的单元测试在这段代码中表现良好。我的计算器没有,虽然它是同一个函数调用。
【问题讨论】:
-
请不要 typedef 指针。这只是信息隐藏......
-
@Aconcagua 这是我老师做的。他给了我们一些基本代码,并希望我们继续这样做。我也不喜欢它,但他不希望对他的代码进行任何更改。
-
此代码不是minimal reproducible example - 为了完整性,缺少堆栈对象和堆栈元的定义 - 后者与最小化无关,您可以删除 while 循环和 if(句柄)条件和只有一个堆栈。也许你也想看看How to Ask。
-
好的,但是您仍然可以选择不在您自己的代码中使用指针类型定义...
-
@Aconcagua 你在哪里看到我自己的代码中的 typedef?我正在使用我老师的 typedef。
标签: c pointers linked-list stack void-pointers