Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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_Memory_Dynamic_Linked List_Realloc - Fatal编程技术网

C 从文件到链表读取未知的整数量

C 从文件到链表读取未知的整数量,c,memory,dynamic,linked-list,realloc,C,Memory,Dynamic,Linked List,Realloc,我试图从文件中读取未知数量的整数,并将其存储在链接列表中的整数指针中: typedef struct BCP BCP; struct BCP { int *schedule; BCP *next; }; 然后,假设nouveauBCP是一个节点: nouveauBCP->schedule = (int *) malloc(sizeof(int)); fscanf(P,"%d", &nouveauBCP->schedule); printf("%d |"

我试图从文件中读取未知数量的整数,并将其存储在链接列表中的整数指针中:

typedef struct BCP BCP;

struct BCP
{
    int *schedule;
    BCP *next;
};
然后,假设
nouveauBCP
是一个节点:

nouveauBCP->schedule = (int *) malloc(sizeof(int)); 
fscanf(P,"%d", &nouveauBCP->schedule); 
printf("%d |",nouveauBCP->schedule);

while (fgetc (P) != '\n') 
{
    nouveauBCP->schedule = (int*)realloc(nouveauBCP->schedule, sizeof(int));
    fscanf(P,"%d", nouveauBCP->schedule[i]);
    printf("%d-", nouveauBCP->schedule[i]);
    i++;
}

如何在`nouveauBCP->schedule[i]中访问读写?甚至可以在链表中使用realloc吗?

正如其他人指出的那样,您的代码没有利用链表,因此看起来有点奇怪,但由于我不知道您的总体设计,我将集中讨论您提交的代码

您缺少变量
i
的初始化,并且您的realloc()不会增加
schedule
字段所指向的内存量。 我接受了您提供的代码并添加了一些更正:

nouveauBCP->schedule = (int *) malloc(sizeof(int)); 
fscanf(P,"%d", &nouveauBCP->schedule); 
printf("%d |",nouveauBCP->schedule);
int i = 0; //initialize i variable
while (fgetc (P) != '\n') 
{
    if(i>1) // we do not want to reallocate if i is less than 1
    {
        nouveauBCP->schedule = (int*)realloc(nouveauBCP->schedule, i*sizeof(int));
    }
    fscanf(P,"%d", &nouveauBCP->schedule[i]); //fscanf needs a pointer to memory
    printf("%d-", nouveauBCP->schedule[i]);
    i++;
}

请注意,需要一个指向存储整数的内存的指针,因此您应该使用
&nouveauBCP->schedule[i]

提示:您的代码不使用
next
,因此您有理由误解“链表”是什么。请继续学习您的算法和数据结构书籍。您当然可以
realloc
(在链接列表中使用它的事实是无关紧要的)。但是当然,每次使用与您相同的大小
realloc
是没有意义的-大小需要增加。您的代码还存在其他主要问题,但除非您显示完整的代码,否则对其进行注释是没有效果的。您需要决定是尝试使用链接列表还是数组。链表为您提供了为每个节点分配的自由,但这显然不是您在这里要做的。链表是指每个节点都有一个int值,并且下一个指针指向列表中的下一个元素。也就是说,在每次迭代中,您将为一个新节点分配空间,并在该节点中设置调度(应该是int,而不是指向int的指针)。您创建的第一个节点将成为列表的标题,因此请将其存储在变量中。然后您需要列表的当前尾部,以便能够在while循环中将新元素添加到列表的末尾。有很多bug!例如,
&nouveauBCP->schedule
应该是
nouveauBCP->schedule
,为了清晰起见,最好写为
&nouveauBCP->schedule[0]
。然后,使用
fgetc
读取的字符将要到哪里?如果
realloc
失败怎么办?
realloc
不应该是
(i+1)*sizeof(int)
?我给出的代码不完整,我缺少的是
&nouveauBCP->schedule[0]
,我认为
realloc
的参数是新块的大小,无论如何非常感谢,我感谢您的帮助:)