简述
这个程序主要用到了链表,结构体,包含链表的增删查改以及对链表内容的排序,此程序还构建了多个函数,让主函数更加简单。
程序的要求
- 设计并实现一个KTV点歌程序,实现点歌功能。要求实现二级菜单:
- 初始化歌曲库。(包括歌曲的名称、演唱者)
- 已点歌曲
- 点歌
2. 点歌,显示二级菜单:
- 按照歌曲的拼音字母排序显示;
- 按照演唱者的名字排序显示
选择歌曲后将歌曲添加到已点列表。
选择3.已选歌曲,显示二级菜单:
- 显示已点歌曲
- 查询已点歌曲
- 删除已点歌曲
- 置顶
- 上移一位
头文件和全局变量
首先引用头文件,然后再写出需要的全局变量。
结构体构建
用到了两个结构体如下:
主函数
主函数较长,需要参考可以访问
主函数.txt · Steventom/大作业 - Gitee.com
菜单
显示出一级菜单二级菜单,然后选择需要哪一项功能并对其进行合法性判断
初始化歌曲库
可以访问初始化歌曲库.txt · Steventom/大作业 - Gitee.com
此过程可以对歌曲库多次输入分为添加过和未添加过两种情况。未添加过时就是正常尾插过程用两个变量struct libary* tail,* p,已经有head,让head指向空,tail指向空,对于添加过的情况利用while循环让tail和head的next指向空。下面的操作两种情况相同,输入song建立尾插链表利用while循环利用p = (struct libary*)malloc(sizeof(struct libary))给链表开辟空间,然后对p->song和p->next以及p->name进行赋值,对head进行判断对其是否指向空为判断条件,指向空时head = p,tail = p;指向的不是空时tail->next = p,tail = p;再输入song,为下一个做准备,最后返回head.
展示歌曲库
根据得到的指针head进行访问利用while循环打印出来
按歌曲名进行排序
主要用到一个冒泡排序
先利用head != NULL && p->next != NULL排除只有一个歌曲的情况,写一个冒泡排序利用中间变量tempsong,temoname为中间变量。由于歌曲是汉字所以使用了strcmp函数进行比较如果strcmp(p->song, (p->next)->song) > 0利用strcpy函数进行替换name和song,对于序号,我们可以让其保持不变,选择让歌曲和演唱者进行变换可以让序号容易得到,最后返回head.
按姓名进行排序
这一过程和按歌曲进行排序类似,只是改变了strcmp函数的比较内容,让其从比较歌曲改为比较演唱者,其余都相同。
点歌
可以访问点歌.txt · Steventom/大作业 - Gitee.com
点歌分为第一次点歌和多次点歌,此过程就是建立第二个链表,head是参数。第一次点歌时Heads指向空并让标志choose_libarycount = 0,多次点歌时由于Heads指向的不是空,利用循环让Heads->next指向空,下面的操作两种情况相同,输入song,先对其进行判断看song是否在歌曲中,在继续进行,不在从新输入。输入song建立尾插链表利用while循环利用ps = (struct choose_libary*)malloc(sizeof(struct choose_libary))给链表开辟空间,然后对ps->song和ps->next以及ps->name进行赋值,对Heads进行判断对其是否指向空为判断条件,指向空时Headss,tailss;指向的不是空时tails->nexts,tails= ps;再输入song对其进行合法性判断,为下一个做准备,最后如果choose_libarycount == 0返回Heads让choose_libarycount++,否则返回heads.
显示已点歌曲
根据指针heads利用while循环进行遍历,打印出序号,歌曲名,演唱者。
查询已点歌曲
根据指针指针heads进行遍历,利用for循环,如果歌曲在点的歌曲中打印出歌曲的序号和歌曲,否则就会输出为点播此歌曲
删除已点歌曲
可以访问删除已点歌曲.txt · Steventom/大作业 - Gitee.com
根据指针heads,先输入你想要删除的序号,对序号进行合理性判断,再利用while循环进行删除,在进行分类,删除的是第一个时和删除的不是第一个时。当删除的是第一个时需要对头指针进行移动让heads = p->next,再利用while循环调整序号;当删除的不是第一个时需要两个指针p和q,让p=heads,q=p->next,对q进行判断当q->number == number时p->next = q->next将节点断开再连接,最后调整序号返回heads。
顶置
可以访问置顶.txt · Steventom/大作业 - Gitee.com
根据指针heads先输入想要置顶的序号,对序号进行合理性判断,当置顶的不是第一个时利用for循环先让q=p->next再根据q = q->next, p = p->next进行移动让p=heads,当q->number==a时利用strcpy函数进行复制,让p->next = q->next进行断开处的连接,q->next = heads进行需要顶置处的连接; heads = q修改头指针的位置;再利用for循环修改序号,最后返回heads.
上移一位
可以访问上移一位.txt · Steventom/大作业 - Gitee.com
根据指针heads先输入想要移动的序号,对序号进行合理性判断,当移动的不是第一个时利用for循环q=p->next再根据q = q->next, p = p->next进行移动让p=heads,当a == q->number时利用strcpy函数和中间变量tempname和tempsong让替换歌曲名和演唱者,最后返回heads.
到这里此程序已经结束,希望大家一键三连