关于正确设置结构指针的简单链接列表

时间:2015-04-12 04:14:45

标签: c data-structures struct singly-linked-list

这段代码创建了一个动态链表,它也可以正确地分配和释放内存,但是有一小步我很困惑。它似乎没有将第一个结构指针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;
}

我想要内心发生的事情,所以我画这个来帮助自己理解。 enter image description here

2 个答案:

答案 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; }
   }