影院管理系统C语言含链表,文件保存和排序
时间: 2023-07-25 16:43:10 浏览: 103
基于链表对文件进行读写的C语言图书管理系统
以下是一个带有链表、文件保存和排序功能的影院管理系统的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()`函数将影片信息保存到文件中时,我们也需要按照文件中影片信息的格式进行保存,即将影片信息按照影片编号、影片名称、影片时长和影片价格的顺序以制表符分隔开来保存。
阅读全文