0

这个代码片段究竟做了什么?

#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 个元素包含 i”

但我不明白...

4

6 回答 6

1

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

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

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

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

于 2012-10-23T12:10:09.193 回答
1

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

它看起来像这样:

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

它有帮助吗?

于 2012-10-23T12:10:32.973 回答
0

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

于 2012-10-23T12:10:41.243 回答
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 中通常没有专门的“列表”数据结构,只有节点的集合。您只需传递头节点并将其视为“列表”。

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

于 2012-10-23T12:13:23.047 回答
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的字段分配一个值。对于第一次通过循环,将是,因此将包含 5-0,即 5。对于第二次通过,是 1,因此对于第二次,将包含 5-1,即 4,依此类推.valListi0valiListval

l->next = l1;

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

 l1 = l;

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

乍看上去:

在循环的第一遍之后(i = 0) -

5->NULL

在第二遍(i = 1)之后,

4 -> 5 -> NULL

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

3 -> 4 -> 5 -> NULL

在第四个(i = 3)之后,

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

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

1 -> 2 -> 3 -> 4 -> 5 -> NULL
于 2012-10-23T12:14:25.923 回答
0

循环在内存中向后构建 List 对象的链表。当列表完成时,第一个元素实际上是“第 i 个”元素。它被创建,给定值'n'并以NULL终止。

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

下一个对象被有效地插入到列表的前面(l->next = l1)。

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

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

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

于 2012-10-23T12:15:39.870 回答