这段代码创建了一个动态链表,它也可以正确地分配和释放内存,但是有一小步我很困惑。它似乎没有将第一个结构指针start->next
设置为下一个,我认为应该如此。但是当我尝试运行它时,效果很好。然后我尝试添加start->next=next;
它也很有用。请帮我检查并告诉我原因。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct island {
char *name;
char *opens;
char *closes;
struct island *next;
} island;
island* create(char *name) {
island *i = malloc(sizeof(island));
i->name = strdup(name);
i->opens = "09:00";
i->closes = "17:00";
i->next = NULL;
return i;
}
void display(island *start) {
island *i = start;
for (; i != NULL; i = i->next) {
printf("Name: %s open: %s-%s\n", i->name, i->opens, i->closes);
}
}
void release(island *start) {
island *i = start;
island *next = NULL;
for (; i != NULL; i = next) {
next = i->next;
free(i->name);
free(i);
}
}
int main() {
island *start = NULL;
island *i = NULL;
island *next = NULL;
char name[80];
for (; fgets(name, 80, stdin) != NULL; i = next) {
next = create(name);
if (start == NULL)
start = next; //change this line to {start = next;start->next=next;} also works.
if (i != NULL)
i->next = next;
}
display(start);
release(start);
return 0;
}
我想要内心发生的事情,所以我画这个来帮助自己理解。
答案 0 :(得分:1)
两种方式都是“相同的”,它们的唯一区别在于第二种方式({start = next; start-&gt; next = next;})你将'next'设置为指向相同的在第一次迭代中,节点(没有意义的东西),无论如何这没关系,因为在下一次迭代中它将被这句话覆盖:“i-&gt; next = next;” (记住'我'指向前一次迭代的'下一个'节点。
进一步澄清:
假设您只分配“start = next;”的第一个风景
第一圈:
'start'为NULL,因此为其分配了指向最近创建的节点的指针。 'start-&gt; next'为NULL。
if(i!= NULL)仅在第一次迭代中计算为false。
'i'被指定为指向'下一个'
第二循环:
'start'不为NULL,因此跳过此步骤。
'i'指向上一次迭代(下一次)中持续创建的节点,因此“i-&gt; next = next;”总是从这个迭代到最后一个执行。在此步骤中,您将覆盖之前的持有值(start-&gt; next = next)
答案 1 :(得分:0)
我不是100%确定您的问题是什么,但主要的是存在巨大的逻辑错误。在for(; fgets(...循环中,你没有保持良好的列表头。它应该更像是
for(;fgets(...);...); {
island *temp=create (name);
if(temp==NULL) exit(1);
if(start==NULL) start=temp;
else {
temp->next=start;
start=temp; }
}