You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中为每个文本文件创建独立的Packet类型链表

问题解答

你的思路完全正确,当前所有数据存入同一个链表的核心原因是程序使用了全局head指针,insert函数固定操作这一个头指针,无论调用多少次都只能生成同一个链表。你需要创建10个独立头指针分别对应10个文件的链表即可实现需求。

修改要点

  • 删除全局的head指针,将insert、display函数改为接收头指针作为参数,支持操作任意独立链表
  • insert函数需要传入二级指针struct Packet **head,因为插入首节点时需要修改头指针本身的取值
  • main函数中定义头指针数组struct Packet *heads[11] = {NULL};,下标110分别对应110号文件的链表
  • 修正原代码中pos数组长度不足的问题:原定义pos[] = {0}只有1个元素,访问pos[i]到i=10会发生内存越界,需要修改为长度至少11的数组
  • 调用insert时传入对应文件的头指针地址,展示结果时循环遍历10个链表分别调用display即可

完整修改后代码

#include <stdio.h>
#include <stdlib.h>
#define MAX_LINE_LENGTH 256

struct Packet
{
    int rollnumber;
    int src;
    int dest;
    double gentime;
    struct Packet *next;
};

// 插入函数传入对应链表的头指针地址
void insert(struct Packet **head, int rollnumber, int src, int dest, double gentime)
{
    struct Packet *packet = (struct Packet *)malloc(sizeof(struct Packet));
    packet->rollnumber = rollnumber;
    packet->src = src;
    packet->dest = dest;
    packet->gentime = gentime;
    // 头插法无需单独判断空链表,空链表时*head为NULL,刚好packet->next=NULL
    packet->next = *head;
    *head = packet;
}

// 展示函数传入对应链表的头指针
void display(struct Packet *head)
{
    struct Packet *temp = head;
    while (temp != NULL)
    {
        printf("Roll Number: %d\n", temp->rollnumber);
        printf("src: %d\n", temp->src);
        printf("dest: %d\n", temp->dest);
        printf("gentime: %0.1f\n\n", temp->gentime);
        temp = temp->next;
    }
}

int main(int argc, char **argv)
{
    char line[MAX_LINE_LENGTH] = {0};
    int src, dest;
    int rollnumber;
    double gentime;
    int i = 1;
    // 修正pos数组长度,避免越界
    unsigned long pos[11] = {0};
    FILE *file;
    double Time = 12.0;
    // 定义10个链表的头指针数组,下标1~10对应1~10号文件
    struct Packet *heads[11] = {NULL};

    for (Time = 12.0; Time < 60.0; Time = Time + 12.0)
    {
        for (i = 1; i <= 10; i++)
        {
            char to_open[32];
            snprintf(to_open, 32, "fptg_%d.txt", i);
            printf("\n\nFPTG_%d.txt\n", i);

            if ((file = fopen(to_open, "r")) == NULL)
            {
                break;
            }
            else
            {
                fseek(file, pos[i], SEEK_CUR);
                fgets(line, sizeof(line), file);
                sscanf(line, "%d %d %d %lf", &rollnumber, &src, &dest, &gentime);
                printf("%s", line);
                printf("Return value=%d\n", sscanf(line, " %d %d %d %lf", &rollnumber, &src, &dest, &gentime));
                printf("gentime=%.1f\n", gentime);
                pos[i] = ftell(file);
                if (gentime < Time)
                {
                    printf("ok\n");
                    // 传入对应链表的头指针地址
                    insert(&heads[i], rollnumber, src, dest, gentime);
                    printf("Time=%0.1f\n", Time);
                }
                fclose(file);
            }
        }
    }
    // 逐个打印10个链表的内容
    for (i = 1; i <= 10; i++)
    {
        printf("\n\n===== 第%d个文件对应链表内容 =====\n", i);
        display(heads[i]);
    }

    // 可选:补充内存释放逻辑,遍历每个链表free所有节点避免内存泄漏
    return 0;
}

内容的提问来源于stack exchange,提问作者wajaap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:45:10