你能指出这个 noob C 代码中尝试创建链表的错误吗
Can you point out mistakes in this noob C code for an attempt to create a linked list
这是我第一次尝试创建链表。代码肯定不合适,但我想做的只是能够创建一个列表并用一个节点初始化它。下面的代码在语法上是正确的,但它不起作用。可以指出错误。
#include <stdio.h>
#define SIZE 5
struct node
{ int item;
struct node *link;
};
struct linkedlist
{
struct node *head;
int count;
};
void init(struct linkedlist *p , int key)
{
struct node *newnode;
newnode = (struct node*)malloc(sizeof(struct node));
newnode->link = NULL;
newnode->item = key;
p->head = newnode;
p->count = 1;
}
void main()
{ struct linkedlist *s;
init(s , 2);
printf("%d", s->count);
}
您必须分配一个结构并将其指针分配给 s
,然后才能使用函数 init
取消引用它。
此外,您应该在托管环境中使用标准 int main(void)
而不是 void main()
,这在 C89 中是非法的,在 C99 或更高版本中是实现定义的,除非您有特殊原因使用非标准签名。
另一个注意事项是 malloc()
家族的铸造结果是 considered as a bad practice。
int main(void)
{ struct linkedlist *s = malloc(sizeof(*s)); /* allocate the structure */
if (s == NULL) return 1; /* check if allocation succeeded */
init(s , 2);
printf("%d", s->count);
}
免责声明:我没有释放 s
因为它只分配一次并且执行很快结束。该节点也未被释放。现代 OS 不需要在程序结束时释放。 (c - What REALLY happens when you don't free after malloc? - Stack Overflow)您可能想要添加释放以满足像 Valgrind 这样的内存检查器。
在调用init函数之前的main函数中你需要为s指针分配内存。因此解决方案是在调用 init() 函数:
之前添加以下行
s = (struct linkedlist*)malloc(sizeof(struct linkedlist));
而且它应该可以正常工作,没有错误。
学习愉快!
此程序中存在重大概念错误。如果你想传递一个未初始化的指针作为参数,那么至少将它初始化为 NULL。传递空指针没有任何意义。只是在上面的代码中声明一个指向 struct linkedlist 的指针并不能真正让你得到它的一个对象,除非你静态或动态地创建一个。指针用于存储有效的内存地址,仅声明指向 int 数据类型的指针并不会真正为您创建数据类型为 int 的变量。我希望最后三个陈述已经清楚地表明你的错误是什么。不过,我已经解决了你的问题,代码如下:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
struct node
{
int item;
struct node *link;
};
struct linkedlist
{
struct node *head;
int count;
};
void init(struct linkedlist *p , int key)
{
struct node *newnode;
newnode = (struct node*)malloc(sizeof(struct node));
newnode->link = NULL;
newnode->item = key;
p->head = newnode;
p->count = 1;
}
void main()
{
struct linkedlist *s = (struct linkedlist*)malloc(sizeof(struct
linkedlist));
init(s , 2);
printf("%d", s->count);
}
这是我第一次尝试创建链表。代码肯定不合适,但我想做的只是能够创建一个列表并用一个节点初始化它。下面的代码在语法上是正确的,但它不起作用。可以指出错误。
#include <stdio.h>
#define SIZE 5
struct node
{ int item;
struct node *link;
};
struct linkedlist
{
struct node *head;
int count;
};
void init(struct linkedlist *p , int key)
{
struct node *newnode;
newnode = (struct node*)malloc(sizeof(struct node));
newnode->link = NULL;
newnode->item = key;
p->head = newnode;
p->count = 1;
}
void main()
{ struct linkedlist *s;
init(s , 2);
printf("%d", s->count);
}
您必须分配一个结构并将其指针分配给 s
,然后才能使用函数 init
取消引用它。
此外,您应该在托管环境中使用标准 int main(void)
而不是 void main()
,这在 C89 中是非法的,在 C99 或更高版本中是实现定义的,除非您有特殊原因使用非标准签名。
另一个注意事项是 malloc()
家族的铸造结果是 considered as a bad practice。
int main(void)
{ struct linkedlist *s = malloc(sizeof(*s)); /* allocate the structure */
if (s == NULL) return 1; /* check if allocation succeeded */
init(s , 2);
printf("%d", s->count);
}
免责声明:我没有释放 s
因为它只分配一次并且执行很快结束。该节点也未被释放。现代 OS 不需要在程序结束时释放。 (c - What REALLY happens when you don't free after malloc? - Stack Overflow)您可能想要添加释放以满足像 Valgrind 这样的内存检查器。
在调用init函数之前的main函数中你需要为s指针分配内存。因此解决方案是在调用 init() 函数:
之前添加以下行s = (struct linkedlist*)malloc(sizeof(struct linkedlist));
而且它应该可以正常工作,没有错误。 学习愉快!
此程序中存在重大概念错误。如果你想传递一个未初始化的指针作为参数,那么至少将它初始化为 NULL。传递空指针没有任何意义。只是在上面的代码中声明一个指向 struct linkedlist 的指针并不能真正让你得到它的一个对象,除非你静态或动态地创建一个。指针用于存储有效的内存地址,仅声明指向 int 数据类型的指针并不会真正为您创建数据类型为 int 的变量。我希望最后三个陈述已经清楚地表明你的错误是什么。不过,我已经解决了你的问题,代码如下:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
struct node
{
int item;
struct node *link;
};
struct linkedlist
{
struct node *head;
int count;
};
void init(struct linkedlist *p , int key)
{
struct node *newnode;
newnode = (struct node*)malloc(sizeof(struct node));
newnode->link = NULL;
newnode->item = key;
p->head = newnode;
p->count = 1;
}
void main()
{
struct linkedlist *s = (struct linkedlist*)malloc(sizeof(struct
linkedlist));
init(s , 2);
printf("%d", s->count);
}