gpt4 book ai didi

C : Function to read a file to a singly linked list and return head pointer?

转载 作者:行者123 更新时间:2023-11-30 20:08:17 25 4
gpt4 key购买 nike

我正在编写一个程序,该程序将填充一个单链表,并通过将数据按顺序存储在节点结构中来处理包含足球队和结果的文件中的数据。当尝试遍历并显示填充的链表时会出现问题。

我已经尝试过

1.将头指针作为参数传递

  • 在函数内创建头节点然后返回它
  • 3.(如我提供的代码)两者。

    这一切都不起作用。创建了一些测试 printf-s。

    结构:

       typedef struct node{
    char host[50];
    char* guest[50];
    int nrgh;
    int nrgg;
    struct node* next;
    }node;

    加载器功能:

       node* load_ll(node* head,char* file_name){
    FILE* fp;

    fp = fopen(file_name,"r");
    node *curr;
    curr = head;
    if(fp == NULL){
    printf("Greska pri otvaranju fajla.");
    exit(1);
    }

    char buff[100];
    char* tok;

    while(fgets(&buff,100,fp) != NULL){

    curr = (node*)malloc(sizeof(node));
    if(curr == NULL)
    {
    printf("Error creating a node.");
    exit(1);
    }

    tok = strtok(buff,",");
    strcpy(curr->host,tok);
    tok = strtok(NULL,",");
    strcpy(curr->guest,tok);
    tok = strtok(NULL,",");
    curr->nrgh = atoi(tok);
    tok = strtok(NULL,",");
    curr->nrgg = atoi(tok);

    curr->next = NULL;

    printf("%s\n",curr->host);
    printf("%s\n",curr->guest);
    printf("%d\n",curr->nrgh);
    printf("%d\n",curr->nrgg);
    curr=curr->next;

    return head;

    }

    遍历并显示函数:

    void print_matches(node* head){
    node* curr = head;

    while(curr->next != NULL){

    printf("%s\t%d\n%s\t%d\n",curr->host,curr->nrgh,curr->guest,curr->nrgg);
    curr = curr->next;

    }
    return;
    }

    主要:

    int main()
    {


    node* head = load_ll(head,"utakmice.txt");
    print_matches(head);

    return 0;
    }

    “加载器函数”中的 Printf-s 显示列表已正确填充,尽管如此,我在尝试调用“print_matches”函数时仍然遇到“段错误”。我怀疑从“加载器函数”返回时与范围有关的问题。但我不知道如何继续前进。

    感谢您的帮助。

    最佳答案

    不需要将头指针传递给load_ll,因为它应该创建一个列表并返回一个指向所创建列表头的指针。此外,您当前版本的 load_ll 不会将分配的列表节点链接在一起。

    这是一个不带 head 参数的 load_ll 版本:

    node* load_ll(char* file_name){
    FILE* fp;
    node *head = NULL;
    node* tail = NULL;
    node* curr;

    fp = fopen(file_name,"r");
    if(fp == NULL){
    printf("Greska pri otvaranju fajla.");
    exit(1);
    }

    char buff[100];
    char* tok;

    while(fgets(&buff,100,fp) != NULL){

    curr = (node*)malloc(sizeof(node));
    if(curr == NULL)
    {
    printf("Error creating a node.");
    exit(1);
    }

    tok = strtok(buff,",");
    strcpy(curr->host,tok);
    tok = strtok(NULL,",");
    strcpy(curr->guest,tok);
    tok = strtok(NULL,",");
    curr->nrgh = atoi(tok);
    tok = strtok(NULL,",");
    curr->nrgg = atoi(tok);

    curr->next = NULL;

    printf("%s\n",curr->host);
    printf("%s\n",curr->guest);
    printf("%d\n",curr->nrgh);
    printf("%d\n",curr->nrgg);

    if(tail != NULL)
    tail->next = curr;
    else
    head = curr;
    tail = curr;
    }

    return head;
    }

    向函数添加 head 参数的一种可能用途是将新条目追加到现有列表中。这可以通过修改上述函数的开头来完成,如下所示:

    node* load_ll(node* head, char* file_name){
    FILE* fp;
    node* tail = head;
    node* curr;

    if(tail != NULL){
    // find tail of list
    while(tail->next != NULL)
    tail = tail->next;
    }

    /* remainder of function as before */

    return head;
    }

    要创建新列表,请将其命名为:

    head = load_ll(NULL, file_name);

    要追加到现有列表,请将其称为:

    head = load_ll(head, file_name);

    由于在附加到现有列表时 head 预计不会更改,因此在这种情况下您可以省略对 head 的分配。

    您可以使用相同的调用来创建新列表或附加到现有列表,如下所示:

    创建一个新列表:

    head = NULL;
    head = load_ll(head, file_name);

    附加到现有列表:

    head = load_ll(head, file_name);

    关于C : Function to read a file to a singly linked list and return head pointer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57359637/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com