我认为我的创作有问题。
void add(N *p) {
N *current, *start;
current = malloc(sizeof(p));
scanf("%d", ¤t->data);
current->next = NULL;
if (p == NULL) {
p = current;
start = current;
} else {
start->next = current;
start = current;
}
}
我认为我的display()
是正确的。
void display(N *p) {
N *current;
current = p;
while (current != NULL) {
printf("\n%d", current->data);
current = current->next;
}
}
答案 0 :(得分:1)
您的malloc(sizeof(p))
仅为指针返回足够的空间。你想要malloc(sizeof(N))
。
此外,您需要返回p
的新值,而不是在add()
结束时将其丢弃。 (您的start
有类似的问题;请选择一个作为链接列表的头部。)
答案 1 :(得分:0)
有问题:
函数add()
未分配正确的内存量。使用此方法:
current = malloc(sizeof(*current));
将新分配的对象插入列表的方式不起作用:修改p
,这是一个具有局部范围的参数,并设置start
也具有本地范围范围。 N
指针没有副作用是调用者范围。
您的display
函数是正确的,但我赞成在输出结尾而不是在开头添加换行符。
以下是具有更好API的更新版本:
int add(N **headp) {
N *current = calloc(sizeof(*current));
if (current == NULL) {
fprintf(stderr, "cannot allocate memory for new object\n");
return -1;
}
if (scanf("%d", ¤t->data) != 1) {
fprintf(stderr, "cannot read value for new object\n");
return -2;
}
current->next = *headp;
*headp = current;
return 0;
}
void display(const N *list) {
for (const N *p = list; p != NULL; p = p->next) {
printf("%d\n", p->data);
}
}
add
函数以这种方式从调用者使用:
#include <stdio.h>
#include <stdlib.h>
typedef struct N {
int data;
struct N *next;
} N;
int main(void) {
N *list = NULL;
for (i = 0; i < 10; i++) {
if (add(&list))
break;
}
display(list);
return 0;
}