#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
typedef struct Student {
char id[15];
char name[20];
int sex;
int age;
int grade;
struct Student *next;
struct Student *head;//头指针
struct Student *end;//尾指针
int length;//信息链表长度(不包括头空间)
struct Student *thisP;//当前位置(记录在头空间里的 )
} Stu;
Stu* head;
char passwd[20];//密码
int writeStu();//写入信息函数
int addStu();//添加学生信息到链表
int deleStu();//从链表中将学生信息删除
int modifyStu();//修改链表中的学生信息
int findStu();//查询链表中的学生信息
int sort();//将链表中的信息按照学生成绩排序
void menu();//菜单函数
Stu* init();//初始化函数
void error(int event);//报错函数
int creatSpace();//创建链表函数
void select();//分支选择函数
int printStu();//打印信息
int deleStu();//删除信息
void judgeSex(Stu *p);//性别输出函数
int readFile();//文件导入函数
int saveFile();//信息保存函数
int password();
Stu* init() {
head = (Stu*)malloc(sizeof(Stu));
head->length = 0;
head->end = head;
head->next = NULL;
head->thisP = NULL;
error(password());
return head;
}
void error(int event) {
switch(event) {
case 0:
printf("\t\t\t\t创建链表失败(错误代码0)");
break;
case 1:
break;
case -1:
printf("\t\t\t\t新建学生信息失败(错误代码-1)");
break;
case -2:
printf("\t\t\t\t删除学生信息失败(错误代码-2)");
break;
case -3:
printf("\t\t\t\t修改学生信息失败(错误代码-3)");
break;
case -4:
printf("\t\t\t\t查询学生信息失败(错误代码-4)");
break;
case -5:
printf("\t\t\t\t学生信息排序失败(错误代码-5)");
break;
case -6:
printf("\t\t\t\t文件保存失败(错误代码-6)");
break;
case -7:
printf("\t\t\t\t文件读取失败(错误代码-7)");
break;
case -8:
printf("\t\t\t\t密码修改失败(错误代码-8)");
break;
case -9:
printf("\t\t\t\t写入信息失败(错误代码-9)");
break;
case -10:
printf("\t\t\t\t信息显示失败(错误代码-10)");
break;
case -11:
printf("\t\t\t\t密码错误");
break;
default:
printf("\t\t\t\t未知错误");
}
}
int writeStu() {
Stu *p;
p = head->thisP;
if(head->thisP!=NULL) {
printf("\t\t\t\t请您输入学生的学号:");
scanf("%s",p->id);
printf("\t\t\t\t请您输入学生的姓名:");
scanf("%s",p->name);
printf("\t\t\t\t请您输入学生的性别(用数字表示,1位男、0为女)");
scanf("%d",&p->sex);
printf("\t\t\t\t请您输入学生的年龄:");
scanf("%d",&p->age);
printf("\t\t\t\t请您输入学生的分数:");
scanf("%d",&p->grade);
} else
return -9;
return 1;
}
int creatSpace() {
Stu *p = head->end; //获取当前链表末尾位置
Stu *q = (Stu*)malloc(sizeof(Stu));
q->next = NULL;
p->next = q;
head->length ++ ;
head->end = q;
if(head->end==NULL)
return 0;
return 1;
}
int addStu() {//添加信息
if(head!=NULL) {
error(creatSpace());
head->thisP = head->end;
error(writeStu());
} else
return -1;
return 1;
}
void judgeSex(Stu *p) {
if(p->sex==1)
printf("\n\t\t\t\t性别:男");
else
printf("\n\t\t\t\t性别:女");
}
int printStu() {//打印信息
if(head->thisP!=NULL) {
Stu *p = head->thisP;
printf("\t\t\t\t学号:%s",p->id);
printf("\n\t\t\t\t姓名:%s",p->name);
judgeSex(p);
printf("\n\t\t\t\t年龄:%d",p->age);
printf("\n\t\t\t\t成绩:%d\n",p->grade);
} else {
printf("\t\t\t\t暂无学生数据\n");
return -10;
}
return 1;
}
int findStu() {
char id[5];
printf("\t\t\t\t请输入您查询信息的学号");
scanf("%s",id);
head->thisP = head->next;
for(int i=0; i<head->length; i++) {
if(strcmp(id,head->thisP->id)==0) {
error(printStu());
break;
} else if(i==head->length&&strcmp(id,head->thisP->id)!=0) {
printf("\t\t\t\t未查询到该学生信息\n");
} else
head->thisP=head->thisP->next;
}
if(head->thisP==NULL)
return -4;
return 1;
}
int deleStu() {
Stu *p;
Stu *q;
p = head->next;
q = head;
int a;
error(findStu());
printf("\n\t\t\t\t是否删除?(按1删除,其他任意键取消)");
scanf("%d",&a);
if(a == 1) {
while(p!=NULL) {
if(strcmp(head->thisP->id,p->id) == 0) {
q->next = p->next;
free(p);
head->length--;
break;
} else {
p = p->next;
q = q->next;
}
}
if(p==NULL)
return -2;
}
return 1;
}
int modifyStu() {
int a;
error(findStu());
printf("\n\t\t\t\t是否修改?(按1开始修改,其他任意键取消)");
scanf("%d",&a);
if(a==1) {
if(head->thisP!=NULL) {
error(writeStu());
} else
return -3;
}
return 1;
}
int sort() {
int temp;
if(head->length>2) {
Stu *p;
Stu *q;
Stu *m;
for(int i = 0; i<head->length; i++) {
p = head->next;
q = p->next;
m = head;
for(int j=0; j<head->length-i-1; j++) {
if(p->grade<q->grade) {
m->next = q;
p->next = q->next;
q->next = p;
p = m->next;
q = p->next;
}
p=p->next;
q=q->next;
m=m->next;
}
head->end = q;
}
} else if(head->length<0)
return -5;
printf("\t\t\t\t排序完成\n");
return 1;
}
int saveFile() {
FILE *fq;
fq = fopen("data.txt","w");
if(fq==NULL)
return -6;
head->thisP = head;
fprintf(fq,"%d\n",head->length);
for(int i=0; i<head->length; i++) {
head->thisP = head->thisP->next;
fprintf(fq,"%s %s %d %d %d\n",head->thisP->id,head->thisP->name,head->thisP->sex,head->thisP->age,head->thisP->grade);
}
printf("\t\t\t\t保存完毕!");
fclose(fq);
return 1;
}
int readFile() {
FILE *fq;
fq = fopen("data.txt","r");
if(fq==NULL)
return -7;
fscanf(fq,"%d",&head->length);
int leng = head->length;
head->length = 0;
for(int i=0; i<leng; i++) {
error(creatSpace());
fscanf(fq,"%s %s %d %d %d\n",head->end->id,head->end->name,&head->end->sex,&head->end->age,&head->end->grade);
}
printf("\t\t\t\t导入信息完成!");
fclose(fq);
return 1;
}
int password() {
FILE *fq;
char str[20];
fq = fopen("password.txt","r");
if(fq==NULL) {
printf("您是新用户,请设置密码(6位):");
for(int i=0; i<6; i++) {
scanf("%c",&passwd[i]);
}
fq = fopen("password.txt","w");
fprintf(fq,"%s",passwd);
printf("密码设置完成!即将跳转!");
return 1;
}
fscanf(fq,"%s",passwd);
for(int i=1; i<4; i++) {
printf("请输入您的密码(%d/3):",i);
scanf("%s",str);
if(strcmp(str,passwd)==0) {
printf("密码正确!即将跳转!");
fclose(fq);
return 1;
} else {
if(i==3) {
printf("密码错误3次,已自动退出");
exit(-1);
} else
printf("密码输入错误!请重新输入\n");
}
}
return 1;
}
int passwdmodif(){
char str[20];
char passwor[20];
FILE *fq;
for(int i=1; i<4; i++) {
printf("请输入您的原密码(%d/3):",i);
scanf("%s",str);
if(strcmp(str,passwd)==0) {
printf("请输入你修改后的密码(6位):");
getchar();//清除键盘缓冲区
for(int i=0; i<6; i++) {
scanf("%c",&passwor[i]);
}
fq = fopen("password.txt","w");
if(fq == NULL){
return -8;
}
printf("%s",passwor);
fprintf(fq,"%s",passwor);
strcpy(passwd,passwor);
printf("密码修改成功");
fclose(fq);
return 1;
} else {
if(i==3) {
printf("密码错误3次,已自动退出");
exit(-1);
} else
printf("密码输入错误!请重新输入\n");
}
}
return 1;
}
void menu() {
system("cls");
puts("\n");
puts("\t\t\t\t 学生信息管理系统 \n");
puts("\t\t\t\t*************************************************\n");
puts("\t\t\t\t(1)学生信息新增\t\t\t(2)学生信息浏览\t");
puts("\t\t\t\t(3)学生信息查询\t\t\t(4)学生信息排序\t");
puts("\t\t\t\t(5)学生信息删除\t\t\t(6)学生信息修改\t");
puts("\t\t\t\t(7)学生信息导入\t\t\t(8)学生信息保存\t");
puts("\t\t\t\t(9)系统密码修改\t\t\t(0)退出图书系统\t");
puts("\n\t\t\t\t*************************************************\n");
}
void select() {
int a;
while(1) {
menu();
printf("\t\t\t\t请输入您选择的序号:");
scanf("\t\t\t\t%d",&a);
switch(a) {
case 1:
addStu();
break;
case 2:
head->thisP = head;
for(int i=0; i<head->length; i++) {
head->thisP=head->thisP->next;
error(printStu());
}
break;
case 3:
int a;
for(int i=0; i<head->length; i++) {
if(a = findStu()==1)
break;
else
error(a);
}
break;
case 4:
error(sort());
break;
case 5:
error(deleStu());
break;
case 6:
error(modifyStu());
break;
case 7:
error(readFile());
break;
case 8:
error(saveFile());
break;
case 9:
error(passwdmodif());
break;
case 0:
Stu *q=head;
Stu *p;
while (q) {
p = q;
q = q->next;
free(p);
}
exit(-1);
break;
}
system("pause");
}
}
int main() {
init();
select();
return 0;
}
随时欢迎学习交流