C编程中的简单链接列表结构

ana*_*arm 2 c linked-list

这是我在C中的第一个链接列表程序,我试图初始化节点的值并尝试打印它.但是,它没有给我预期的输出.谁能让我知道我哪里错了?

#include<stdio.h>
#include<stdlib.h>
struct node
{
    int key;
    struct node *next;
};

typedef struct node NODE;

int main ()
{
    NODE a,b,c;
    NODE *list;
    list=&a;
    list->key = 10;
    list->next = &b;
    list->next->key=20;
    list->next->next=&c;
    list->next->next->key=30;
    list->next->next->next=NULL;
    printf("%d  %d  %d", a,b,c);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

它打印10和20之间有一些垃圾.

unw*_*ind 5

你真的不应该把整个结构(变量a,bc)传递给printf()那样的,那甚至可以编译吗?

您想传递整数数据:

printf("%d %d %d\n", a.key, b.key, c.key);
Run Code Online (Sandbox Code Playgroud)

但当然这完全忽略了节点之间的联系.

在这种情况下,它会更像"有趣",例如:

static void print_list(const NODE *head)
{
  const NODE *prev = NULL;

  for(; head != NULL; prev = head, head = head->next)
    printf("%d ", head->key);
  puts(prev != NULL ? "\n" : "");
}
Run Code Online (Sandbox Code Playgroud)

然后main()在设置之后调用它list:

print_list(list);  /* or print_list(&a); */
Run Code Online (Sandbox Code Playgroud)

您还可以简化链接列表的创建:

a.key = 10;
a.next = &b;
b.key = 20;
b.next = &c;
c.key = 30;
c.next = NULL;
list = &a;
Run Code Online (Sandbox Code Playgroud)

这更明显地使用了所有节点都可直接使用的事实,并且放弃了歇斯底里的链接跟踪.