歌曲信息管理系统[低配版]

简介: 歌曲信息管理系统[低配版]

1. 选题背景

1.1 时代背景


随着时代的快速发展, 听歌是人们常见的一种放松的方式. 听歌可以使得我们进入一个属于自己的自由世界.

当然, 不同的歌曲是有不一样的属性. 比如: 激情的歌曲会让人进入一个亢奋的转态, 抒情的歌曲会让人思绪万千… …

所以, 歌曲信息是值得存储的, 尤其是歌手(一般歌手会有自己的一种属性), 歌曲属性, 这样可以使得我们可以快速地找到最属于自己的一份歌单

1.2 程序功能


程序的主要功能就是按照歌曲属性来存储歌曲, 创建一个属于自己的临时歌单

(1) 首先界面出现提示, 选择自己的选项进行操作

(2) 随后就可以进行存储歌曲信息, 修改歌曲信息, 删除歌曲信息… …


2. 设计分析

2.1 menu函数

menu函数 — — 完成选择界面的打印

2.2 MusicEqual函数

MusicEqual函数 — ---- 判断两个歌曲是否相同

2.3 BuyNode函数

BuyNode函数 — — 增加新的结点

2.4 MusicShow函数

MusicShow函数 ---- ---- 歌曲信息的打印

2.5 MusicStorage函数

MusicStorage函数 — — 存储歌曲信息

2.6 MusicFind函数

MusicFind函数 — — 查询歌曲位置

2.7 MusicDele函数

MusicDele函数 ---- ---- 删除歌曲信息

2.8 MusicModify函数

MusicModify函数 ---- ----- 修改歌曲信息


3. 程序说明

结构采用的是用单链表的形式, 其中的存放歌曲数据的data 用的也是一个结构体类型

依托这个单链表的基本结构进行下面的增删查改一系列的操作.


4. 关键代码分析

4.1 MusicEqual && BuyNode

由于歌曲信息是一个结构体, 属于自定义类型, 运算符要进行运算符重载才可以使用

所以, 在此处, 我们用的是strcmp函数来进行比较, 利用strcpy函数来进行拷贝

4.2 MusicDele

结点的删除是使这个结点 和 整个链表结构断开联系, 而不是真正意义上的删除.

所以, 我们要找到这个结点的上一个位置(除非这个链表是空链表 或者是只有一个结点)

4.3 运用枚举使Switch语句更加易懂


5. 心得体会

课程设计是培养学生综合运用所学知识, 发现, 提出, 分析和解决实际问题,锻炼实践能力的重要环节, 是对学生实际工作能力的具体训练和考察过程.

随着科学技术发展的日新日异, C语言已经成为当今计算机应用中空前活跃的领域, 在生活中可以说得是无处不在.

这次课程设计让我学到了很多, 不仅是巩固了先前学的C语言的理论知识, 而且也培养了我的动手能力, 更令我的创造性思维得到拓展. 在本次的课程设计, 使我对单链表的机构有了更深层次的理解与感悟. 希望我在未来的学习生活中能够更好地应用它.


源码

# define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
typedef struct MusicInfor // 数据里面的内容
{
  char name[20];
  char singer[20];
  char type[20];
}MType;
typedef struct Music // 单链表形式
{
  MType data;
  struct Music* next;
}music;
int MusicEqual(music* x, MType y) // 判断是否相等
{
  if (strcmp(x->data.name, y.name) == 0 && strcmp(x->data.singer, y.singer) == 0 && strcmp(x->data.type, y.type) == 0)
    return 1;
  return 0;
}
music* BuyNode(MType x) // 增加新的节点
{
  music* newnode = (music*)malloc(sizeof(music));
  if (newnode == NULL)
  {
    perror("malloc fail");
    exit(-1);
  }
  memcpy(newnode->data.name, x.name, sizeof(x.name));
  memcpy(newnode->data.singer, x.singer, sizeof(x.singer));
  memcpy(newnode->data.type, x.type, sizeof(x.type));
  newnode->next = NULL;
  return newnode;
}
void MusicShow(music* phead) // 打印数据
{
  if (phead == NULL)
    printf("歌单并没有东西哦, 先去添加一下~~\n");
  else
  {
    music* cur = phead;
    while (cur)
    {
      printf("**********************************\n");
      printf("*歌名:%s                          \n", cur->data.name);
      printf("*歌手:%s                          \n", cur->data.singer);
      printf("*类型:%s                          \n", cur->data.type);
      cur = cur->next;
    }
  }
  printf("**********************************\n");
}
void MusicStorage(music** pphead) // 存储新的数据
{
  MType x;
  printf("请输入你要添加的歌曲>\n");
  scanf("%s", x.name);
  printf("请输入这首歌的歌手>\n");
  scanf("%s", x.singer);
  printf("请输入这首歌的类型>\n");
  scanf("%s", x.type);
  music* newnode = BuyNode(x);
  if (*pphead == NULL)
  {
    *pphead = newnode;
    printf("添加成功\n");
  }
  else
  {
    // 找尾
    music* tail = *pphead;
    while (tail->next != NULL)
    {
      tail = tail->next;
    }
    tail->next = newnode;
    printf("添加成功\n");
  }
}
void MusicFind(music* phead) // 查找, 有,返回位置; 没有, 返回一段话
{
  MType x;
  if (phead == NULL)
  {
    printf("该歌单是空的, 请添加歌曲\n");
    return;
  }
  printf("你想查询的歌曲>\n");
  scanf("%s", x.name);
  printf("这首歌的歌手是>\n");
  scanf("%s", x.singer);
  printf("这首歌的类型是>\n");
  scanf("%s", x.type);
  music* cur = phead;
  int len = 0;
  while (cur)
  {
    len++;
    if (MusicEqual(cur, x))
    {
      printf("该歌单有这首歌,这首歌的位置在%d\n", len);
      return;
    }
    cur = cur->next;
  }
  printf("该歌单没有此项目\n");
  return;
}
void MusicDele(music** pphead) // 删除
{
  MType x;
  if (*pphead == NULL)
    printf("亲,歌单里没有东西了,不要再删了~\n");
  printf("你想删除的歌曲>\n");
  scanf("%s", x.name);
  printf("这首歌的歌手是>\n");
  scanf("%s", x.singer);
  printf("这首歌的类型是>\n");
  scanf("%s", x.type);
  music* cur = *pphead;
  if (MusicEqual(cur, x))
  {
    *pphead = cur->next;
    free(cur);
    cur = NULL;
    printf("删除成功\n");
  }
  else
  {
    while (cur != NULL && !MusicEqual(cur->next, x))
    {
      cur = cur->next;
    }
    music* tem = cur->next;
    cur->next = tem->next;
    free(tem);
    tem = NULL;
    printf("删除成功\n");
  }
}
void MusicModify(music** pphead) //修改
{
  if (*pphead == NULL)
  {
    printf("该歌单里空落落的,不能修改哦~\n");
    return;
  }
  MType x;
  printf("请输入你要修改的原数据>\n");
  printf("歌名>\n");
  scanf("%s", x.name);
  printf("歌手\n");
  scanf("%s", x.singer);
  printf("类型>\n");
  scanf("%s", x.type);
  music* cur = *pphead;
  while (cur != NULL && !MusicEqual(cur, x))
  {
    cur = cur->next;
  }
  if (cur == NULL)
  {
    printf("该歌单里面并没有你要修改的数据, 请仔细检查之后再输入\n");
    return;
  }
  else
  {
    printf("修改后的歌名>\n");
    scanf("%s", cur->data.name);
    printf("修改后的歌手>\n");
    scanf("%s", cur->data.singer);
    printf("修改后的类型>\n");
    scanf("%s", cur->data.type);
    printf("修改成功\n");
  }
}
void menu()
{
  printf("+————————————————————————————————————————————————————————————+\n");
  printf("|    +———————————————————————————————————————+               |\n");
  printf("|    |            欢迎来到存歌环节           |               |\n");
  printf("|    |  0.exit                 1.storage     |               |\n");
  printf("|    |  2.find                 3.show        |               |\n");
  printf("|    |  4.modify               5.delete      |               |\n");
  printf("|    +———————————————————————————————————————+               |\n");
  printf("+————————————————————————————————————————————————————————————+\n");
}
int main()
{
  music* head = NULL;
  int input = 0;
  do
  {
    menu();
    enum Option
    {
      exit,
      storage,
      find,
      show,
      modify,
      delete
    };
    printf("请做出你的选选择> (0,1,2,3... ...)\n");
    scanf("%d", &input);
    switch (input)
    {
    case exit:
      break;
    case storage:
      MusicStorage(&head);
      break;
    case find:
      MusicFind(head);
      break;
    case show:
      MusicShow(head);
      break;
    case modify:
      MusicModify(&head);
      break;
    case delete:
      MusicDele(&head);
      break;
    default:
      printf("你输入的选项是错误的, 请重新输入>\n");
      break;
    }
  } while (input);
  return 0;
}

立志趁早点,上路轻松点,目光放远点,苦累看淡点,努力多一点,奋斗勇一点,胜利把名点,祝你折桂冠,成功新起点,幸福多一点,笑容亮一点.

相关文章
|
机器学习/深度学习 自然语言处理 算法
【论文精读】ACL 2022:Graph Pre-training for AMR Parsing and Generation
【论文精读】ACL 2022:Graph Pre-training for AMR Parsing and Generation
|
SQL 存储 Oracle
一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法(上)
一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
DeepSeek逆天,核心是 知识蒸馏(Knowledge Distillation, KD),一项 AI 领域的关键技术
尼恩架构团队推出《LLM大模型学习圣经》系列,涵盖从Python开发环境搭建到精通Transformer、LangChain、RAG架构等核心技术,帮助读者掌握大模型应用开发。该系列由资深架构师尼恩指导,曾助力多位学员获得一线互联网企业的高薪offer,如网易的年薪80W大模型架构师职位。配套视频将于2025年5月前发布,助你成为多栖超级架构师。此外,尼恩还提供了NIO、Docker、K8S等多个技术领域的学习圣经PDF,欢迎领取完整版资源。
|
JavaScript
angular之viewChild和viewChildren
angular之viewChild和viewChildren
|
前端开发 Java API
【IDEA版】简单快速上手撸Struts框架
【IDEA版】简单快速上手撸Struts框架
633 1
|
存储 算法 安全
什么是SHA-256值
【8月更文挑战第24天】什么是SHA-256值
1408 1
|
容灾 Shell Nacos
【Seata】seata的部署和集成
一、部署Seata的tc-server 1.下载 首先我们要下载seata-server包,地址在http://seata.io/zh-cn/blog/download.html
623 0
|
弹性计算 小程序 Android开发
你信吗?有人用云电脑玩《黑神话:悟空》Mac党有福了
本教程详细介绍如何利用阿里云无影云电脑轻松畅玩《黑神话·悟空》游戏,无需下载游戏客户端,开机即可体验。首先需下载无影客户端并购买个人铂金款云电脑(14.9元首月)。随后输入WeGame版或Steam版镜像分享码并选择电竞模式进行配置。最后在云电脑内启动WeGame客户端,添加并更新游戏后即可开始游戏。请注意游戏本身需额外购买。游戏结束后记得关闭云电脑以避免额外收费。更多详情参见阿里云官方文档。
759 1
|
机器学习/深度学习 人工智能 运维
构建高效自动化运维系统:DevOps与AI的融合
【5月更文挑战第19天】 在数字化转型的浪潮中,企业IT运维面临着日益复杂的挑战。传统的手动运维方式已经无法满足快速迭代和高可靠性的需求。本文探讨了如何通过结合DevOps理念和人工智能(AI)技术,构建一个高效的自动化运维系统。文章首先回顾了DevOps的核心原则及其在自动化运维中的应用,接着分析了AI如何增强故障预测、智能决策和自动化流程的能力。最后,提出了一个综合DevOps与AI技术的自动化运维框架,并讨论了其在实际部署中的优势和潜在挑战。
|
网络协议 Java Windows
打造个人的Minecraft服务器:Java+cpolar实现我的世界联机游戏
打造个人的Minecraft服务器:Java+cpolar实现我的世界联机游戏
873 0