管理系统之KTV点歌系统
KTV点歌系统主要包括两部分,管理者界面和用户界面。管理者可以实现歌曲的录入,增加,删除,修改查找。而用户则可以实现歌曲的查找和将歌曲加入到歌单里以及删除或置顶。系统现在还不是很完整,只有管理者的功能被实现,具体代码如下
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
typedef struct NODE
{
char name[50];
char singer[40];
char lyricist[40];
char tunesmith[40];
struct node *next;
}node,*linklist;
linklist h;
linklist creat(); //链表创建
void add(linklist h); //歌曲增加
void print(linklist h); //打印
void screen(); //用户管理员选择界面
void screen1(); //用户界面
void screen2(); //管理者界面
void screen3(); //管理者查询歌曲界面
void screen4(); //管理者修改歌曲信息界面
void screen5(); //管理员删除歌曲界面
void cut1(linklist h); //管理者删除某首歌曲
void cut2(linklist h); //管理者删除某个歌名对应的所有歌曲
void cut3(linklist h); //管理者删除某个演唱者对应的所有歌曲
void find1(linklist h); //按照歌名查询歌曲
void find2(linklist h); //按照歌手查询歌曲
void change_name(linklist h,char name[],char singer[],char lyricist[],char tunesmith[]); //输入歌名歌手作词作曲修改歌名
void change_singer(linklist h,char name[],char singer[],char lyricist[],char tunesmith[]); //输入歌名歌手作词作曲修改演唱者
void change_lyricist(linklist h,char name[],char singer[],char lyricist[],char tunesmith[]); //输入歌名歌手作词作曲修改作词者
void change_tunesmith(linklist h,char name[],char singer[],char lyricist[],char tunesmith[]); //输入歌名歌手作词作曲修改作曲者
#include"KTV.h"
void screen2()
{
int x;
printf("\n\t******************************欢迎使用KTV点歌系统*****************************\n\t");
printf("* *\n\t");
printf("* XXXXXXXXXXXXXXXXXXXXXX[1.歌曲信息录入 ]XXXXXXXXXXXXXXXXXXXX *\n\t");
printf("* XXXXXXXXXXXXXXXXXXXXXX[2.歌曲增加 ]XXXXXXXXXXXXXXXXXXXX *\n\t");
printf("* XXXXXXXXXXXXXXXXXXXXXX[3.歌曲删除 ]XXXXXXXXXXXXXXXXXXXX *\n\t");
printf("* XXXXXXXXXXXXXXXXXXXXXX[4.歌曲查询 ]XXXXXXXXXXXXXXXXXXXX *\n\t");
printf("* XXXXXXXXXXXXXXXXXXXXXX[5.歌曲信息修改 ]XXXXXXXXXXXXXXXXXXXX *\n\t");
printf("* XXXXXXXXXXXXXXXXXXXXXX[6.歌曲总览 ]XXXXXXXXXXXXXXXXXXXX *\n\t");
printf("* XXXXXXXXXXXXXXXXXXXXXX[7.退出 ]XXXXXXXXXXXXXXXXXXXX *\n\t");
printf("* *\n\t");
printf("******************************************************************************\n\t");
printf("请输入1~6进行具体操作:");
scanf("%d",&x);
switch(x)
{
case 1:h=creat();system("cls");print(h);screen2();break;
case 2:system("cls");add(h);system("cls");print(h);screen2();break;
case 3:system("cls");screen5();screen2();break;
case 4:system("cls");screen3();break;
case 5:system("cls");screen4();print(h);break;
case 6:system("cls");print(h);break;
case 7:system("cls");screen();break;
default: system("cls");printf("您输入的序号有误,请重新输入!\n");screen2();
}
}
void screen()
{
int x;
printf("\n\t******************************欢迎使用KTV点歌系统*************************\n\t");
printf("* *\n\t");
printf("* *\n\t");
printf("* XXXXXXXXXXXXXXXXXXXXXX[1.用户 ]XXXXXXXXXXXXXXXXXXXX *\n\t");
printf("* XXXXXXXXXXXXXXXXXXXXXX[2.管理员 ]XXXXXXXXXXXXXXXXXXXX *\n\t");
printf("* *\n\t");
printf("* *\n\t");
printf("**************************************************************************\n\t");
printf("请输入1或2进行具体操作:");
scanf("%d",&x);
if(x==1)
{
system("cls");
screen1();
}
else
{
system("cls");
screen2();
}
}
linklist creat() //创建链表
{
int m,i; //定义一个变量m,记录要创建的歌曲的数目
linklist p,q; //h为不带头结点的链表的第一个节点
h=(linklist)malloc(sizeof(node));
h->next=NULL; //将第一个空间的指针域设为NULL
p=h; //申请一个node大小的空间 p为遍历指针
printf("\t请输入要创建的歌曲的数目:");
scanf("%d",&m);
for(i=1;i<=m;i++)
{
printf("第%d首歌:\n\t",i);
printf("请输入要录入歌曲的名字:");
scanf("%s",p->name);
printf("\n\t请输入录入歌曲的演唱者:");
scanf("%s",p->singer);
printf("\n\t请输入要录入歌曲的作词者:");
scanf("%s",p->lyricist);
printf("\n\t请输入要录入歌曲的作曲者:");
scanf("%s",p->tunesmith);
if(i!=m)
{
q=(node *)malloc(sizeof(node)); //申请一个node大小的空间为q
q->next=NULL; //将q的指针域设为NULL
p->next=q; //将p和q连在一起
p=q; //将p向后移
}
}
return h; //返回该链表头结点
}
void add(linklist h) //增加歌曲函数
{
linklist n,p,q; //定义一个linklist类型的变量m
int i,a;
p=(node *)malloc(sizeof(node)); //用n记录第二个节点
printf("\t请输入要创建的歌曲的数目:");
scanf("%d",&a);
for(i=1;i<=a;i++)
{
printf("第%d首歌:\n\t",i);
printf("请输入要录入歌曲的名字:");
scanf("%s",p->name);
printf("\n\t请输入录入歌曲的演唱者:");
scanf("%s",p->singer);
printf("\n\t请输入要录入歌曲的作词者:");
scanf("%s",p->lyricist);
printf("\n\t请输入要录入歌曲的作曲者:");
scanf("%s",p->tunesmith);
n=h->next; //用n记录原链表的第二个节点
h->next=p; //将头节点和新节点连在一起
p->next=n; //将新节点和原来的第二个节点链接组成一个新的链表
if(i!=a)
p=(node *)malloc(sizeof(node)); //申请一个node大小的空间为p
}
}
void cut1(linklist h) //将某首歌删掉
{
int d;
char chn[50]; //定义一个char型的变量chn
char chs[40];
char chl[40];
char cht[40];
linklist s,t,n;
s=h; //将头节点赋给s
printf("请输入要删除的歌的名字:");
scanf("%s",chn);
printf("请输入要删除的歌的演唱者:");
scanf("%s",chs);
printf("请输入要删除的歌的作词者:");
scanf("%s",chl);
printf("请输入要删除的歌的作曲者:");
scanf("%s",cht);
t=s; //给s赋初值以防strcmp(s->name,ch)==0时t->next没有值
if(strcmp(s->name,chn)==0&&strcmp(s->singer,chs)==0&&strcmp(s->lyricist,chl)==0&&strcmp(s->tunesmith,cht)==0) //如果if成立h=h->next,直接将第一个节点删除
h=h->next;
else //否则跳过第一个节点,开始判断第二个节点
{
s=s->next;
while(strcmp(s->name,chn)!=0&&strcmp(s->singer,chs)!=0&&strcmp(s->lyricist,chl)!=0&&strcmp(s->tunesmith,cht)!=0&&s) //从第二个开始遍历,判断是否与要删除的歌名一致,不一致就遍历
{
t=s;
s=s->next;
}
t->next=s->next; //如果一致就把t和s的下一个连接起来
}
printf("还需要继续删除吗?\n继续删除回复1,退出回复2:");
scanf("%d",&d);
if(d==1)
cut1(h);
else
screen2();
}
void cut2(linklist h) //将某个歌名对应的所有歌曲删掉
{
int d;
char chn[50]; //定义一个char型的变量chn
linklist s,t,n;
s=h; //将头节点赋给s
printf("请输入要删除的歌的名字:");
scanf("%s",chn);
t=s; //给s赋初值以防strcmp(s->name,ch)==0时t->next没有值
if(strcmp(s->name,chn)==0) //如果if成立h=h->next,直接将第一个节点删除
h=h->next;
else //否则跳过第一个节点,开始判断第二个节点
{
s=s->next;
while(strcmp(s->name,chn)!=0&&s) //从第二个开始遍历,判断是否与要删除的歌名一致,不一致就遍历
{
t=s;
s=s->next;
}
t->next=s->next; //如果一致就把t和s的下一个连接起来
}
printf("还需要继续删除吗?\n继续删除回复1,退出回复2:");
scanf("%d",&d);
if(d==1)
cut2(h);
else
screen2();
}
void cut3(linklist h) //将某个演唱者对应的所有歌曲删掉
{
int d;
char chs[50]; //定义一个char型的变量chs
linklist s,t,n;
s=h; //将头节点赋给s
printf("请输入要删除的歌的名字:");
scanf("%s",chs);
t=s; //给s赋初值以防strcmp(s->s,ch)==0时t->next没有值
if(strcmp(s->singer,chs)==0) //如果if成立h=h->next,直接将第一个节点删除
h=h->next;
else //否则跳过第一个节点,开始判断第二个节点
{
s=s->next;
while(strcmp(s->singer,chs)!=0&&s) //从第二个开始遍历,判断是否与要删除的演唱者名一致,不一致就遍历
{
t=s;
s=s->next;
}
t->next=s->next; //如果一致就把t和s的下一个连接起来
}
printf("还需要继续删除吗?\n继续删除回复1,退出回复2:");
scanf("%d",&d);
if(d==1)
cut3(h);
else
screen2();
}
void find1(linklist h) //通过歌名查询歌曲的信息
{
int s;
linklist t=h;
char a[50]; //定义一个整型变量为a,存储要查询的歌的名字
printf("\n\t请输入要查询的歌名:");
scanf("%s",a);
while(strcmp(t->name,a)==0&&t) //通过strcmp判断输入的名字和链表中的哪个节点的name值相等,相等就输出
{
printf("\n\t歌名:%s\n\t",t->name);
printf("演唱者:%s\n\t",t->singer);
printf("作词:%s\n\t",t->lyricist);
printf("作曲:%s\n\t",t->tunesmith);
t=t->next;
}
printf("还需要继续查询吗?\n继续查询回复1,退出回复2:");
scanf("%d",&s);
if(s==1)
screen3();
else
screen2();
}
void find2(linklist h) //按照歌手名查询
{
int s;
linklist t=h;
char a[40]; //定义一个整型变量为a,存储要查询的歌手的名字
printf("\n\t请输入要查询的歌手的名字:");
scanf("%s",a);
while(strcmp(t->singer,a)==0&&t) //通过strcmp判断输入的名字和链表中的哪个节点的singer值相等,相等就输出
{
printf("\n\t歌名:%s\n\t",t->name);
printf("演唱者:%s\n\t",t->singer);
printf("作词:%s\n\t",t->lyricist);
printf("作曲:%s\n\t",t->tunesmith);
t=t->next;
}
printf("还需要继续查询吗?\n继续查询回复1,退出回复2:");
scanf("%d",&s);
if(s==1)
screen3();
else
screen2();
}
void change_name(linklist h,char name[],char singer[],char lyricist[],char tunesmith[]) //修改歌名
{
char s[50];
int c;
linklist r=h;
printf("请输入修改后的歌名:");
scanf("%s",s);
while(strcmp(r->name,name)!=0&&strcmp(r->singer,name)!=0&&strcmp(r->lyricist,name)!=0&&strcmp(r->tunesmith,name)!=0&&r) //当遍历到的名字和输入要删除的名字不同
{
r=r->next; //r向后移1个
}
strcpy(r->name,s); //更改要删除的歌曲的名字
printf("还需要继续修改吗?\n继续修改回复1,退出回复2:");
scanf("%d",&s);
if(s==1)
screen4();
else
screen2();
}
void change_singer(linklist h,char name[],char singer[],char lyricist[],char tunesmith[]) //修改演唱者
{
char s[50];
linklist r=h;
printf("请输入修改后的演唱者的名字:");
scanf("%s",s);
while(strcmp(r->name,name)!=0&&strcmp(r->singer,name)!=0&&strcmp(r->lyricist,name)!=0&&strcmp(r->tunesmith,name)!=0&&r) //当遍历到的名字和输入要删除的名字不同
{
r=r->next; //r向后移1个
}
strcpy(r->singer,s); //更改要删除的演唱者的名字
printf("还需要继续修改吗?\n继续修改回复1,退出回复2:");
scanf("%d",&s);
if(s==1)
screen4();
else
screen2();
}
void change_lyricist(linklist h,char name[],char singer[],char lyricist[],char tunesmith[]) //修改作词者
{
char s[50];
linklist r=h;
printf("请输入修改后的作词者的名字:");
scanf("%s",s);
while(strcmp(r->name,name)!=0&&strcmp(r->singer,name)!=0&&strcmp(r->lyricist,name)!=0&&strcmp(r->tunesmith,name)!=0&&r) //当遍历到的名字和输入要删除的名字不同
{
r=r->next; //r向后移1个
}
strcpy(r->lyricist,s); //更改要删除的作词者的名字
printf("还需要继续修改吗?\n继续修改回复1,退出回复2:");
scanf("%d",&s);
if(s==1)
screen4();
else
screen2();
}
void change_tunesmith(linklist h,char name[],char singer[],char lyricist[],char tunesmith[]) //修改作曲者
{
char s[50];
linklist r=h;
printf("请输入修改后的作曲者的名字:");
scanf("%s",s);
while(strcmp(r->name,name)!=0&&strcmp(r->singer,name)!=0&&strcmp(r->lyricist,name)!=0&&strcmp(r->tunesmith,name)!=0&&r) //当遍历到的名字和输入要删除的名字不同
{
r=r->next; //r向后移1个
}
strcpy(r->tunesmith,s); //更改要删除的作曲者的名字
printf("还需要继续修改吗?\n继续修改回复1,退出回复2:");
scanf("%d",&s);
if(s==1)
screen4();
else
screen2();
}
void print(linklist h)
{
node *s; //定义一个新变量s
s=h; //将链表头结点赋给s
while(s)
{
printf("\n\t歌曲:%s\n\t",s->name);
printf("演唱者:%s\n\t",s->singer);
printf("作词:%s\n\t",s->lyricist);
printf("作曲:%s\n\t",s->tunesmith);
s=s->next; //遍历
}
}
void screen1()
{
int x;
printf("\n\t******************************欢迎使用KTV点歌系统*************************\n\t");
printf("* *\n\t");
printf("* XXXXXXXXXXXXXXXXXXXXXX[1.歌手点歌 ]XXXXXXXXXXXXXXXXXXXX *\n\t");
printf("* XXXXXXXXXXXXXXXXXXXXXX[2.歌名点歌 ]XXXXXXXXXXXXXXXXXXXX *\n\t");
printf("* XXXXXXXXXXXXXXXXXXXXXX[3.最热歌曲 ]XXXXXXXXXXXXXXXXXXXX *\n\t");
printf("* XXXXXXXXXXXXXXXXXXXXXX[4.歌曲总览 ]XXXXXXXXXXXXXXXXXXXX *\n\t");
printf("* XXXXXXXXXXXXXXXXXXXXXX[5.退出 ]XXXXXXXXXXXXXXXXXXXX *\n\t");
printf("* *\n\t");
printf("**************************************************************************\n\t");
printf("请输入1~4进行具体操作:");
scanf("%d",&x);
switch(x)
{
case 4:system("cls");print(h);break;
case 5:system("cls");screen();break;
default: system("cls");printf("您输入的序号有误,请重新输入!\n");screen1();
}
}
main()
{
screen();
}