链接列表循环

时间:2012-10-23 12:02:34

标签: c list linked-list

这段代码片段的作用究竟是什么?

#include <stdio.h>
 List *makeList(int n) { 
    List *l, *l1 = NULL; 
    for (int i = 0; i < n; i++) {
        l = malloc(sizeof(List)); 
        l->val  = n-i;
        l->next = l1;
        l1 = l;
    }
    return l;
}

我的笔记说“给定数字n, 建立一个长度为n的列表 列表的第i个元素 包含我“

但我不明白......

6 个答案:

答案 0 :(得分:1)

这里很棘手的是列表是向后构建的,请注意每个元素的值设置为n - ii从0到n - 1计数。因此,第一个元素将获得值n,下一个元素将获得n - 1,依此类推。

这可能是为了保存变量(!);否则需要有另一个指针来记住第一个节点,以便有return的东西。

此外,它不会检查malloc()的返回值,这总是很可怕。

对于n = 0,它将返回一个未定义的值(l的值),这真的很可怕。

答案 1 :(得分:1)

它创建n个节点的链接列表并返回列表的头部。值为:1,2,3,...n (from head to tail)

看起来像这样:

1 -> 2 -> 3 -> ...... -> n -> (NULL)

有帮助吗?

答案 2 :(得分:0)

这是按相反顺序创建列表。换句话说,在开头的最后一个元素正在创建,其值是列表大小(n) - 0(i),它是列表元素编号。

答案 3 :(得分:0)

它做的是这样的;每个方框只有一个malloc

          n          n-1         n-2               1
          ^           ^           ^                ^
       +--|---+    +--|---+    +--|---+         +--|---+
       | val  |    | val  |    | val  |  ...    | val  |
NULL <-- next |  <-- next |  <-- next |       <-- next |
       +------+    +------+    +------+         +------+

                                                   ^^--- this is returned

数据结构struct List看起来像这样(或多或少):

struct List
{
    int val;
    struct List * next;
};

它的名称具有误导性,因为它应该是“ListNode”或类似的东西。 C中通常没有专用的“列表”数据结构,只是节点的集合。您只需传递头节点并将其视为“列表”。

(如果您希望存储列表大小以便在固定时间内访问它,或者如果您有一个双向链接列表并希望同时提供头部和尾部指针,则整个列表的专用持有者结构可能很有用。恒定的时间。)

答案 4 :(得分:0)

让我们跟踪您的代码。

List *l, *l1 = NULL;

定义了List类型的两个指针变量。

for (int i = 0; i < n; i++) {

你正在开始一个循环,它将遍历n次。这意味着,如果使用5调用此函数,则此循环将执行5次。

l = malloc(sizeof(List));

在内存中创建一个List值,并将该值的位置存储在l指针变量中。对于循环中的每次传递,在内存中创建不同的List值。

l->val  = n-i;

将值n-i分配给新创建的val值的List字段。对于第一次循环,i将为0,因此val将包含5 - 0,即5。对于第二次传递,i为1 ,对于第二个Listval将包含5 - 1,即4,依此类推。

l->next = l1;

next类型中有一个List字段,它是同一类型的指针。对于第一次传递,li包含NULL,因此它将指向null。对于第二次传递,l1将包含先前创建的List值,因此第二个List的{​​{1}}字段将指向该字段,依此类推。

next

存储新创建的创建元素的内存地址,以便在循环的下一次传递中使用。

一目了然:

第一次循环后(i = 0) -

 l1 = l;

第二遍(i = 1)后,

5->NULL

在第三个(i = 2)之后,

4 -> 5 -> NULL

在第四(i = 3)之后,

3 -> 4 -> 5 -> NULL

在第五个(和最后一个)(i = 4)之后,

2 -> 3 -> 4 -> 5 -> NULL

答案 5 :(得分:0)

循环在内存中向后构建List对象的链接列表。列表完成后,第一个元素实际上是'ith'元素。创建它,给定值'n'并以NULL结束。

  l->val = n
  l->next = NULL

下一个对象有效插入列表的前面(l-&gt; next = l1)。

  l->val = n-1 
  l->next ------------> l->val = n
                        l->next = NULL

依此类推,直到i = n-1。

最后(@ i = n-1),创建的最后一个对象的值为1,循环终止,并返回指向最后一个创建对象的指针。