一、前言
这个是本学期末我的数据结构课程设计,有三个版本分别是C语言版本、Java版本以及JavaWeb版本。实现的功能基本上是相同的,即对球队成员的增、删、改、查功能。应用背景为学校球队类社团,结合数据库或者文件输入输出的形式,来储存球队人员的信息。
二、数据结构描述
2.1 数据结构和存储结构
1.链表
链表就是线性表的链式存储方式。链表的内存是不连续的,前一个元素存储地址的下一个地址中存储元素的比一定是下一个元素。这里采用的是单链表,单链表是最简单的链表形式,链表中的最基本元素的数据称为节点,每个节点都包含了数据块和指向下一个节点的指针。优点是1.元素的存储单元是任意的,可以连续也可以不连续 2.不需要限定长度。
2.结构体数组
结构体是由一系列具有相同类型或不同类型的数据构成的数组集合结构,是一种可以自定义的数据类型,数组中的每一个元素都是一个结构体。结构体可以在一个中存储不同的数据类型,并将它们联系起来。结构体数组可以连续存储多个机构体,和数组作用相似.
2.2 主要算法
1. 冒泡排序
冒泡排序是一种简单的排序算法,同时也是一种稳定的排序算法。原理是重复扫描待排序序列,比较每一个相邻的元素,当该元素顺序不正确时进行交换,一直重复这个过程,直到没有任何两个相邻元素可以交换。
2. 顺序查找
顺序查找算法是按照序列原有顺序对数组进行遍历比较查询的基本算法。实现较简单。
三、系统主要功能的实现
3.1 查询球员
采用顺序查找的方法,根据球员编号或者姓名进行查询。使用findply(LinkList *L)来实现,首先会提示用户选择编号查询或者按照姓名查找,使用的是顺序查找,对从存储球员信息的Player.txt文件进行读取和遍历。
void findply(LinkList *L)//按编号或者姓名查找球员并输出该球员信息
{
int flag;
printf("1.按编号查询:\n");
printf("2.按姓名查询:\n");
printf("请输入查询方式:");
scanf("%d",&flag);
if(flag==1){
printf("请输入该球员编号:");
scanf("%s",id);
//判断
LinkList *q=L->next;
while(q!=NULL )
{
if(strcmp(q->data.ID,id)==0)
{
printf("学号:%s\n",q->data.ID);
printf("姓名:%s\n",q->data.NAME);
printf("性别:%s\n",q->data.SEX);
printf("年龄:%d\n",q->data.AGE);
printf("班级:%s\n",q->data.CLASS);
printf("电话:%s\n",q->data.PHONE);
printf("表现:%s\n",q->data.PERFORMANCE);
printf("评级:%s\n",q->data.GRADE);
break;
}
q=q->next;
}
if(q==NULL)
printf("该球员不存在\n");
}else{
printf("请输入该球员姓名:");
scanf("%s",name);
LinkList *q=L->next;
while(q!=NULL)
{
if(strcmp(q->data.NAME,name)==0)
{
printf("编号:%s\n",q->data.ID);
printf("姓名:%s\n",q->data.NAME);
printf("性别:%s\n",q->data.SEX);
printf("年龄:%d\n",q->data.AGE);
printf("班级:%s\n",q->data.CLASS);
printf("电话:%s\n",q->data.PHONE);
printf("表现:%s\n",q->data.PERFORMANCE);
printf("评级:%s\n",q->data.GRADE);
break;
}
q=q->next;
}
if(q==NULL)
printf("该球员不存在\n");
}
}
3.2 球员信息修改
每次比完赛之后球员的表现都需要进行修改,或者当球员基本信息发生变化时也需要进行修改。通过changeply(LinkList *L)来实现,首先提示用户输入需要修改的球员编号,选择要修改的属性,然后用strcpy()函数将输入的数据保存到对应球员的属性中,保存成功后会提示“保存成功!”然后会返回目录界面进行下一步操作。
void changeply(LinkList *L)//改变球员信息
{
int judge=0;
printf("请输入您要修改球员的编号:\n");
scanf("%s",id);
LinkList *q=L->next;
while(q!=NULL )
{
if(0==strcmp(q->data.ID,id))
{
judge=1;
printf("请输入您要修改的信息选项:1.姓名 2.性别 3.年龄 4.班级 5.电话 6.表现 7.评级 \n");
int choose;
scanf("%d",&choose);
switch(choose)
{
case 1:
printf("请输入您要修改的名字:");
scanf("%s",name);
printf("修改的名字为:%s\n",name);
strcpy(q->data.NAME,name);
printf("修改名字成功!\n");
break;
case 2:
printf("请输入您要修改的性别:");
scanf(" %s\n",sex);
printf("修改的性别为:%s\n",sex);
strcpy(q->data.SEX,sex);
printf("修改性别成功!\n");
break;
case 3:
printf("请输入您要修改的年龄:");
scanf("%d",&age);
printf("修改的年龄为:%d\n",age);
q->data.AGE=age;
printf("修改年龄成功!\n");
break;
case 4:
printf("请输入您要修改的班级:");
scanf(" %s\n",cla);
printf("修改的班级为:%s\n",cla);
strcpy(q->data.CLASS,cla);
printf("修改班级成功!\n");
break;
case 5:
printf("请输入您要修改的电话: ");
scanf(" %s\n",phone);
printf("修改的电话为:%s\n",phone);
strcpy(q->data.PHONE,phone);
printf("修改电话成功!\n");
break;
case 6:
printf("请输入您要修改的表现: ");
scanf(" %s\n",performance);
printf("修改的表现为:%s\n",performance);
strcpy(q->data.PERFORMANCE,performance);
printf("修改表现成功!\n");
break;
case 7:
printf("请输入您要修改的评级: ");
scanf(" %s\n",grade);
printf("修改的评级为:%s\n",grade);
strcpy(q->data.GRADE,grade);
printf("修改评级成功!\n");
break;
default :
printf("请输入正确的选项\n");
break;
}
}
q=q->next;
}
if(judge==0)
{
printf("该球员不存在\n");
}
}
3.3 球员信息排序
这里用函数sort(LinkList *L)来实现,主要是对保存的信息按照年龄大小或者球员评级表现进行排序。采用冒泡排序的方法进行排序,易于实现。
void sort(LinkList *L)//按年龄进行排序或者按照评级排序 并输出排序后的结果
{
LinkList *q,*p,*r=L->next;
p=r;
q=r->next;
LinkList *tmp;//用于排序时暂存节点
InitList(tmp);
printf("请输入要排序的方式: 1.按年龄 2.按评级 \n");
int choose=0;
scanf("%d",&choose);
switch (choose) {
case 1:
while(r) //两层循环完成排序
{
while(q)
{
if(q->data.AGE < p->data.AGE) //年龄由小到大
{
tmp->data = p->data;
p->data=q->data;
q->data=tmp->data;
}
q=q->next;
}
r=r->next;
}
break;
case 2:
while(r) //两层循环完成排序
{
while(q)
{
if(strcmp(q->data.GRADE,p->data.GRADE)<0)
{
tmp->data = p->data;
p->data=q->data;
q->data=tmp->data;
}
q=q->next;
}
r=r->next;
}
break;
default:
//TODO
break;
}
printf("刷新后的球员信息是:\n");
display(L);
}
3.4 球员信息的保存
在操作过程中系统操作的信息是将球员信息读取到内存中,用内存中的数据进行修改,但实际在文件中的数据并未发生改变,因此需要savePlayDentFile(LinkList 8 *&L)函数进行球员的保存。
void savePlyDentFile(LinkList *&L)//保存球员信息到文件
{
FILE *fp;
LinkList *p=L->next;
if((fp=fopen("Player.txt","w"))==NULL)// 以可写的方式打开当前目录下的.txt
{
printf("不能打开此文件,请按任意键退出\n");
exit(1); //异常退出
}
while(p)
{
fprintf(fp,"%s %s %s %d %s %s %s %s\n",p->data.ID,p->data.NAME,p->data.SEX,p->data.AGE,p->data.CLASS,p->data.PHONE,p->data.PERFORMANCE,p->data.GRADE);
p=p->next;
}
printf("保存成功\n");
fclose(fp);
}
在这里采用这种方法,可以保证系统输出的文字内容和文件中保存的信息内容一致,不会发生乱码现象。同时在使用时需要提前新建好球员的信息文件Player.txt,在未有该文件的情况下运行系统,只会提示找不到文件。
3.5 读取球员信息
与存储对应的就是读取,有了存储球员信息的函数自然会有读取球员信息的函数,readplyDentput(LinkList *&L)利用fopen()将文件打开并读取其中的数据。
void readPlyDentput (LinkList *&L) //运行前把文件内容读取到电脑内存
{
FILE *fp;
fp=fopen("Player.txt","rb"); //以只读方式打开当前目录下的.txt
if(fp==NULL)
{
printf("文件不存在\n");
exit(0); //终止程序
}
int i=0;
while(!feof(fp))
{
char id[100]; //编号
char name[100]; //姓名
char sex[5]; //性别
int age; //年龄
char cla[100]; //班级
char phone[100]; //电话
char performance[100];//表现
char grade[100]; //评级
fscanf(fp," %s %s %s %d %s %s %s %s",id,name,sex,&age,cla,phone,performance,grade);
i++;
}
fclose(fp);
FILE *FP;
FP=fopen("Player.txt","rb"); //以只读方式打开当前目录下的.txt
if(FP==NULL)
{
printf("无法打开文件\n");
exit(0); //终止程序
}
int b=i-1;
int j=1;
while(!feof(FP))
{
fscanf(FP," %s %s %s %d %s %s %s %s",id,name,sex,&age,cla,phone,performance,grade);
LinkList *n=(LinkList *)malloc(sizeof(LinkList));
strcpy(n->data.ID,id);//把后者的内容拷贝到前者中
strcpy(n->data.NAME,name);//把后者的内容拷贝到前者中
strcpy(n->data.SEX,sex);
n->data.AGE=age;
strcpy(n->data.CLASS,cla);
strcpy(n->data.PHONE,phone);
strcpy(n->data.PERFORMANCE,performance);
strcpy(n->data.GRADE,grade);
ListInsert(L,n);//插入新的节点
n=n->next;
if(j==b)
break;
j++;
}
fclose(FP); //关闭文件
}
函数中需要建立多个数组用于保存球员相应的信息,使用fscanf()将信息读取到数组当中,再将读取的数据放入到链表中,这里使用的字符串复制strcpy()函数。
四、完整代码
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
#include <fstream>
#include <conio.h>
#define USER_MAX 20
typedef struct Player
{
char ID[100]; //编号
char NAME[100]; //姓名
char SEX[5]; //性别
int AGE; //年龄
char CLASS[100]; //班级
char PHONE[100]; //电话
char PERFORMANCE[100];//表现
char GRADE[100]; //评分
}ply;
typedef struct User{
char name[50];
char password[50];
}user;
typedef struct LNode
{
ply data;
struct LNode *next;
}LinkList;
char id[100]; //编号
char name[100]; //姓名
char sex[5]; //性别
int age; //年龄
char cla[100]; //班级
char phone[100]; //电话
char performance[100];//表现
char grade[100]; //评级
User list[USHRT_MAX];
//定义一个全局数组,类型是User,大小是USER_MAX
void login();//登录
void menu();/* 菜单界面*/
void help();/*帮助界面*/
void InitList(LinkList *&L);//初始化链表
void ListInsert(LinkList *&L,LinkList *p);//插入新的节点
void addply(LinkList *&L);//增加新的球员
void deleteply(LinkList *L);//删除球员
void changeply(LinkList *L);//改变球员信息
void findply(LinkList *L);//按编号或者姓名查找球员并输出该球员信息
void display(LinkList *&L);//浏览全部球员信息
void sort(LinkList *L);//按年龄排序排序 并输出排序后的结果
void savePlyDentFile(LinkList *&L);//保存球员信息到文件
void readPlyDentput (LinkList *&L); //运行前把文件内容读取到电脑内存
void menu1();
int main(){
LinkList *L;
InitList(L);
readPlyDentput (L); //运行前把文件内容读取到电脑
menu1(); //功能菜单
}
void menu()/* 菜单界面*/
{
LinkList *L;
InitList(L);
readPlyDentput (L); //运行前把文件内容读取到电脑
//1.打印菜单
//2.输入菜单
//3.switch菜单选择
int choose;
do{
printf("\t\t\t ******************************************************\n\n");
printf("\t\t\t * 学生信息管理系统 * \n\n");
printf("\t\t\t ******************************************************\n\n");
printf("\t\t\t*********************系统功能菜单*************************\n");
printf("\t\t\t ---------------------- ---------------------- \n");
printf("\t\t\t ********************************************* \n");
printf("\t\t\t * 0.系统帮助 * * 1.对球员进行排序 * \n");
printf("\t\t\t ********************************************* \n");
printf("\t\t\t * 2.查询球员 * * 3.修改球员 * \n");
printf("\t\t\t ********************************************* \n");
printf("\t\t\t * 4.增加球员 * * 5.删除球员 * \n");
printf("\t\t\t ********************************************* \n");
printf("\t\t\t * 6.显示全部球员 * * 7.保存球员信息* \n");
printf("\t\t\t ********************** ********************** \n");
printf("\t\t\t * 8.退出系统 * \n");
printf("\t\t\t ********************** \n");
printf("\t\t\t ---------------------- ---------------------- \n");
printf("选择你需要的功能:");
scanf("%d",&choose);
switch(choose)
{
case 0://系统帮助及说明
system("cls");
help();
break;
case 1://刷新信息(按编号排序)
system("cls");
sort(L);
break;
case 2: //查询球员信息
system("cls");
findply(L);
break;
case 3://修改球员信息
system("cls");
changeply(L);
break;
case 4://增加球员信息
system("cls");
addply(L);
break;
case 5://删除球员信息
system("cls");
deleteply(L);
break;
case 6://输出所有球员的信息
display(L);
break;
case 7://保存球员信息到文件
system("cls");
savePlyDentFile(L);
break;
case 8://退出
printf("谢您已经成功退出系统,欢迎您下次再次使用");
exit(0);
default:
system("cls");
printf("请输入正确的选择\n");
break;
}
}while(choose != 8);
}
void help()/*帮助界面*/
{
printf("\n\t\t\t0.欢迎使用系统帮助!\n");
printf("\n\t\t\t1.初次进入系统后,请先选择增加球员信息;\n");
printf("\n\t\t\t2.按照菜单提示键入数字代号;\n");
printf("\n\t\t\t3.增加球员信息后,需要保存;\n");
printf("\n\t\t\t4.谢谢您的使用!\n");
}
void InitList(LinkList *&L)//初始化链表
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
void ListInsert(LinkList *&L,LinkList *p)//插入新的节点
{
LinkList *q=NULL;
q=L;
p->next=q->next;
q->next=p;
}
void addply(LinkList *&L)//增加新的球员
{
char continute;
do{
printf("请输入球员的信息:\n");
printf("编号:");
scanf("%s",id);
LinkList *q=L->next;
while(q!=NULL ) //用于判断球员信息是否已经存在
{
if(0==strcmp(q->data.ID,id))
{
printf("该球员已存在\n");
break;
}
q=q->next;
}
if(q==NULL)
{
LinkList *p;
InitList(p);
strcpy(p->data.ID,id);
printf("姓名:") ;
scanf("%s",name) ;
strcpy(p->data.NAME,name);
printf("性别:");
scanf(" %s",sex);
strcpy(p->data.SEX,sex);
printf("年龄:");
scanf("%d",&age);
p->data.AGE=age;
printf("班级:") ;
scanf("%s",cla) ;
strcpy(p->data.CLASS,cla);
printf("电话:") ;
scanf("%s",phone) ;
strcpy(p->data.PHONE,phone);
printf("表现:") ;
scanf("%s",performance) ;
strcpy(p->data.PERFORMANCE,performance);
printf("评级:") ;
scanf("%s",grade) ;
strcpy(p->data.GRADE,grade);
ListInsert(L,p);
printf("保存成功!");
}
printf("是否继续添加(y/n): \n");
scanf("%s",&continute);
}while(continute=='y');
}
void deleteply(LinkList *L)//删除球员
{
printf("请输入您要删除的球员编号:");
scanf("%s",id);
//判断
LinkList *p,*pre;
if(L->next==NULL)
{
printf("还没有球员信息,请增加球员信息\n");
return;
}
pre=L;
p=pre->next;
int judge=0;
while(p)
{
printf("该球员的信息如下:");
if(strcmp(p->data.ID,id)==0)
{
printf("学号:%s\n",p->data.ID);
printf("姓名:%s\n",p->data.NAME);
printf("性别:%s\n",p->data.SEX);
printf("年龄:%d\n",p->data.AGE);
printf("班级:%s\n",p->data.CLASS);
printf("电话:%s\n",p->data.PHONE);
printf("表现:%s\n",p->data.PERFORMANCE);
printf("评级:%s\n",p->data.GRADE);
}
printf("是否确定删除 (y/n)");
char choose;
scanf("%s",&choose);
if(choose=='y'){
if(0==strcmp(p->data.ID,id))
{
judge=1;
pre->next =p->next;
free(p);
printf("删除球员成功\n");
break;
}
}
pre=p;
p=p->next;
}
if(judge==0)
printf("这个球员不存在\n");
}
void changeply(LinkList *L)//改变球员信息
{
int judge=0;
printf("请输入您要修改球员的编号:\n");
scanf("%s",id);
LinkList *q=L->next;
while(q!=NULL )
{
if(0==strcmp(q->data.ID,id))
{
judge=1;
printf("请输入您要修改的信息选项:1.姓名 2.性别 3.年龄 4.班级 5.电话 6.表现 7.评级 \n");
int choose;
scanf("%d",&choose);
switch(choose)
{
case 1:
printf("请输入您要修改的名字:");
scanf("%s",name);
printf("修改的名字为:%s\n",name);
strcpy(q->data.NAME,name);
printf("修改名字成功!\n");
break;
case 2:
printf("请输入您要修改的性别:");
scanf(" %s\n",sex);
printf("修改的性别为:%s\n",sex);
strcpy(q->data.SEX,sex);
printf("修改性别成功!\n");
break;
case 3:
printf("请输入您要修改的年龄:");
scanf("%d",&age);
printf("修改的年龄为:%d\n",age);
q->data.AGE=age;
printf("修改年龄成功!\n");
break;
case 4:
printf("请输入您要修改的班级:");
scanf(" %s\n",cla);
printf("修改的班级为:%s\n",cla);
strcpy(q->data.CLASS,cla);
printf("修改班级成功!\n");
break;
case 5:
printf("请输入您要修改的电话: ");
scanf(" %s\n",phone);
printf("修改的电话为:%s\n",phone);
strcpy(q->data.PHONE,phone);
printf("修改电话成功!\n");
break;
case 6:
printf("请输入您要修改的表现: ");
scanf(" %s\n",performance);
printf("修改的表现为:%s\n",performance);
strcpy(q->data.PERFORMANCE,performance);
printf("修改表现成功!\n");
break;
case 7:
printf("请输入您要修改的评级: ");
scanf(" %s\n",grade);
printf("修改的评级为:%s\n",grade);
strcpy(q->data.GRADE,grade);
printf("修改评级成功!\n");
break;
default :
printf("请输入正确的选项\n");
break;
}
}
q=q->next;
}
if(judge==0)
{
printf("该球员不存在\n");
}
}
void findply(LinkList *L)//按编号或者姓名查找球员并输出该球员信息
{
int flag;
printf("1.按编号查询:\n");
printf("2.按姓名查询:\n");
printf("请输入查询方式:");
scanf("%d",&flag);
if(flag==1){
printf("请输入该球员编号:");
scanf("%s",id);
//判断
LinkList *q=L->next;
while(q!=NULL )
{
if(strcmp(q->data.ID,id)==0)
{
printf("学号:%s\n",q->data.ID);
printf("姓名:%s\n",q->data.NAME);
printf("性别:%s\n",q->data.SEX);
printf("年龄:%d\n",q->data.AGE);
printf("班级:%s\n",q->data.CLASS);
printf("电话:%s\n",q->data.PHONE);
printf("表现:%s\n",q->data.PERFORMANCE);
printf("评级:%s\n",q->data.GRADE);
break;
}
q=q->next;
}
if(q==NULL)
printf("该球员不存在\n");
}else{
printf("请输入该球员姓名:");
scanf("%s",name);
LinkList *q=L->next;
while(q!=NULL)
{
if(strcmp(q->data.NAME,name)==0)
{
printf("编号:%s\n",q->data.ID);
printf("姓名:%s\n",q->data.NAME);
printf("性别:%s\n",q->data.SEX);
printf("年龄:%d\n",q->data.AGE);
printf("班级:%s\n",q->data.CLASS);
printf("电话:%s\n",q->data.PHONE);
printf("表现:%s\n",q->data.PERFORMANCE);
printf("评级:%s\n",q->data.GRADE);
break;
}
q=q->next;
}
if(q==NULL)
printf("该球员不存在\n");
}
}
void display(LinkList *&L)//浏览全部球员信息
{
LinkList *q=L->next;
if(q==NULL)
{
printf("还没有球员信息,请增加球员信息\n");
return;
}
while(q)
{
printf("学号:%s\n",q->data.ID);
printf("姓名:%s\n",q->data.NAME);
printf("性别:%s\n",q->data.SEX);
printf("年龄:%d\n",q->data.AGE);
printf("班级:%s\n",q->data.CLASS);
printf("电话:%s\n",q->data.PHONE);
printf("表现:%s\n",q->data.PERFORMANCE);
printf("评级:%s\n",q->data.GRADE);
q=q->next;
}
}
void sort(LinkList *L)//按年龄进行排序或者按照评级排序 并输出排序后的结果
{
LinkList *q,*p,*r=L->next;
p=r;
q=r->next;
LinkList *tmp;//用于排序时暂存节点
InitList(tmp);
printf("请输入要排序的方式: 1.按年龄 2.按评级 \n");
int choose=0;
scanf("%d",&choose);
switch (choose) {
case 1:
while(r) //两层循环完成排序
{
while(q)
{
if(q->data.AGE < p->data.AGE) //年龄由小到大
{
tmp->data = p->data;
p->data=q->data;
q->data=tmp->data;
}
q=q->next;
}
r=r->next;
}
break;
case 2:
while(r) //两层循环完成排序
{
while(q)
{
if(strcmp(q->data.GRADE,p->data.GRADE)<0)
{
tmp->data = p->data;
p->data=q->data;
q->data=tmp->data;
}
q=q->next;
}
r=r->next;
}
break;
default:
//TODO
break;
}
printf("刷新后的球员信息是:\n");
display(L);
}
void savePlyDentFile(LinkList *&L)//保存球员信息到文件
{
FILE *fp;
LinkList *p=L->next;
if((fp=fopen("Player.txt","w"))==NULL)// 以可写的方式打开当前目录下的.txt
{
printf("不能打开此文件,请按任意键退出\n");
exit(1); //异常退出
}
while(p)
{
fprintf(fp,"%s %s %s %d %s %s %s %s\n",p->data.ID,p->data.NAME,p->data.SEX,p->data.AGE,p->data.CLASS,p->data.PHONE,p->data.PERFORMANCE,p->data.GRADE);
p=p->next;
}
printf("保存成功\n");
fclose(fp);
}
void readPlyDentput (LinkList *&L) //运行前把文件内容读取到电脑内存
{
FILE *fp;
fp=fopen("Player.txt","rb"); //以只读方式打开当前目录下的.txt
if(fp==NULL)
{
printf("文件不存在\n");
exit(0); //终止程序
}
int i=0;
while(!feof(fp))
{
char id[100]; //编号
char name[100]; //姓名
char sex[5]; //性别
int age; //年龄
char cla[100]; //班级
char phone[100]; //电话
char performance[100];//表现
char grade[100]; //评级
fscanf(fp," %s %s %s %d %s %s %s %s",id,name,sex,&age,cla,phone,performance,grade);
i++;
}
fclose(fp);
FILE *FP;
FP=fopen("Player.txt","rb"); //以只读方式打开当前目录下的.txt
if(FP==NULL)
{
printf("无法打开文件\n");
exit(0); //终止程序
}
int b=i-1;
int j=1;
while(!feof(FP))
{
fscanf(FP," %s %s %s %d %s %s %s %s",id,name,sex,&age,cla,phone,performance,grade);
LinkList *n=(LinkList *)malloc(sizeof(LinkList));
strcpy(n->data.ID,id);//把后者的内容拷贝到前者中
strcpy(n->data.NAME,name);//把后者的内容拷贝到前者中
strcpy(n->data.SEX,sex);
n->data.AGE=age;
strcpy(n->data.CLASS,cla);
strcpy(n->data.PHONE,phone);
strcpy(n->data.PERFORMANCE,performance);
strcpy(n->data.GRADE,grade);
ListInsert(L,n);//插入新的节点
n=n->next;
if(j==b)
break;
j++;
}
fclose(FP); //关闭文件
}
int pd(User signin)
{
FILE *fp1;
User member;
int flag=2;
fp1 = fopen("User.txt","rt");
if(fp1==NULL){
printf("\t输入无效,按任意键返回注册!\n");
getch();
exit(1);
}
while (fscanf(fp1, "%s", member.name) != EOF)
{
if (strcmp(signin.name, member.name) == 0)
{
flag = 0;
break;
}
else if (strcmp(signin.name, member.name) != 0)
{
flag = 1;
continue;
}
}
if (flag == 0)
{
return 0;
}
else if (flag == 1)
{
return 1;
}
else if (flag == 2)
{
return 1;
}
}
void sign()
{
User signin;
FILE *fp1;
fp1 = fopen("User.txt", "a+");
if (fp1 == NULL)
{
printf("打开失败,按任意键退出!\n");
exit(1);
}
printf("\t请输入用户名:");
getchar();
gets(signin.name);
printf("\n");
if (pd(signin) == 0)
{
printf("\t对不起,您注册的用户名重复,返回重新想一个名字吧");
getch();
menu1();
}
else if (pd(signin) == 1)
{
printf("\t请设置密码:");
gets(signin.password);
fputs(signin.name, fp1);
fputs(" ", fp1);
fputs(signin.password, fp1);
fputs("\n", fp1);
fclose(fp1);
printf("\t*****注册成功,按任意键返回*****");
getch();
menu1();
}
}
void login()
{
User log;
FILE *fp1;
int i;
int flag=0;
char ch[50],p[50];
fp1 = fopen("User.txt", "rt");
printf("\t请输入用户名:");
getchar();
gets(ch);
printf("\t请输入密码:");
for (i = 0;; i++)
{
p[i] = getch();
switch (p[i])
{
case '\b':
p[--i] = '\0';
i--;
printf("\b \b");
break;
case '\r':
p[i] = '\0';
putchar('\n');
break;
default:
putchar('*');
break;
}
if (p[i] == '\0') break;
}
while(fscanf(fp1,"%s %s",log.name,log.password)!=EOF)
{
if( strcmp(ch,log.name)==0&&strcmp(p,log.password)==0 )
{
flag=1;
break;
}
else if(strcmp(ch,log.name)==0&&strcmp(p,log.password)!=0)
{
flag=0;
break;
}
else if(strcmp(ch,log.name)!=0)
{
flag=2;
continue;
}
}
if(flag==1)
{
menu();
}
else if(flag ==0)
{
printf("\t密码出错!");
getch();
menu1();
}
else if(flag ==2)
{
printf("\t您输入用户名不存在!");
getch();
menu1();
}
}
void menu1()
{
int choice;
system("cls");
printf("\n\n");
printf("\t\t*********************************\n");
printf("\t\t****欢迎使用球队人员管理系统*****\n");
printf("\t\t*********************************\n");
printf("\t\t***********注册-请按1************\n");
printf("\t\t***********登陆-请按2************\n");
printf("\t\t***********退出-请按0************\n");
printf("\t\t*********************************\n");
printf("\t请输入您的选择: ");
scanf("%d", &choice);
switch (choice)
{
case 0:printf("\t\t您已成功退出!欢迎再次使用!\n"); exit(0);
case 1:sign(); break;
case 2:login(); break;
default:printf("\t\t您的输入有误,请重新选择 \n"); getch(); menu1();
}
}
五、总结
数据结构作为计算机专业的一门重要学科,范围涉及到整个计算机领域,在学习各种高级汇编语言的同时不能忽视这一关键的学科。本程序中采用了结构数组和单链表相结合的形式,采用这种方式可以使单链表保存更多的数据信息,但是不需要对链表本身进行过多的定义,只需要将结构体数组的信息设置为链表的data即可。