所以我有函数top()返回堆栈的顶部(实现为链表)。它返回一个Node结构。当我尝试访问返回的struct的变量时,我收到错误。
typedef struct nodeStrcut{
int x,y;
struct nodeStrcut* next;
}Node;
Node top(Node** head){
return **head;
}
void push(Node** head, int x, int y){
//create a new node to contain the value
Node* newPtr = (Node*) malloc(sizeof(Node));
newPtr->x = x;
newPtr->y = y;
newPtr->next = *head;
*head = newPtr;
}
int main(int argc, char **argv){
Node* stack;
stack = NULL;
push(&stack, 3, 3);
push(&stack, 2, 3);
push(&stack, 3, 5);
printf("Node value: %d, %d\n", (pop(&stack)).x, (pop(&stack)).y);
return -1;
}
然后我收到以下错误:
project.c: In function ‘main’:
error: request for member ‘x’ in something not a structure or union
error: request for member ‘y’ in something not a structure or union
我知道我可以使用stack-> x来获取值,但我需要一个从堆栈的停止处返回值的函数。帮助将不胜感激。
答案 0 :(得分:1)
我认为这只是一个拼写错误(pop
而不是top
),这样您实际上调用的库函数不会返回Node
类型。写printf("Node value: %d, %d\n", top(&stack).x, top(&stack).y);
,它应该按预期工作。
答案 1 :(得分:1)
Node* newPtr = (Node*) malloc(sizeof(Node));
没有必要强制转换malloc
,这是不必要的。见:Do I cast the result of malloc?。以下就足够了:
Node *newPtr = malloc (sizeof *newPtr);
head
的{{1}}地址未在top
中更改,因此无需传递head
的地址,例如
Node top (Node *head){
return *head;
}
您不应该从main()
返回否定值。有两个定义的回报:
EXIT_SUCCESS: 0
EXIT_FAILURE: 1
See What should main() return in C and C++?
完全放弃:
#include <stdio.h>
#include <stdlib.h>
typedef struct nodeStrcut{
int x,y;
struct nodeStrcut* next;
} Node;
Node top (Node *head){
return *head;
}
void push (Node **head, int x, int y) {
Node *newPtr = malloc (sizeof *newPtr);
newPtr->x = x;
newPtr->y = y;
newPtr->next = *head;
*head = newPtr;
}
int main (void) {
Node *stack = NULL;
push (&stack, 3, 3);
push (&stack, 2, 3);
push (&stack, 3, 5);
printf ("Node value: %d, %d\n", (top (stack)).x, (top (stack)).y);
return 0;
}
示例使用/输出
$ ./bin/stacktop
Node value: 3, 5
答案 2 :(得分:0)
您无需传入指向top()
中指针的指针。将函数定义从Node top(Node** head)
更改为Node top(Node* head)
就足够了。
现在,在调用以下内容时,您不需要传递stack
的地址(没有拼写错误):
printf("Node value: %d, %d\n", (top(stack)).x, (top(stack)).y);