我已经很久没有使用链表了,我不知道为什么这段代码会失败。我正在尝试创建一个非常简单的循环链表,其中包含正好 5 个节点。我永远不需要插入额外的节点或删除现有节点。
我收到一个'node' has no member named 'next'
错误。谁能告诉我我做错了什么?谢谢。
typedef struct {
char payload[1024];
int x;
node* next;
} node;
node* root_ptr;
node this_node;
root_ptr = malloc(sizeof(node *));
root_ptr = &this_node; //keep a pointer to the root
int i;
for (i=0; i<5; i++) {
node next_node;
this_node.next = &next_node;
this_node = next_node;
}
this_node.next = root_ptr;
在您的结构成员中,typedef
名称仍然未知。因此,应该为您的结构命名,然后您可以使用它声明一个标识符:
它将工作:
typedef struct node_t {
char payload[1024];
int x;
struct node_t* next;
} node;
首先,root_ptr = malloc(sizeof(node *));
是多余的。
第二个node next_node;
定义了一个局部变量,该变量在for
循环后将超出范围。您需要为next_node动态分配内存。
第三,你有 6 个节点,包括根,而不是 5 个。
试试这个:
int main(){
// create root and helper nodes
node * root_ptr;
node * this_node = (node *)malloc(sizeof(node));
this_node->x = 0;
root_ptr = this_node; //keep a pointer to the root
int i;
// create list
for (i=1; i<5; i++) {
node * next_node = malloc(sizeof(node));
next_node->x = i;
this_node->next = next_node;
this_node = next_node;
}
// complete cycle
this_node->next = root_ptr;
this_node = root_ptr;
// check
for (i=0; i<5; i++){
printf("%dn", this_node->x);
this_node=this_node->next;
}
return 0;
}
请注意,在链接列表中分配堆栈内存通常是一个坏主意