1. 選題背景
1.1 時代背景
隨著時代的快速發(fā)展, 聽歌是人們常見的一種放松的方式. 聽歌可以使得我們進(jìn)入一個屬于自己的自由世界.
當(dāng)然, 不同的歌曲是有不一樣的屬性. 比如: 激情的歌曲會讓人進(jìn)入一個亢奮的轉(zhuǎn)態(tài), 抒情的歌曲會讓人思緒萬千… …
所以, 歌曲信息是值得存儲的, 尤其是歌手(一般歌手會有自己的一種屬性), 歌曲屬性, 這樣可以使得我們可以快速地找到最屬于自己的一份歌單1.2 程序功能
程序的主要功能就是按照歌曲屬性來存儲歌曲, 創(chuàng)建一個屬于自己的臨時歌單
(1) 首先界面出現(xiàn)提示, 選擇自己的選項進(jìn)行操作
(2) 隨后就可以進(jìn)行存儲歌曲信息, 修改歌曲信息, 刪除歌曲信息… …
2. 設(shè)計分析
2.1 menu函數(shù)
menu函數(shù) — — 完成選擇界面的打印
2.2 MusicEqual函數(shù)
MusicEqual函數(shù) — ---- 判斷兩個歌曲是否相同
2.3 BuyNode函數(shù)
BuyNode函數(shù) — — 增加新的結(jié)點
2.4 MusicShow函數(shù)
MusicShow函數(shù) ---- ---- 歌曲信息的打印
2.5 MusicStorage函數(shù)
MusicStorage函數(shù) — — 存儲歌曲信息
2.6 MusicFind函數(shù)
MusicFind函數(shù) — — 查詢歌曲位置
2.7 MusicDele函數(shù)
MusicDele函數(shù) ---- ---- 刪除歌曲信息
2.8 MusicModify函數(shù)
MusicModify函數(shù) ---- ----- 修改歌曲信息
3. 程序說明
結(jié)構(gòu)采用的是用單鏈表的形式, 其中的存放歌曲數(shù)據(jù)的data 用的也是一個結(jié)構(gòu)體類型
依托這個單鏈表的基本結(jié)構(gòu)進(jìn)行下面的增刪查改一系列的操作.
4. 關(guān)鍵代碼分析
4.1 MusicEqual && BuyNode
由于歌曲信息是一個結(jié)構(gòu)體, 屬于自定義類型, 運算符要進(jìn)行運算符重載才可以使用
所以, 在此處, 我們用的是strcmp函數(shù)來進(jìn)行比較, 利用strcpy函數(shù)來進(jìn)行拷貝4.2 MusicDele
結(jié)點的刪除是使這個結(jié)點 和 整個鏈表結(jié)構(gòu)斷開聯(lián)系, 而不是真正意義上的刪除.
所以, 我們要找到這個結(jié)點的上一個位置(除非這個鏈表是空鏈表 或者是只有一個結(jié)點)4.3 運用枚舉使Switch語句更加易懂
5. 心得體會
課程設(shè)計是培養(yǎng)學(xué)生綜合運用所學(xué)知識, 發(fā)現(xiàn), 提出, 分析和解決實際問題,鍛煉實踐能力的重要環(huán)節(jié), 是對學(xué)生實際工作能力的具體訓(xùn)練和考察過程.
隨著科學(xué)技術(shù)發(fā)展的日新日異, C語言已經(jīng)成為當(dāng)今計算機(jī)應(yīng)用中空前活躍的領(lǐng)域, 在生活中可以說得是無處不在.
這次課程設(shè)計讓我學(xué)到了很多, 不僅是鞏固了先前學(xué)的C語言的理論知識, 而且也培養(yǎng)了我的動手能力, 更令我的創(chuàng)造性思維得到拓展. 在本次的課程設(shè)計, 使我對單鏈表的機(jī)構(gòu)有了更深層次的理解與感悟. 希望我在未來的學(xué)習(xí)生活中能夠更好地應(yīng)用它.文章來源:http://www.zghlxwxcb.cn/news/detail-454146.html
源碼
# define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
typedef struct MusicInfor // 數(shù)據(jù)里面的內(nèi)容
{
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) // 增加新的節(jié)點
{
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) // 打印數(shù)據(jù)
{
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) // 存儲新的數(shù)據(jù)
{
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("該歌單是空的, 請?zhí)砑痈枨鶿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("請輸入你要修改的原數(shù)據(jù)>\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("該歌單里面并沒有你要修改的數(shù)據(jù), 請仔細(xì)檢查之后再輸入\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("| | 歡迎來到存歌環(huán)節(jié) | |\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;
}
立志趁早點,上路輕松點,目光放遠(yuǎn)點,苦累看淡點,努力多一點,奮斗勇一點,勝利把名點,祝你折桂冠,成功新起點,幸福多一點,笑容亮一點.文章來源地址http://www.zghlxwxcb.cn/news/detail-454146.html
到了這里,關(guān)于歌曲信息管理系統(tǒng)[低配版]的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!