C 指针、结构和指针。。。创建堆栈时
因此,我想创建一个堆栈,如下所示:C 指针、结构和指针。。。创建堆栈时,c,pointers,struct,stack,C,Pointers,Struct,Stack,因此,我想创建一个堆栈,如下所示: #include <stdio.h> #include <stdlib.h> typedef struct Node{ int data; struct node *link; }node; typedef struct Stack{ struct Node *topnode; int count; }stack; void push(int data, stack
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct node *link;
}node;
typedef struct Stack{
struct Node *topnode;
int count;
}stack;
void push(int data, stack *ourstack){
node newnode;
newnode.data = data;
ourstack.topnode = &newnode;
}
int main()
{
stack mystack;
push(1,mystack);
printf("%d",(mystack.(*topnode).data));
}
#包括
#包括
类型定义结构节点{
int数据;
结构节点*链接;
}节点;
typedef结构堆栈{
结构节点*topnode;
整数计数;
}堆叠;
无效推送(int数据,堆栈*ourstack){
节点newnode;
newnode.data=数据;
ourstack.topnode=&newnode;
}
int main()
{
堆叠mystack;
推(1,mystack);
printf(“%d”,(mystack.(*topnode.data));
}
但我确实会出错。我在这里有点困惑。在
push()
函数中,在最后一行中,我尝试了各种正确实现方法,但每次都失败了。现在,我的想法是,ourstack
是指向结构堆栈的指针。而topnode
也是堆栈结构中指向另一个节点结构的指针。那么,(*ourstack)。(*topnode)=newnode
或ourstack.topnode=&newnode
是否应该工作?为什么? 方法中的变量,仅存在于堆栈中,退出方法后将不可用。由于您希望在调用push
后保留它,因此需要分配一个节点,该节点具有类似malloc
的函数,该函数将数据保存在堆中。在你不再需要它之后,你必须释放它 方法中的变量,仅存在于堆栈中,退出方法后将不可用。由于您希望在调用push
后保留它,因此需要分配一个节点,该节点具有类似malloc
的函数,该函数将数据保存在堆中。在你不再需要它之后,你必须释放它 两者都不起作用,因为newnode
位于堆栈上,并且一旦代码退出push
,它将不再存在。您需要动态地分配它
void push(int data, stack *ourstack){
node *newnode;
newnode = malloc(sizeof(*newnode));
newnode->next = ourstack->topnode; // Point the next of the new node to the top node of the stack
newnode->data = data;
ourstack->topnode = newnode;
}
此外,您还需要在main
中正确初始化mystack
,否则您将面临未定义行为的风险,因为topnode
可能是NULL
或它可能具有随机值
stack mystack;
mystack.topnode = NULL;
mystack.count = 0;
这两种方法都不起作用,因为newnode
位于堆栈上,并且一旦代码退出push
,它将不再存在。您需要动态地分配它
void push(int data, stack *ourstack){
node *newnode;
newnode = malloc(sizeof(*newnode));
newnode->next = ourstack->topnode; // Point the next of the new node to the top node of the stack
newnode->data = data;
ourstack->topnode = newnode;
}
此外,您还需要在main
中正确初始化mystack
,否则您将面临未定义行为的风险,因为topnode
可能是NULL
或它可能具有随机值
stack mystack;
mystack.topnode = NULL;
mystack.count = 0;
你的程序中有很多错误
ourstack
是结构
类型的指针
变量,当使用ourstack访问数据时,使用->
运算符而不是点
运算符
替换
ourstack.topnode = &newnode;
与
- 推送函数
定义
和函数调用中存在冲突,您只需传递mystack
并使用struct指针
变量进行捕获。传递mystack
的地址
,您的函数调用应该是
push(1,&mystack);
newnode
是在push
函数中声明的局部变量,无论您使用newnode
尝试什么,它都将仅反映在此函数中,而不是在此函数之外。因此,为newnode
动态分配内存并执行操作
void push(int data, stack *ourstack){
node *newnode;
newnode = malloc(sizeof(stack));
newnode->data = data;
ourstack->topnode = newnode;
}
编译成功后,使用gdb调试代码并进行分析。程序中存在大量错误
ourstack
是结构
类型的指针
变量,当使用ourstack访问数据时,使用->
运算符而不是点
运算符
替换
ourstack.topnode = &newnode;
与
- 推送函数
定义
和函数调用中存在冲突,您只需传递mystack
并使用struct指针
变量进行捕获。传递mystack
的地址
,您的函数调用应该是
push(1,&mystack);
newnode
是在push
函数中声明的局部变量,无论您使用newnode
尝试什么,它都将仅反映在此函数中,而不是在此函数之外。因此,为newnode
动态分配内存并执行操作
void push(int data, stack *ourstack){
node *newnode;
newnode = malloc(sizeof(stack));
newnode->data = data;
ourstack->topnode = newnode;
}
编译后,使用gdb
成功调试代码并进行分析。“我确实有错误”-什么错误?在ourstack.topnode=&newnode
@JohnZwinck结构节点->结构节点中请求成员“topnode”
,ourstack.topnode
->ourstack->topnode
,push(1,mystack)代码>->推送(1,&mystack)代码>,(mystack.(*topnode).data)
->mystack.topnode->data
和其他一些问题。提示:打开C教科书,阅读有关动态内存分配和指针的章节。“我确实会出错”-什么错误?在ourstack.topnode=&newnode
@JohnZwinckstruct Node
->struct Node
,ourstack.topnode
>ourstack->topnode
,push(1,mystack)中请求非结构或联合中的成员“topnode”代码>->推送(1,&mystack)代码>,(mystack.(*topnode).data)
->mystack.topnode->data
和其他一些问题。提示:打开你的C教科书,阅读有关动态内存分配和指针的章节。我明白了,应该是推送(1,mystack)
?否-mystack
声明为stack
,push
需要一个stack*
-指向stack
的指针,因此需要调用它push(1,&mystack)
和打印值使用mystack.topnode->data
对结构使用
,对指向结构的指针使用->
。在这样的情况下,您不需要使用*
或&
,因为它会使代码无法读取。虽然它不是结构节点
,但它是结构节点