通过从文本文件中读取数字来生成链接列表

时间:2016-07-15 23:17:06

标签: c data-structures linked-list

我想从文本文件中读取数字并动态创建链接列表,虽然我能够这样做,但是最后一个值为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

1 个答案:

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

即可

仔细看看,如果您有疑问,请告诉我。