NBA球星管理系统----C语言链表带文件
这个是一个任务,倒也不是课设,简单的一个管理系统罢了,用的基本就是链表的增删改查。然后我还打了一些其他的效果。
目录
一.主函数部分
用switch语句进行选择:
用while语句,来实现重复选择:
二.功能部分
(1).页面显示
1.主页面显示
2.修改页面
3.修改里的荣誉界面
(2).录入信息
1.创建一个新的结点,并判断内存分配是否成功
2.头插法插入结点,也就是录入球星信息
(3).球星信息的显示
(4).修改球员信息
(5).查找球员信息
(6).删除信息
1.若需要删除的信息为头结点
2.若不是头结点
(7)保存信息
(8)读取信息
三.一些效果
1.加载进度条效果
2.颜色设置
3.边框的缓冲效果
头部:
尾部:
4.有字母组成的心形
先放个鸟:

一.主函数部分
用switch语句进行选择:
switch (n){case 1://录入信息()record();break;case 2://显示()show();break;case 3://修改()change();break;case 4://删除del();break;case 5://保存()save();break;
用while语句,来实现重复选择:
while (1){switch (n){case 1://录入信息()record();break;case 2://显示()show();break;case 3://修改()change();break;case 4://删除del();break;case 5://保存()save();......case n://退出return 0;}
二.功能部分
(1).页面显示
1.主页面显示
直接的print语句即可,这里我还加了sleep的效果,让界面以动态的形式出现:
void print(void)
{system("color 0E");for (int i = 0; i <= 36; i++){if (i >= 0) { printf("*"); Sleep(1); }else printf(" ");}printf("\n");Sleep(20);printf(" 欢迎使用NBA球星管理系统\n");Sleep(20);for (int i = 0; i <= 36; i++){if (i >= 0) { printf("-"); Sleep(0); }else printf(" ");}Sleep(20);printf("\n\t1.录入球星信息\n");Sleep(10);printf("\n\t2.显示球星信息\n");Sleep(10);printf("\n\t3.修改球星信息\n");Sleep(10);printf("\n\t4.删除球星信息\n");Sleep(10);printf("\n\t5.保存球星信息\n");Sleep(10);printf("\n\t6.查询球星信息\n");Sleep(10);printf("\n\t7.统计球星信息\n");Sleep(10);printf("\n\t8.读取球星信息\n");Sleep(10);printf("\n\t9.退出程序\n");Sleep(20);for (int i = 0; i <= 36; i++){if (i >= 0) { printf("-"); Sleep(0); }else printf(" ");}printf("\n");for (int i = 0; i <= 36; i++){if (i >= 0) { printf("*"); Sleep(1); }else printf(" ");}printf("\n");
}
加入for循环可以使边框以动态的形式出现。
2.修改页面
void printxiugai(void)
{system("color 0E");for (int i = 0; i <= 36; i++){if (i >= 0) { printf("*"); Sleep(1); }else printf(" ");}printf("\n");Sleep(20);printf(" 欢迎使用NBA球星管理系统\n");Sleep(20);for (int i = 0; i <= 36; i++){if (i >= 0) { printf("-"); Sleep(0); }else printf(" ");}printf("\n\n");printf(" 1.姓名 2.年龄 3.位置\n 4.号码 5.最高 6.荣誉\n 7.顺位 8.球队 9.年份 \n\n");wei();
}
3.修改里的荣誉界面
void printrongyu(void)
{tou();Sleep(20);printf(" 1.mvp数 2.fmvp数 3.总冠军数\n 4.得分王数\n\n");Sleep(20);wei();printf("\n\n");
}
(2).录入信息
1.创建一个新的结点,并判断内存分配是否成功
Node* pNew=(Node*)malloc(sizeof(Node));if (pNew == NULL){printf("内存分配失败");return NULL;}pNew->pnext = NULL;
2.头插法插入结点,也就是录入球星信息
if (g_phead == NULL){g_phead = pNew;}else{pNew ->pnext = g_phead;g_phead = pNew;}printf("请输入球星的编号:\n");scanf("%d", &pNew->pla.bianhao);printf("请输入球星姓名:\n");scanf("%s", pNew->pla.name);printf("请输入球星年龄(若不知则填521):\n");scanf("%d", &pNew->pla.age);printf("请输入球星的位置(若不知则填521):\n");scanf("%s", &pNew->pla.weizhi);printf("请输入球星的号码(若不知则填521):\n");scanf("%d", &pNew->pla.num);printf("请输入球星的最高分(若不知则填521):\n");scanf("%d", &pNew->pla.most);printf("是否继续录入球星选秀信息?(按 1 继续)):\n");scanf("%d", &m);if (m == 1){printf("请输入球星的选秀年份(若不知则填未知):\n");scanf("%s",pNew->pla.year);printf("请输入球星的选秀顺位(若不知则填未知):\n");scanf("%s", pNew->pla.wei);printf("请输入球星的选秀球队(若不知则填未知):\n");scanf("%s", pNew->pla.dui);}else{strcpy(pNew->pla.year,"未知");strcpy(pNew->pla.wei,"未知");strcpy(pNew->pla.dui ,"未知");}printf("是否继续录入球星荣誉?(按 1 继续)):\n");scanf("%d",&t);if (t == 1){printf("请输入球星获得的总冠军数(若不知则填未知):\n");scanf("%s", pNew->pla.guan);printf("请输入球星获得的mvp数(若不知则填未知):\n");scanf("%s", pNew->pla.mvp);printf("请输入球星获得的fmvp数(若不知则填未知):\n");scanf("%s", pNew->pla.fmvp);printf("请输入球星获得的得分王数(若不知则填未知):\n");scanf("%s", pNew->pla.scores);}else{strcpy(pNew->pla.guan,"未知");strcpy(pNew->pla.mvp, "未知");strcpy(pNew->pla.fmvp, "未知");strcpy(pNew->pla.scores, "未知");}printf("球星信息录入成功.\n");
(3).球星信息的显示
遍历一遍链表即可:
Node* p = g_phead;while (p != NULL){printf("球星的编号:\n");printf("%d", p->pla.bianhao);printf("\n");printf(" *\t姓名\t*\t年龄\t*\t位置\t*\t号码\t\n");printf(" *\t%s\t*\t%d\t*\t%s\t*\t%d\t\n\n",p->pla.name,p->pla.age,p->pla.weizhi,p->pla.num);Sleep(20);printf(" *\t最高\t*\t年份\t*\t顺位\t*\t球队\t\n");printf(" *\t%d\t*\t%s\t*\t%s\t*\t%s\t\n\n",p->pla.most,p->pla.year,p->pla.wei,p->pla.dui);Sleep(20);printf(" *\t总冠军\t*\tmvp\t*\tfmvp\t*\t得分王\t\n");printf(" *\t%s\t*\t%s\t*\t%s\t*\t%s\t\n\n\n",p->pla.guan,p->pla.mvp,p->pla.fmvp,p->pla.scores);Sleep(20);p = p -> pnext;printf("\n");}
(4).修改球员信息
对应的是链表的修改,用while循环来找到需要修改的信息,对此结点进行修改
Node* p = g_phead;while (p != NULL){if (p->pla.bianhao == hao ){printxiugai();printf("请输入需要修改的球员信息:\n");scanf("%d", &t);if (t != 6){switch (t){case 1://姓名printf("请输入修改后球星的姓名:\n");scanf("%s",p -> pla.name);break;case 2://年龄printf("请输入修改后球星的年龄:\n");scanf("%d",&p -> pla.age);break;case 3://位置printf("请输入修改后球星的位置:\n");scanf("%s",p->pla.weizhi);break;case 4://号码printf("请输入修改后球星的号码:\n");scanf("%d",& p->pla.num);break;case 5://最高分printf("请输入修改后球星的最高分:\n");scanf("%d",&p->pla.most);break;case 7://顺位printf("请输入修改后球星的顺位:\n");scanf("%s", p->pla.wei);break;case 8://球队printf("请输入修改后球星的球队:\n");scanf("%s", p->pla.dui);break;case 9://年份printf("请输入修改后球星的年份:\n");scanf("%s", p->pla.year);break;}}else{printrongyu();printf("请输入要修改的球星的荣誉:\n");scanf("%d",&m);switch (m){case 1://mvpprintf("请输入数字:\n");scanf("%s",p -> pla.mvp);break;case 2://fmvpprintf("请输入数字:\n");scanf("%s", p->pla.fmvp);break;case 3://总冠军printf("请输入数字:\n");scanf("%s", p->pla.guan);break;case 4://得分王printf("请输入数字:\n");scanf("%s", p->pla.scores);break;}}printf("修改成功。\n");shu += 1;}p = p -> pnext;}
(5).查找球员信息
同样是利用while循环来遍历链表进行查找:
Node* p = g_phead;//定义一个指向头结点的指针while (p != NULL){if ( p->pla.bianhao == hao || 0 == strcmp(p->pla.name,xingming) ){return p;}p = p->pnext;}
(6).删除信息
删除信息就是释放这个信息所在的空间
1.若需要删除的信息为头结点
直接删除,因为不许用一个新的结点进行连接:
if (g_phead->pla.bianhao == hao){p1 = g_phead;g_phead = g_phead->pnext;free(g_phead);printf("删除成功。\n");system("pause");system("cls");return;}
2.若不是头结点
需要一个新的结点连接前后
Node* p,*p2;p = g_phead;p2 = p->pnext;while (p2 !=NULL){if(p2->pla.bianhao==hao){p->pnext=p2->pnext;free(p2);//释放空间,进行删除p2 = p->pnext;printf("删除成功。\n");wei();system("pause");system("cls");return;}else{p = p->pnext;p2 = p2->pnext;}}
(7)保存信息
新建一个文件,将数据保存进去
void save()
{tou();//打开创建文件FILE* fp;fp=fopen("D:\\manage.txt","w");//以写的形式打开文件if (fp == NULL){printf("打开文件失败。\n\n");return;}//遍历链表Node* p = g_phead;while (p!=NULL){fwrite(&p->pla,1,sizeof(player),fp);//一次以player读取一个p=p->pnext;}//关闭文件fclose(fp); //打开的文件用完后一定需要关闭printf("保存文件成功。\n\n");system("pause");system("cls");
}
(8)读取信息
保存了文件,就要将文件读取出来。
保存文件时用的是以写的形式打开,读取文件就需要以读的形式打开,再利用头插法,将数据添加到链表中。
void read()
{tou();//打开文件FILE* fp;fp=fopen("D:\\manage.txt","r");if (fp == NULL){printf("打开文件失败。\n\n");return;}//读取文件player pla; //定义一下plawhile (fread(&pla, sizeof(player), 1, fp))//先读一下结点有无元素,之后再判断{//创建一个新的结点,分配内存Node* pNew = (Node*)malloc(sizeof(Node));pNew -> pnext = NULL;memcpy(pNew, &pla,sizeof(player));//头插法插入结点if (g_phead == NULL){g_phead = pNew;}else{pNew->pnext = g_phead;g_phead = pNew;}}printf("加载数据成功.\n\n");//关闭文件fclose(fp);system("pause");system("cls");}
三.一些效果
1.加载进度条效果
void huanchong(void)
{int i;for (i = 1; i <= 20; i++){SetColor(0, 15);printf(" ");printf("%d%%", 5 * i);Sleep(101 - 5 * i);printf("\b\b\b");}SetColor(15, 0);
}
2.颜色设置
//颜色设置()
void SetColor(unsigned short ForeColor, unsigned short BackGroundColor)
{HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(hCon, (ForeColor % 16) | (BackGroundColor % 16 * 16));
}
使用:
SetColor(0, 15);
其中
3.边框的缓冲效果
头部:
void tou()
{system("color 0E");for (int i = 0; i <= 36; i++){if (i >= 0){printf("*");Sleep(1);}else printf(" ");}printf("\n");Sleep(20);printf(" 欢迎使用NBA球星管理系统\n");Sleep(20);for (int i = 0; i <= 36; i++){if (i >= 0){printf("-");Sleep(0);}else printf(" ");}printf("\n\n");
}
尾部:
void wei()
{for (int i = 0; i <= 36; i++){if (i >= 0){printf("-");Sleep(0);}else printf(" ");}printf("\n");for (int i = 0; i <= 36; i++){if (i >= 0){printf("*");Sleep(1);}else printf(" ");}printf("\n\n");
}
4.有字母组成的心形
void pyx()
{int s=0;float x, y;for (x = 1.3; x >= -1.1; x -= 0.1){for (y = -2; y <= 1.4; y += 0.053){if (pow(x * x + y * y - 1, 3) - x * x * x * y * y <= 0){s++;if (s % 4 == 1)printf("p");if (s % 4 == 2)printf("y");if (s % 4 == 3)printf("x");if (s % 4 == 0)printf("^");Sleep(0.99);}elseprintf(" ");}printf("\n");}
}
效果:
完整的源码我已经放到gitee上了,想看的话可以看一下:
管理系统 · DHPYX/DHPYX - 码云 - 开源中国 (gitee.com)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
