帮我用c语言的链表来写个歌曲管理系统,并保存到文件里,还可以对文件里的歌曲信息进行增删查改
时间: 2023-06-15 18:08:39 浏览: 50
好的,我可以帮你实现这个功能。以下是代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义歌曲结构体
typedef struct Song {
char name[100]; // 歌曲名
char artist[100]; // 歌手名
char album[100]; // 专辑名
int length; // 歌曲时长
struct Song *next; // 指向下一个歌曲的指针
} Song;
// 全局变量,指向链表头
Song *head = NULL;
// 函数声明
void printMenu();
void addSong();
void deleteSong();
void searchSong();
void updateSong();
void saveToFile();
void loadFromFile();
void freeList();
// 主函数
int main() {
int choice;
// 从文件中读取歌曲信息
loadFromFile();
// 显示菜单,让用户选择操作
do {
printMenu();
scanf("%d", &choice);
getchar(); // 把回车符从输入缓冲区中取出
switch (choice) {
case 1:
addSong(); // 添加歌曲
break;
case 2:
deleteSong(); // 删除歌曲
break;
case 3:
searchSong(); // 查找歌曲
break;
case 4:
updateSong(); // 更新歌曲
break;
case 5:
saveToFile(); // 把歌曲信息保存到文件中
break;
case 6:
freeList(); // 释放链表内存
exit(0); // 退出程序
default:
printf("无效的选项,请重新输入。\n");
}
} while (1);
return 0;
}
// 显示菜单
void printMenu() {
printf("======================================\n");
printf(" 歌曲管理系统 \n");
printf("======================================\n");
printf("1. 添加歌曲\n");
printf("2. 删除歌曲\n");
printf("3. 查找歌曲\n");
printf("4. 更新歌曲\n");
printf("5. 保存到文件\n");
printf("6. 退出\n");
printf("======================================\n");
printf("请选择操作:");
}
// 添加歌曲
void addSong() {
Song *p = (Song *) malloc(sizeof(Song));
printf("请输入歌曲名:");
fgets(p->name, 100, stdin);
p->name[strlen(p->name) - 1] = '\0'; // 把输入的回车符替换成字符串结束符
printf("请输入歌手名:");
fgets(p->artist, 100, stdin);
p->artist[strlen(p->artist) - 1] = '\0';
printf("请输入专辑名:");
fgets(p->album, 100, stdin);
p->album[strlen(p->album) - 1] = '\0';
printf("请输入歌曲时长:");
scanf("%d", &p->length);
getchar(); // 把回车符从输入缓冲区中取出
p->next = NULL;
// 如果链表为空,把新节点作为链表头
if (head == NULL) {
head = p;
} else {
// 找到链表尾部,把新节点插入到尾部
Song *q = head;
while (q->next != NULL) {
q = q->next;
}
q->next = p;
}
printf("添加成功!\n");
}
// 删除歌曲
void deleteSong() {
char name[100];
printf("请输入要删除的歌曲名:");
fgets(name, 100, stdin);
name[strlen(name) - 1] = '\0';
Song *p = head;
Song *q = NULL;
while (p != NULL) {
if (strcmp(p->name, name) == 0) {
// 找到要删除的节点
if (q == NULL) {
// 如果要删除的节点是链表头,直接把头指针指向下一个节点
head = p->next;
} else {
// 如果要删除的节点不是链表头,把前一个节点的指针指向下一个节点
q->next = p->next;
}
free(p);
printf("删除成功!\n");
return;
}
q = p;
p = p->next;
}
printf("未找到要删除的歌曲!\n");
}
// 查找歌曲
void searchSong() {
char name[100];
printf("请输入要查找的歌曲名:");
fgets(name, 100, stdin);
name[strlen(name) - 1] = '\0';
Song *p = head;
int count = 0;
while (p != NULL) {
if (strcmp(p->name, name) == 0) {
// 找到要查找的节点
printf("歌曲名:%s\n", p->name);
printf("歌手名:%s\n", p->artist);
printf("专辑名:%s\n", p->album);
printf("歌曲时长:%d秒\n", p->length);
count++;
}
p = p->next;
}
if (count == 0) {
printf("未找到要查找的歌曲!\n");
}
}
// 更新歌曲
void updateSong() {
char name[100];
printf("请输入要更新的歌曲名:");
fgets(name, 100, stdin);
name[strlen(name) - 1] = '\0';
Song *p = head;
while (p != NULL) {
if (strcmp(p->name, name) == 0) {
// 找到要更新的节点
printf("请输入新的歌曲名:");
fgets(p->name, 100, stdin);
p->name[strlen(p->name) - 1] = '\0';
printf("请输入新的歌手名:");
fgets(p->artist, 100, stdin);
p->artist[strlen(p->artist) - 1] = '\0';
printf("请输入新的专辑名:");
fgets(p->album, 100, stdin);
p->album[strlen(p->album) - 1] = '\0';
printf("请输入新的歌曲时长:");
scanf("%d", &p->length);
getchar(); // 把回车符从输入缓冲区中取出
printf("更新成功!\n");
return;
}
p = p->next;
}
printf("未找到要更新的歌曲!\n");
}
// 把歌曲信息保存到文件中
void saveToFile() {
char fileName[100];
printf("请输入文件名:");
fgets(fileName, 100, stdin);
fileName[strlen(fileName) - 1] = '\0';
FILE *fp = fopen(fileName, "w");
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
Song *p = head;
while (p != NULL) {
fprintf(fp, "%s|%s|%s|%d\n", p->name, p->artist, p->album, p->length);
p = p->next;
}
fclose(fp);
printf("保存成功!\n");
}
// 从文件中读取歌曲信息
void loadFromFile() {
char fileName[100];
printf("请输入文件名:");
fgets(fileName, 100, stdin);
fileName[strlen(fileName) - 1] = '\0';
FILE *fp = fopen(fileName, "r");
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
char buffer[100];
char *name;
char *artist;
char *album;
char *lengthStr;
int length;
while (fgets(buffer, 100, fp) != NULL) {
// 用竖线分隔歌曲信息
name = strtok(buffer, "|");
artist = strtok(NULL, "|");
album = strtok(NULL, "|");
lengthStr = strtok(NULL, "\n");
length = atoi(lengthStr);
// 把读取到的歌曲信息插入到链表中
Song *p = (Song *) malloc(sizeof(Song));
strcpy(p->name, name);
strcpy(p->artist, artist);
strcpy(p->album, album);
p->length = length;
p->next = NULL;
if (head == NULL) {
head = p;
} else {
Song *q = head;
while (q->next != NULL) {
q = q->next;
}
q->next = p;
}
}
fclose(fp);
printf("读取成功!\n");
}
// 释放链表内存
void freeList() {
Song *p = head;
Song *q;
while (p != NULL) {
q = p;
p = p->next;
free(q);
}
printf("内存已释放!\n");
}
```
代码中使用了链表来存储歌曲信息,并且提供了增删查改和保存到文件的功能。你可以根据需要修改代码中的一些细节,比如文件名和歌曲信息的字段。