我正在完成最后一个项目,因此我被介绍给链表,我必须使用它。
试图理解代码的工作原理后,我感到非常沮丧。对我而言,这个概念完全有意义。我给出的示例代码却没有。
typedef struct node_s {
char name[20];
int age;
struct node_s *listp;
} node;
while (!feof(inp)) {
temp = (node *)malloc(sizeof(node)); // creation of memory
fscanf(inp, "%s%d", temp->name, &temp->age);
if (head == NULL)
head = temp; // setting the head of the list
else {
tail->listp = temp; // else connecting to previous element
}
tail = temp; // updating the current element
tail->listp = NULL; // setting pointer to null.
}
当每次将其设置为NULL时,tail-> listp如何指向第二个元素我都很困惑。为了进一步说明我的困惑,在else语句中tail-> listp将指向新元素,这是可以理解的。
但是最后,我们将tail-> listp指向NULL,而忽略了else语句。但是代码运行正常,在这里,我感到非常困惑。
答案 0 :(得分:2)
您丢失了之前的声明
project-root/.cache
在循环中,创建一个新元素tail = temp; // updating the current element
,并将其链接到列表上。如果是第一个元素,则从本质上来说,可以通过将列表设置为头和尾来启动列表。如果不是第一个元素,则将其链接到列表的末尾。
temp
然后,您设置tail->listp = temp;
以将指针更新到列表末尾,并确保列表末尾的元素指向空
tail=temp
您也可以
tail->listp = NULL;
如果我的眼睛不让我失望,那将是等效的。