2013-06-19 176 views
0

我想了解链接列表的代码。我明白他们是如何工作的。 我在看一些代码做动态内存和链表,我在这里简单的:C - 链接列表

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

typedef struct node { 
    char *word; 
    struct node *next; 
} node; 

void display_word(node *start) { 
    node *start_node = start; 
    puts(""); 
    for(; start_node != NULL; start_node = start_node->next) { 
     printf("%s", start_node->word); 
    } 
} 

node* create_node(char *input) { 
    node *n = malloc(sizeof(node));; 
    n->word = strdup(input); 
    n->next = NULL; 
    return n; 
} 

int main() { 
    node *start_node = NULL; 
    node *n = NULL; 
    node *next_node = NULL; 
    char word_holder[20]; 
    for(; fgets(word_holder,80,stdin) != NULL; n = next_node) { 
     next_node = create_node(word_holder); 
     if(start_node == NULL) 
      start_node = next_node; 
    if(n != NULL) 
     n->next = next_node; 
    } 
    display_word(start); 
} 

所以程序创建用户输入每个字的链接列表,然后将其打印出来。 我不明白的是在main()函数中,每次将next_node分配给新节点以创建新节点,但start_node指向next_node,因此它会指向next_node每次创建的每个新节点?那么如何保持清单呢?我们每次都不应该失去旧节点吗?

有人可以解释一下。

+0

OFF TOPIC:你的名字是“miniJavaLearner”,你在C编码?呵呵 :) –

回答

2
  1. 当第一个节点被创建时,指向它的指针被保存在start中。

  2. 在创建后续节点,它们在端列表的加入,所以start仍然指向到所述第一节点,并通过它,该列表的其余部分。

步骤通过与调试程序的代码,或者出去铅笔和纸,画发生了什么事,你在你的大脑步,你会看到这一切又是如何放在一起。

1

我希望这可以回答你的问题 - 每次你更新“下一个”时,你都将它设置为另一个新节点。每个节点都有自己的“下一个”导向下一个节点,所以你不会因为这样做而失去任何东西。我没有真正测试你的代码,但是因为“开始”总是指向第一个节点,所以你不会丢失任何节点。如果您想了解更多关于它的工作方式,调试器应该会有所帮助!

2

创建第一个节点时,指向它的指针将保存在开始位置。

在循环的每次迭代之后,将“n”设置为刚刚创建的节点,因为for循环的最后一部分(; n = next)会在循环的每次迭代后执行。所以中间循环执行“n”将始终指向前一个节点。因此,语句n> next = next将前一个节点的“下一个”指针设置为新节点。

因此,在循环的第二次迭代中,n = start,并且start-> next设置为刚刚创建的节点的“next”。