C语言文件链表删除与插入

将文件存储到链表里,然后关闭文件,再以只写格式打开,文件就是空的了,然后遍历链表,遇到删除目标跳过,其他写入,插入时在写入本结点内容同时再定义一个新的结构体指针并申请内存,输入,读取。
不用重建文件

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个带有链表文件保存和排序功能的影院管理系统的C语言代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME_LEN 20 // 定义影片结构体 typedef struct film { int id; // 影片编号 char name[MAX_NAME_LEN]; // 影片名称 int duration; // 影片时长 float price; // 影片价格 struct film *next; // 指向下一个影片的指针 } Film; // 初始化链表 Film *initList() { Film *head = (Film *)malloc(sizeof(Film)); head->next = NULL; return head; } // 插入影片到链表尾部 void addFilm(Film *head, int id, char *name, int duration, float price) { Film *newFilm = (Film *)malloc(sizeof(Film)); newFilm->id = id; strcpy(newFilm->name, name); newFilm->duration = duration; newFilm->price = price; newFilm->next = NULL; Film *p = head; while (p->next != NULL) { p = p->next; } p->next = newFilm; } // 根据影片编号删除影片 void deleteFilm(Film *head, int id) { Film *p = head->next; Film *prev = head; while (p != NULL) { if (p->id == id) { prev->next = p->next; free(p); printf("影片删除成功!\n"); return; } prev = p; p = p->next; } printf("未找到影片编号为%d的影片!\n", id); } // 根据影片编号查找影片 Film *findFilm(Film *head, int id) { Film *p = head->next; while (p != NULL) { if (p->id == id) { return p; } p = p->next; } return NULL; } // 显示所有影片信息 void showFilms(Film *head) { printf("影片编号\t影片名称\t影片时长\t影片价格\n"); Film *p = head->next; while (p != NULL) { printf("%d\t\t%s\t\t%d\t\t%.2f\n", p->id, p->name, p->duration, p->price); p = p->next; } } // 影片按价格排序 void sortFilms(Film *head) { int len = 0; Film *p = head->next; while (p != NULL) { len++; p = p->next; } for (int i = 0; i < len - 1; i++) { Film *p = head->next; Film *q = p->next; for (int j = 0; j < len - i - 1; j++) { if (p->price > q->price) { p->next = q->next; q->next = p; head->next = q; p = q; } else { p = p->next; q = q->next; } } } } // 从文件读取影片信息到链表 void loadFilmsFromFile(Film *head, char *filename) { FILE *fp = fopen(filename, "r"); if (fp == NULL) { printf("文件%s打开失败!\n", filename); return; } int id, duration; char name[MAX_NAME_LEN]; float price; while (fscanf(fp, "%d%s%d%f", &id, name, &duration, &price) != EOF) { addFilm(head, id, name, duration, price); } printf("影片信息读取成功!\n"); fclose(fp); } // 将链表的影片信息保存文件 void saveFilmsToFile(Film *head, char *filename) { FILE *fp = fopen(filename, "w"); if (fp == NULL) { printf("文件%s打开失败!\n", filename); return; } Film *p = head->next; while (p != NULL) { fprintf(fp, "%d\t%s\t%d\t%.2f\n", p->id, p->name, p->duration, p->price); p = p->next; } printf("影片信息保存成功!\n"); fclose(fp); } int main() { Film *head = initList(); // 初始化链表 // 从文件读取影片信息到链表 loadFilmsFromFile(head, "films.txt"); // 显示所有影片 showFilms(head); // 根据影片编号删除影片 deleteFilm(head, 2); // 显示所有影片 showFilms(head); // 查找影片并修改价格 Film *film = findFilm(head, 1); if (film != NULL) { film->price = 35.0; printf("影片价格修改成功!\n"); } else { printf("未找到影片编号为%d的影片!\n", 1); } // 显示所有影片 showFilms(head); // 按价格排序并显示所有影片 sortFilms(head); printf("按价格排序后的影片信息:\n"); showFilms(head); // 将链表的影片信息保存文件 saveFilmsToFile(head, "films.txt"); return 0; } ``` 在上面的代码,我们新增了两个函数:`loadFilmsFromFile()`和`saveFilmsToFile()`。`loadFilmsFromFile()`函数的作用是从文件读取影片信息到链表,`saveFilmsToFile()`函数的作用是将链表的影片信息保存文件。在`main()`函数,我们在读取文件删除、修改、显示所有影片信息、按价格排序和保存文件的基础上,新增了一个从文件读取影片信息并显示所有影片信息的功能。 需要注意的是,在使用`fscanf()`函数从文件读取影片信息时,我们需要按照文件影片信息的格式进行读取,即先读取影片编号、影片名称、影片时长和影片价格。在使用`fprintf()`函数将影片信息保存文件时,我们也需要按照文件影片信息的格式进行保存,即将影片信息按照影片编号、影片名称、影片时长和影片价格的顺序以制表符分隔开来保存

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值