帮我用c语言链表来写歌曲管理系统,并保存到文件里,还可以对文件里的歌曲信息进行增删查改
时间: 2023-06-14 14:05:04 浏览: 122
好的,我可以帮您实现这个功能。首先,我们需要定义一个歌曲的结构体,包括歌曲名、歌手名、时长等信息:
```c
typedef struct song {
char name[50]; // 歌曲名
char singer[50]; // 歌手名
int duration; // 歌曲时长(单位:秒)
struct song *next; // 指向下一个歌曲的指针
} Song;
```
接下来,我们可以定义一个链表来存储歌曲的信息:
```c
Song *head = NULL; // 头指针,指向链表的第一个元素
// 添加歌曲
void add_song() {
Song *new_song = (Song *)malloc(sizeof(Song));
printf("请输入歌曲名:");
scanf("%s", new_song->name);
printf("请输入歌手名:");
scanf("%s", new_song->singer);
printf("请输入歌曲时长(秒):");
scanf("%d", &new_song->duration);
new_song->next = NULL;
if (head == NULL) {
head = new_song;
} else {
Song *p = head;
while (p->next != NULL) {
p = p->next;
}
p->next = new_song;
}
printf("添加成功!\n");
}
// 删除歌曲
void delete_song() {
char name[50];
printf("请输入要删除的歌曲名:");
scanf("%s", name);
if (head == NULL) {
printf("歌曲库为空!\n");
} else {
Song *p = head;
Song *prev = NULL;
while (p != NULL && strcmp(p->name, name) != 0) {
prev = p;
p = p->next;
}
if (p == NULL) {
printf("未找到该歌曲!\n");
} else {
if (prev == NULL) { // 要删除的是第一个元素
head = p->next;
} else {
prev->next = p->next;
}
free(p);
printf("删除成功!\n");
}
}
}
// 查找歌曲
void search_song() {
char name[50];
printf("请输入要查找的歌曲名:");
scanf("%s", name);
if (head == NULL) {
printf("歌曲库为空!\n");
} else {
Song *p = head;
while (p != NULL && strcmp(p->name, name) != 0) {
p = p->next;
}
if (p == NULL) {
printf("未找到该歌曲!\n");
} else {
printf("歌曲名:%s\n", p->name);
printf("歌手名:%s\n", p->singer);
printf("歌曲时长:%d秒\n", p->duration);
}
}
}
// 修改歌曲
void modify_song() {
char name[50];
printf("请输入要修改的歌曲名:");
scanf("%s", name);
if (head == NULL) {
printf("歌曲库为空!\n");
} else {
Song *p = head;
while (p != NULL && strcmp(p->name, name) != 0) {
p = p->next;
}
if (p == NULL) {
printf("未找到该歌曲!\n");
} else {
printf("请输入新的歌曲名(原歌曲名:%s):", p->name);
scanf("%s", p->name);
printf("请输入新的歌手名(原歌手名:%s):", p->singer);
scanf("%s", p->singer);
printf("请输入新的歌曲时长(秒)(原时长:%d秒):", p->duration);
scanf("%d", &p->duration);
printf("修改成功!\n");
}
}
}
// 保存到文件
void save_file() {
FILE *fp;
fp = fopen("songs.dat", "wb");
if (fp == NULL) {
printf("文件打开失败!\n");
} else {
Song *p = head;
while (p != NULL) {
fwrite(p, sizeof(Song), 1, fp);
p = p->next;
}
printf("保存成功!\n");
fclose(fp);
}
}
// 从文件加载数据
void load_file() {
FILE *fp;
fp = fopen("songs.dat", "rb");
if (fp == NULL) {
printf("文件打开失败!\n");
} else {
Song *p = NULL;
Song *prev = NULL;
while (1) {
p = (Song *)malloc(sizeof(Song));
if (fread(p, sizeof(Song), 1, fp) == 0) {
free(p);
break;
}
if (prev == NULL) {
head = p;
} else {
prev->next = p;
}
prev = p;
}
printf("加载成功!\n");
fclose(fp);
}
}
```
以上就是完整的代码,包括添加、删除、查找、修改、保存和加载功能。您可以根据自己的需要进行修改和完善。
阅读全文