如何在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
相关产品推荐
相关产品推荐

