实现代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Song {
int time;//播放次数
char name [30];//歌名
char author [36];//作者
char content [1200];//歌词
struct Song * next;//指向下一首歌曲地址
} song;
struct Song * current = NULL; //存放新歌曲地址
struct Song * head = NULL; //存放第一首歌曲地址
struct Song * tail = NULL; //存放最后一首歌曲地址
/**
* 添加歌曲
*
* @author GaoHuanjie
*/
void add() {
printf("当前操作:添加歌曲\n");
current = malloc(sizeof(struct Song));//动态生成新的、待加入链表的歌曲
printf("请输入歌名\n");
scanf("%s", (*current).name);
printf("请输入作者\n");
scanf("%s", current->author);
printf("请输入歌词\n");
scanf("%s", (*current).content);
(*current).time = 0;
if(head == NULL) {
head = current;//head为NULL,意味着当前歌曲是首节点;
} else {
tail->next = current;//把当前歌曲地址“挂到”链表最后一个节点的next成员;
}
tail = current;//将已加入链表的当前节点“变”为链表最后一个节点;
tail->next = NULL;
printf("数据添加成功!\n");
}
/**
* 删除歌曲
*
* @author GaoHuanjie
*/
void drop() {
printf("当前操作:删除歌曲\n");
struct Song * point = head;
if(point != NULL) {
printf("请输入歌名\n");
char name [30];//歌名
scanf("%s", name);
while(point != NULL) {
if(strcmp(name, point->name) == 0) {
break;
}
point = point->next;//当遍历“完”链表最后一个元素时,point指针变量的值为NULL
}
if(point != NULL) {
if(point == head) { //删除第一首歌
if(head->next == NULL) { //当前系统只保存一首歌曲
head = NULL;
} else {
head = head->next;
}
} else {
struct Song * previous = head;//point所指歌曲的前一首歌曲
while(previous != NULL) {
if(previous->next == point) {
break;
}
previous = previous->next;//当遍历“完”链表最后一个元素时,point指针变量的值为NULL
}
previous->next = point->next;
}
free(point);
printf("数据删除成功!\n");
} else {
printf("系统没有找到歌名为%s的歌曲,无法删除!\n", name);
}
} else {
printf("当前系统没有保存歌曲,无法删除!\n");
}
}
/**
* 修改歌曲
*
* @author GaoHuanjie
*/
void update() {
printf("当前操作:修改歌曲\n");
struct Song * point = head;
if(point != NULL) {
printf("请输入歌名\n");
char name [30];//歌名
scanf("%s", name);
while(point != NULL) {
if(strcmp(name, point->name) == 0) {
break;
}
point = point->next;//当遍历“完”链表最后一个元素时,point指针变量的值为NULL
}
if(point != NULL) {
printf("请输入新歌名\n");
scanf("%s", (*point).name);
printf("请输入新作者\n");
scanf("%s", point->author);
printf("请输入新歌词\n");
scanf("%s", (*point).content);
printf("数据修改成功!\n");
} else {
printf("系统没有找到歌名为%s的歌曲,无法修改!\n", name);
}
} else {
printf("当前系统没有保存歌曲,无法修改!\n");
}
}
/**
* 点播歌曲
*
* @author GaoHuanjie
*/
void select() {
printf("当前操作:点播歌曲\n");
struct Song * point = head;
if(point != NULL) {
printf("请输入歌名\n");
char name [30];//歌名
scanf("%s", name);
while(point != NULL) {
if(strcmp(name, point->name) == 0) {
break;
}
point = point->next;//当遍历“完”链表最后一个元素时,point指针变量的值为NULL
}
if(point != NULL) {
printf("歌名:%s\n作者:%s\n播放:%d\n", point->name, point->author, point->time);
printf("歌词:\n");
char content [1200];
strcpy(content,point->content);
split(content);
point->time = point->time + 1;
} else {
printf("系统没有找到歌名为%s的歌曲,无法点播!\n", name);
}
} else {
printf("当前系统没有保存歌曲,无法点播!\n");
}
}
void split(char * content){
char * subContent = strtok(content, "\\n");
printf("%s\n", subContent);
while(subContent = strtok(NULL, "\\n")){
printf("%s\n", subContent);
}
}
int main() {
printf("************************************\n");
printf("* *\n");
printf("* 欢迎使用雷石KTV点歌系统 *\n");
printf("* *\n");
printf("************************************\n");
for(;;) {
printf("\n");
printf("1、添加歌曲\n");
printf("2、删除歌曲\n");
printf("3、修改歌曲\n");
printf("4、点播歌曲\n");
printf("5、退出系统\n");
printf("请输入菜单编号,按回车键结束:\n");
int option;
scanf("%d", &option);
switch(option) {
case 1:
add();
break;
case 2:
drop();
break;
case 3:
update();
break;
case 4:
select();
break;
case 5:
printf("成功退出系统\n");
exit(0);
default:
printf("%d系统不支持该操作\n", option);
}
}
return 0;
}
测试数据:
歌名:传奇
作者:李健
演唱:王菲
歌词:
只是因为在人群中多看了你一眼\n再也没能忘掉你容颜\n梦想着偶然能有一天再相见\n从此我开始孤单思念\n想你时你在天边\n想你时你在眼前\n想你时你在脑海\n想你时你在心田\n宁愿相信我们前世有约\n今生的爱情故事不会再改变\n宁愿用这一生等你发现\n我一直在你身旁从未走远\n只是因为在人群中多看了你一眼\n再也没能忘掉你容颜\n梦想着偶然能有一天再相见\n从此我开始孤单思念\n想你时你在天边\n想你时你在眼前\n想你时你在脑海\n想你时你在心田\n宁愿相信我们前世有约\n今生的爱情故事不会再改变\n宁愿用这一生等你发现\n我一直在你身旁从未走远
歌名:逍遥叹
作者:陈宇任
演唱:胡歌
歌词:
岁月难得沉默秋风厌倦漂泊\n夕阳赖着不走挂在墙头舍不得我\n昔日伊人耳边话已和潮声向东流\n再回首往事也随枫叶一片片落\n爱已走到尽头恨也放弃承诺\n命运自认幽默想法太多由不得我\n壮志凌云几分愁知己难逢几人留\n再回首却闻笑传醉梦中\n笑叹词穷古痴今狂终成空\n刀钝刃乏恩断义绝梦方破\n路荒已叹饱览足迹没人懂\n多年望眼欲穿过红尘滚滚我没看透\n自嘲墨尽千情万怨英杰愁\n曲终人散发花鬓白红颜殁\n烛残未觉与日争辉图消瘦\n当泪干血隐狂涌白雪纷飞都成红\n爱已走到尽头恨也放弃承诺\n命运自认幽默想法太多由不得我\n壮志凌云几分愁知己难逢几人留\n再回首却闻笑传醉梦\n笑叹词穷古痴今狂终成空\n刀钝刃乏恩断义绝梦方破\n路荒已叹饱览足迹没人懂\n多年望眼欲穿过红尘滚滚我没看透\n自嘲墨尽千情万怨英杰愁\n曲终人散发花鬓白红颜殁\n烛残未觉与日争辉图消瘦\n当泪干血隐狂涌白雪纷飞都成红\n笑叹词穷古痴今狂终成空\n刀钝刃乏恩断义绝梦方破\n路荒已叹饱览足迹没人懂\n多年望眼欲穿过红尘滚滚我没看透\n自嘲墨尽千情万怨英杰愁\n曲终人散发花鬓白红颜殁\n烛残未觉与日争辉图消瘦\n当泪干血隐狂涌白雪纷飞都成红
歌名:半壶纱
作者:刘珂矣&百慕三石
演唱:刘珂矣
歌词:
墨已入水渡一池青花\n揽五分红霞采竹回家\n悠悠风来 埋一地桑麻\n一身袈裟 把相思放下\n十里桃花待嫁的年华\n凤冠的珍珠 挽进头发\n檀香拂过玉镯弄轻纱\n空留一盏 芽色的清茶\n倘若我心中的山水\n你眼中都看到\n我便一步一莲花祈祷\n怎知那浮生一片草\n岁月催人老\n风月花鸟 一笑尘缘了\n十里桃花待嫁的年华\n凤冠的珍珠 挽进头发\n檀香拂过玉镯弄轻纱\n空留一盏 芽色的清茶\n倘若我心中的山水\n你眼中都看到\n我便一步一莲花祈祷\n怎知那浮生一片草\n岁月催人老\n风月花鸟 一笑尘缘了\n倘若我心中的山水 你眼中都看到\n我便一步一莲花祈祷\n怎知那浮生一片草 岁月催人老\n风月花鸟 一笑尘缘了\n怎知那浮生一片草 岁月催人老\n风月花鸟 一笑尘缘了