这段代码片段的作用究竟是什么?
#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个元素 包含我“
但我不明白......
答案 0 :(得分:1)
这里很棘手的是列表是向后构建的,请注意每个元素的值设置为n - i
,i
从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 ,对于第二个List
,val
将包含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,循环终止,并返回指向最后一个创建对象的指针。