我想从文本文件中读取数字并动态创建链接列表,虽然我能够这样做,但是最后一个值为0的节点也会添加到列表中。我怎么能纠正这个?此外,如果我愿意,我应该可以添加值0,但不是这样。
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
}node;
int main(int argc, char const *argv[]) {
FILE *fp = fopen("data.txt", "r");
node *prev = NULL;
while(!feof(fp)){
node *curr = malloc(sizeof(node));
fscanf(fp, "%d", &(curr->data));
fprintf(stdout, "%d-->", curr->data);
if(prev != NULL){
prev->next = curr;
}
prev = curr;
}
printf("NULL\n");
fclose(fp);
return 0;
}
输入文件是这一整数列 1 五 2 3 6 4
输出如下,0不是输入的一部分 1 - →5 - →2 - →3 - →6 - →4 - 大于0 - &GT; NULL
答案 0 :(得分:1)
继续发表评论后,您对while (!feof(fp))
的使用是错误的。如果您使用的是fscanf
,则应检查return
(例如== 1
)以确定转化成功与否。您还应该将值读入临时值(而不是列表数据),以便在将数字分配给列表之前验证该数字。
将它们放在一起,您可以执行以下操作(注意:如果没有给出参数,代码将从作为第一个参数(或来自stdin
)传递的文件名中读取值)
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
} node;
int main (int argc, char **argv) {
int tmp = 0;
node *prev = NULL;
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* validate file is open for reading */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
while (fscanf (fp, " %d", &tmp) == 1) { /* validate conversion to tmp */
node *curr = malloc (sizeof (node));
curr->data = tmp; /* assign tmp to curr->data */
fprintf (stdout, "%d-->", curr->data);
if (prev != NULL) {
prev->next = curr;
}
prev = curr;
}
putchar ('\n');
if (fp != stdin) fclose (fp); /* close if not reading from stdin */
return 0;
}
此外,如果您只需要'\n'
,请不要使用printf
,则无需使用putchar ('\n');
。只需使用netcoreapp1.0
仔细看看,如果您有疑问,请告诉我。