文章目录
一 :学生信息
1 :头文件
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
typedef struct score{
int score_c;
int score_math;
int score_english;
}Score;
typedef struct student{
char id[3];
int age;
char name[30];
Score score;
}Student;
typedef struct node{
Student stu;
struct node *next;
}Node;
typedef struct user{
char name[10];
char password[10];
struct user *next;
}User;
typedef struct _userList{
User users[10];
int size;
}UserList;
2 : 创建表头
Node* createList(){
Node* head= (Node*)malloc(sizeof(Node));
head->next=NULL;
return head;
}
3: 创建结点
Node* createNode(Student data){
Node* newNode= (Node*)malloc(sizeof(Node));
newNode->stu= data;
newNode->next= NULL;
return newNode;
}
4:插入数据(头插法)
void insert(Node* head, Student data) {
Node* newNode = createNode(data);
newNode->next = head->next;
head-> next = newNode;
}
5:删除结点
Node* del(Node *head){
char id[3];
if(head->next == NULL)
{
puts("系统未录入信息,请先录入信息!!!");
system("pause");
system("cls");
}
else
{
Node * p = head->next , *q = head->next ;
puts("请输入您想删除学生信息的学号:");
fflush(stdin);
scanf("%3s",id);
fflush(stdin);
if(strcmp(p->stu.id,id) == 0)
{
head->next = head->next->next;
puts("找到了 已删除!");
system("pause");
system("cls");
}
else
{
while(p)
{
if(strcmp(p->stu.id,id) == 0)
{
q->next = q->next->next;
puts("找到了!! 已删除!!");
system("pause");
system("cls");
break;
}
q = p;
p = p->next;
}
if(!p)
{
puts("未找到! 请输入已录入的信息!");
system("pause");
system("cls");
}
}
}
return head;
}
6:修改结点信息
Node* modify(Node* head){
//判空
if(head->next == 0)
{
puts("系统未录入信息,请先录入信息!!!");
system("pause");
system("cls");
}
else
{
int tag = 1;
char id[3];
fflush(stdin);
puts("请输入该生学号(0 ~ 999):");
scanf("%s",id);
fflush(stdin);
Node * p = head->next;
char name[30];
int age;
while(p)
{
if(strcmp(p->stu.id,id) == 0 )
{
tag = 0;
puts("请输入您要修改的信息:1 姓名 2 成绩 3年龄");
fflush(stdin);
char choose = getchar();
while(getchar() != '\n')
continue;
switch(choose)
{
case '1':
puts("请输入修改后的姓名:");
scanf("%s",name);
fflush(stdin);
strcpy(p->stu.name , name);
puts("修改成功!!!");
system("pause");
system("cls");
break;
case '2':
puts("按 1 修改C语言成绩 ,按2 修改高数成绩 按3修改英语成绩");
choose = getchar();
while(getchar() != '\n')
continue;
switch (choose)
{
case '1' :
puts("请输入修改后的c语言成绩(0 ~ 100)的数字:");
fflush(stdin);
while(1)
{
if(scanf("%d",&p->stu.score.score_c) == 1 &&
p->stu.score.score_c > 0 &&
p->stu.score.score_c < 100)
{
break;
}
puts("输入有误 请输入0 ~ 100 之间的数字:");
fflush(stdin);
}
break;
case '2' :
puts("请输入修改后的高数成绩(0 ~ 100)的数字:");
fflush(stdin);
while(1)
{
if(scanf("%d",&p->stu.score.score_math) == 1 &&
p->stu.score.score_math > 0 &&
p->stu.score.score_math < 100)
{
break;
}
puts("输入有误 请输入0 ~ 100 之间的数字:");
fflush(stdin);
}
break;
case '3' :
puts("请输入修改后的英语成绩(0 ~ 100)的数字:");
fflush(stdin);
while(1)
{
if(scanf("%d",&p->stu.score.score_english) == 1 &&
p->stu.score.score_english > 0 &&
p->stu.score.score_english < 100)
{
break;
}
puts("输入有误 请输入0 ~ 100 之间的数字:");
fflush(stdin);
}
break;
default :
puts("输入有误!!!");
}
puts("修改成功!!!");
system("pause");
system("cls");
break;
case '3':
puts("请输入修改后的年龄:");
fflush(stdin);
scanf("%d",&age);
p->stu.age = age;
puts("修改成功!!!");
system("pause");
system("cls");
break;
default :
puts("请输入正确的选项!");
system("pause");
system("cls");
break;
}
}
p = p->next;
}
if(tag)
{
puts("该生不存在!!!");
system("pause");
system("cls");
}
}
return head;
}
7: 程序退出
void quit(){
puts("您即将退出系统 : 按任意键确认退出 ,取消退出请按:0");
char choose = getchar();
while(getchar() != '\n')
continue;
if(choose == '0')
{
puts("退出已取消!");
system("pause");
system("cls");
}
else
{
puts("退出成功!感谢您的使用!");
exit(0);
}
}
8:查询结点信息(学号)
void print_one(Node *head){
if(head->next == NULL)
{
printf("未录入信息!!");
return ;
}
puts("请输入学号:(默认前3位)");
char id[3];
fflush(stdin);
scanf("%3s",&id);
fflush(stdin);
Node *q = head->next ;
int tag = 1;
while( q )
{
if(strcmp(q->stu.id,id) == 0)
{
tag = 0;
puts("找到了!!");
printf("学号\t年龄\t姓名\tC语言成绩\t高数成绩\t英语成绩\n");
printf("%s\t%d\t%s\t%d\t%d\t%d\t\n",q->stu.id,q->stu.age,q->stu.name,q->stu.score.score_c,q->stu.score.score_math ,q->stu.score.score_english);
system("pause");
system("cls");
}
q = q->next;
}
if(tag)
{
puts("该学生不存在!!");
system("pause");
system("cls");
}
}
9 :展示全部信息
void print_all(Node* head){
if(head->next == NULL)
{
printf("未录入信息!!");
return ;
}
Node * q = head->next ;
if(q)
{
printf("学号\t年龄\t姓名\tC语言成绩\t高数成绩\t英语成绩\n");
while(q)
{
printf("%s\t%d\t%s\t%d\t%d\t%d\t\n",q->stu.id,q->stu.age,q->stu.name,q->stu.score.score_c,q->stu.score.score_math ,q->stu.score.score_english);
q = q->next;
}
}
else
{
puts("系统未录入信息, 请先录入信息!");
}
system("pause");
system("cls");
return ;
}
10 : 排序(学号升序)
归并排序
Node* sortMerge(Node *head){
if(head == NULL || head->next == NULL)
return head;
//fast 设置为第二个 方便分割后前半部分后面设置NULL
Node *fast = head->next ,*slow = head;
while(fast && fast->next )
{
fast = fast->next->next ;
slow = slow->next ;
}
Node *nextHead = slow->next ;
slow->next = NULL;
Node* m1 = sortMerge(head);
Node* m2 = sortMerge(nextHead);
//虚拟头结点
Node* dummy = (Node*)malloc(sizeof(Node));
Node* prev = dummy;
while(m1 && m2)
{
if(strcmp(m1->stu.id ,m2->stu.id) <= 0)
{
prev->next = m1;
m1 = m1->next;
}
else
{
prev->next = m2;
m2 = m2->next ;
}
prev = prev->next;
}
prev->next = m1 == NULL ? m2 : m1;
return dummy->next;
}
11 :菜单1
void menu_first(){
system("cls");
puts("\t**********************************");
puts("\t 欢迎使用学生管理系统 ");
puts("\t**********************************");
puts("\t* ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┐ *");
puts("\t* │ 0. 注册 │ *");
puts("\t* │ │ *");
puts("\t* │ 1. 登录 │ *");
puts("\t* │ │ *");
puts("\t* │ 2. 退出系统 │ *");
puts("\t* │ │ *");
puts("\t* └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┘ *");
puts("\t**********************************");
}
12 :菜单2
void menu_second(){
system("cls");
puts("\t**********************************");
puts("\t 欢迎使用学生管理系统 ");
puts("\t**********************************");
puts("\t* ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┐ *");
puts("\t* │1.录入信息 2.查询信息 │ *");
puts("\t* │ │ *");
puts("\t* │3.删除信息 4.修改信息 │ *");
puts("\t* │ │ *");
puts("\t* │5.信息排序 6.显示全部信息 │ *");
puts("\t* │ │ *");
puts("\t* │7.退出 │ *");
puts("\t* └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ *");
puts("\t**********************************");
}
13 :菜单操作1
char* keydown0(UserList* userList){
fflush(stdin);
char choose = getchar();
fflush(stdin);
char *username;
switch(choose)
{
case '0':
user_input(*&userList);
saveUserToFile(*&userList);
username = Login(*&userList);
return username;
case '1':
username = Login(*&userList);
printf("\n欢迎%s登录学生管理系统!\n",username);
return username;
case '2':
printf("退出\n");
exit(1);
default:
printf("输入错误!!!!!程序退出!!!\n");
exit(0);
break;
}
}
14 :菜单操作2
char* keydown1(Node* head,const char *filename,UserList* userList){
puts("请输入您的选择(1 ~ 8):");
char choose = getchar();
while(getchar() != '\n')
continue;
Student p;
switch (choose)
{
case '1':
puts("********************【录入信息】*********************");
fflush(stdin);
puts("请输入学生id 年龄 姓名 c语言成绩 高数成绩 英语成绩");
while(scanf("%s %d %s %d %d %d",p.id,&p.age,p.name,&p.score.score_c,&p.score.score_math ,&p.score.score_english) != 6)
{
fflush(stdin);
printf("您输入的数据不正确,请在下方重新输入正确信息!\n");
continue;
}
fflush(stdin);
insert(head,p);
//保存数据
writeintofile(head,filename);
break;
case '2':
puts("********************【查询信息】*********************");
print_one(head);
break;
case '3':
head = del(head);
writeintofile(head,filename) ;
break;
case '4':
head = modify(head);
writeintofile(head,filename);
break;
case '5':
head->next = sortMerge(head->next) ;
puts("排序已完成!!");
system("pause");
system("cls");
break;
case '6':
print_all(head);
break;
case '7':
puts("正常退出!!!");
exit(0);
break;
default :
puts("输入错误 : 请您重新输入:");
system("pause");
system("cls");
}
}
15 :增加用户
void user_input(UserList* userList){
system("cls");
char name[10] , password[10];
puts("********************增加用户********************");
puts("请输入新用户名:");
scanf("%s", name);
while(getchar() != '\n')
continue;
puts("请为新用户设置密码( 1 ~ 10):");
scanf("%s", password);
while(getchar() != '\n')
continue;
while (strlen(password) < 1 || strlen(password) > 10)
{
printf("密码长度不 得 低 于 1 位,高 于 10 位,请重新输入!\n");
scanf("%s", password);
while(getchar() != '\n')
continue;
}
strcpy(userList->users[userList->size].name, name);
strcpy(userList->users[userList->size++].password, password);
puts("添加用户成功!");
char * fileName = strcat(name,".txt");
FILE *fp=fopen(fileName,"w");
fclose(fp);
printf("%s",name);
system("pause");
return;
}
16:main函数:
int main(){
char *filename = "xx.txt";
char *username = "x";
UserList userList;
userList.size = 0;
readUserToFile(&userList);
menu_first();
username = keydown0(&userList);
system("pause");
system("cls");
Node *head = createList();
filename = strcat(username,".txt");
readInfor(head,filename);
while(1)
{
menu_second();
keydown1(head,filename,&userList);
system("pause");
system("cls");
}
return 0;
}
二: 文件操作:
1:保存用户信息
void saveUserToFile(UserList* userList ){
FILE* fp = fopen("user.txt", "w");
if (fp == NULL)
{
puts("打开失败!");
system("pause");
return ;
}
int i;
for ( i = 0;i < userList->size;i++)
{
fprintf(fp, "%s\t%s\t\n", userList->users[i].name, userList->users[i].password);
}
puts("写入成功!!!");
fclose(fp);
return;
}
2:读取用户信息
void readUserToFile(UserList* userList ){
FILE *fp = fopen("user.txt","r");
char name[10] ,password[10];
if(fp == NULL)
{
fp = fopen( "user.txt","w+");
}
while(fscanf(fp,"%s\t%s\t",&name,&password) != EOF)
{
strcpy(userList->users[userList->size].name,name);
strcpy(userList->users[userList->size++].password,password);
}
fclose(fp);
puts("读取完毕!!!");
return ;
}
3:登录
char* Login(UserList* userList){
puts("******************登录*******************");
if (userList->size == 0)
{
puts("无用户!!请先注册!");
system("pause");
user_input(userList);
return NULL;
}
char name[10] , password[10];
int flag = 0;
puts("请输入用户名:");
scanf("%s", name);
int i = 0 ,j = 0;
for ( i = 0 ;i < userList->size ; i++)
{
if (strcmp(name, userList->users[i].name) == 0)
{
flag = 1;
break;
}
}
if (flag == 0)
{
puts("用户名不存在!!程序退出!");
exit(0);
}
puts("请输入登录密码:");
scanf("%s", password);
while(getchar() != '\n')
continue;
for ( j = 1; j < 3 ; j++)
{
if (strcmp(password,userList->users[i].password) == 0) //i是上面依照用户名获取的下标
{
puts("登录成功!! !");
return userList->users[i].name;
}
printf("密码记错了哦 还有%d次机会!!!\n", 3 - j);
scanf("%s",password);
while(getchar() != '\n')
continue;
}
puts("3 次 输 入 密 码 错 误 ,程 序 将 退 出 !");
exit(0);
}
4: 读取文件
void readInfor(Node *head,const char* filename){
FILE *fp=fopen(filename,"r");
Student p;
if(!fp)
{
fopen(filename,"w+");
}
//读文件,把文件中的数据读入链表
while(fscanf(fp,"%s\t%d\t%s\t%d\t%d\t%d",p.id,&p.age,p.name,&p.score.score_c,&p.score.score_math ,&p.score.score_english)!=EOF)
{
insert(head,p);
}
fclose(fp);
}
5:写入文件
void writeintofile( Node* head,const char* filename){
//开文件,"w"如果文件存在,那么清空文件内容,"a"为追加
FILE *fp=fopen(filename,"w");
Node *p = head->next;
if (fp == NULL)
{
puts("写文件失败!!!!");
system("pause");
return;
}
//将链表信息传给文件
while(p)
{
fprintf(fp,"%s\t%d\t%s\t%d\t%d\t%d\n",p->stu.id,p->stu.age,p->stu.name,p->stu.score.score_c,p->stu.score.score_math ,p->stu.score.score_english);
p=p->next;
}
puts("学生写入完毕!!!");
fclose(fp);
}
三: 总结
文件操作不太熟练,多加练习