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