创建具有三个节点的链接列表

时间:2016-04-30 10:05:51

标签: c linked-list

#include<stdio.h>
#include<stdlib.h>

struct node
{
    int data;
    struct node *next;
};

int main()
{
    struct node* head = NULL;
    struct node* second = NULL;
    struct node* third = NULL;

    head = (struct node*)malloc(sizeof(struct node));
    second = (struct node*)malloc(sizeof(struct node));
    third = (struct node*)malloc(sizeof(struct node));

    head->data = 1; //assign data in first node
    head->next = second; // Link first node with the second node 

    second->data = 2; //assign data to second node
    second->next = third;  

    third->data = 3; //assign data to third node
    third->next = NULL;

    return 0;
}

我是指针的新手,我发现这个代码用于在书中创建链接列表。我不明白为什么主函数中的前三行代码是必要的。为什么我们要求指向节点的指针是空指针? 任何帮助都会受到赞赏,因为这个概念对我来说似乎很难。

2 个答案:

答案 0 :(得分:4)

根本没有理由对它们进行初始化。我认为这是一种反模式。在过时的ANSI C(1999年C99问世时已弃用)中,最好不要初始化它们:

struct node* head;
struct node* second;
struct node* third;

head = malloc(sizeof(struct node));
second = malloc(sizeof(struct node));
third = malloc(sizeof(struct node));

如果您忘记malloc second的{​​{1}}内存,编译器可以生成诊断信息:

struct node* head;
struct node* second;
/* ... */
head = malloc(sizeof(struct node));
/* ... */
do_something(head, second);
将使用-Wall编译的

导致gcc抱怨:

% gcc -Wall test.c
test.c: In function ‘main’:
test.c:11:5: warning: ‘second’ is used uninitialized in this function [-Wuninitialized]
     do_something(head, second);
     ^

但是,您是否已将second初始化为NULL

struct node* head = NULL;
struct node* second = NULL;
// ...
head = malloc(sizeof(struct node));
// ...
do_something(head, second);

GCC会让您的错误无声地传递:

% gcc -Wall test.c
%

在现代C(也是过时的C99,或当前的C11; ANSI C又称C89已被弃用近20年)中,甚至不需要将它们与{{1行你可以写

malloc

这样做要好得多,因为变量会立即用适当的值初始化。

至于使用struct node* head = malloc(sizeof(struct node)); struct node* second = malloc(sizeof(struct node)); struct node* third = malloc(sizeof(struct node)); 初始化而不是未初始化的值 - 好吧,只有在使用指针值而不取消引用它时才重要。但取消引用NULL指针或取消引用具有未初始化值的指针都将导致未定义的行为。他们都不需要崩溃。

答案 1 :(得分:1)

你问为什么前三行是必要的,答案就是:“它们不是”。没有必要将它们全部设置为NULL,但是 do 需要声明它们。真的,你可以将第一部分浓缩为:

Var

将它们设置为NULL的主要原因(正如您的代码当前所做的那样)是为了保证不会调用“未定义的行为”。