创建列表

时间:2016-09-06 16:46:31

标签: c linked-list

函数读取包含正整数的输入文件(每行一个数字)并创建包含这些数字的列表,每个单元格一个。输入文件中的-1表示列表的结尾。这样,您可以在同一输入文件中指定多个列表。假设输入文件称为“输入”。每次调用函数都会读取输入文件中的数字,直到达到-1,然后将这些数字放入列表中,并返回指向此列表头部的指针。因此,如果输入文件包含 1 5 4 -1 4 8 6 -1 -1 7 8 然后,第一次调用函数将返回指向列表1-> 5-> 4-> null的指针,第二次调用函数将返回指向列表4-> 8-> 6->的指针;空值。 第三个呼叫将返回null,第四个呼叫将返回7-> 8->空值。我想实现这一点,到目前为止,我能够从文本文件中读取文件。现在我想要每个-1遇到的fin文件,它应该取数字直到-1并创建一个列表。

    #include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct list {
    char *string;
    struct list *next;
};

typedef struct list LIST;

int main() {
    FILE *fp;
    char line[128];
    LIST *current, *head;

    head = current = NULL;
    fp = fopen("test.txt", "r");

    while (fgets(line, sizeof(line), fp)) {
        LIST *node = (struct list * )malloc(sizeof(LIST));
        node->string = _strdup(line);// strdup(line);//note : strdup is not standard function
        node->next = NULL;

        if (head == NULL) {
            current = head = node;
        }
        else {
            current = current->next = node;
        }
    }
    fclose(fp);
    //test print
    for (current = head; current; current = current->next) {
        printf("%s", current->string);
    }
    //need free for each node
    return 0;
}

1 个答案:

答案 0 :(得分:0)

像这样:

#include <stdio.h>
#include <stdlib.h>

struct list {
    int v;
    struct list *next;
};

typedef struct list LIST;

LIST *makeListFromFile(FILE *fp){
    int v;
    LIST *current, *head = NULL;

    while(fscanf(fp, "%d", &v) == 1 && v != -1){
        LIST *node = malloc(sizeof(LIST));
        node->v = v;
        node->next = NULL;
        if (head == NULL)
            current = head = node;
        else
            current = current->next = node;
    }
    return head;
}

int main(void) {
    FILE *fp = fopen("test.txt", "r");

    while(!feof(fp)){
        LIST *list = makeListFromFile(fp);
        while(list){
            LIST *temp = list->next;
            printf("%d ", list->v);
            free(list);
            list = temp;
        }
        puts("NULL");
    }
    fclose(fp);
    return 0;
}