C语言动态链表实现KTV点歌系统

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangshuxuncom/article/details/85243142

实现代码:

#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风月花鸟 一笑尘缘了

猜你喜欢

转载自blog.csdn.net/wangshuxuncom/article/details/85243142
今日推荐