Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 关于正确设置结构指针的简单链表_C_Data Structures_Struct_Singly Linked List - Fatal编程技术网

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

C 关于正确设置结构指针的简单链表,c,data-structures,struct,singly-linked-list,C,Data Structures,Struct,Singly Linked List,这段代码创建了一个动态链表,它也可以正确分配和释放内存,但有一小步我很困惑。似乎它没有将第一个结构指针start->next设置为next,我认为它应该这样做。但当我尝试运行它时,它运行得很好。然后我尝试添加start->next=next它也工作得很好。请帮我检查一下,告诉我原因 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct island { ch

这段代码创建了一个动态链表,它也可以正确分配和释放内存,但有一小步我很困惑。似乎它没有将第一个结构指针
start->next
设置为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;
}
#包括
#包括
#包括
typedef结构岛{
字符*名称;
char*打开;
char*关闭;
结构岛*next;
}岛屿;
孤岛*创建(字符*名称){
岛*i=malloc(岛的大小);
i->name=strdup(name);
i->opens=“09:00”;
i->closes=“17:00”;
i->next=NULL;
返回i;
}
无效显示(孤岛*开始){
岛*i=开始;
对于(;i!=NULL;i=i->next){
printf(“名称:%s打开:%s-%s\n”,i->Name,i->opens,i->closes);
}
}
无效释放(孤岛*开始){
岛*i=开始;
孤岛*next=NULL;
for(;i!=NULL;i=next){
next=i->next;
免费(i->name);
免费(i);
}
}
int main(){
孤岛*start=NULL;
孤岛*i=NULL;
孤岛*next=NULL;
字符名[80];
对于(;fgets(name,80,stdin)!=NULL;i=next){
下一步=创建(名称);
if(start==NULL)
start=next;//将此行更改为{start=next;start->next=next;}也可以。
如果(i!=NULL)
i->next=next;
}
显示(启动);
释放(启动);
返回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; }
   }
这两种方法都是“相同”的,唯一的区别是,在第二种方法({start=next;start->next=next;})中,您在第一次迭代中将“next”设置为指向相同的节点(没有意义的东西),无论如何,这并不重要,因为在下一次迭代中,它将被以下语句覆盖:“i->next=next;”(请记住,“i”指向上一次迭代中的“下一个”节点

为了进一步澄清这一点:

假设第一个场景仅指定“开始=下一步”

第一圈:

  • “开始”为空,因此为其分配了指向最近创建的节点的指针。“开始->下一步”为空

  • if(i!=NULL)仅在第一次迭代中计算为false

  • “i”被分配给指向“next”的点

第二圈:

  • “开始”不为NULL,因此跳过此步骤

  • “i”指向上一次迭代(下一次)中最后创建的节点,因此“i->next=next;”始终从本次迭代执行到最后一次。在此步骤中,您将覆盖先前保留的值(开始->下一次=next)


没错。我已经猜出来了。现在我知道了指针魔法,它让你可以如此自由地操纵这些小狗,真是太棒了!