如何显示我在链表中​​创建的数据?

时间:2017-02-12 17:43:49

标签: c

我认为我的创作有问题。

void add(N *p) {
    N *current, *start;
    current = malloc(sizeof(p));
    scanf("%d", &current->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;
    }
}

2 个答案:

答案 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", &current->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;
}