菜单代码
#include "head.h"
int main(int argc, const char *argv[])
{
int ch,k;
//登录注册
while(1)
{
printf("\t1、注册\n");
printf("\t2、登录\n");
printf("\t0、退出\n");
printf("请输入你的选择:");
scanf("%d",&ch);
getchar();
switch(ch)
{
case 1:
{
regist();//注册函数
}
break;
case 2:
{
k = login();//登录函数
}
break;
case 0:
{
exit(EXIT_SUCCESS);//退出函数
}
break;
}
if(k == 1)
{
break;
}
}
while(1)
{
printf("\t------学生管理系统首页------\n");
printf("\t1、录入学生信息\n");
printf("\t2、输出学生信息\n");
printf("\t3、任意位置删除学生信息\n");
printf("\t4、任意位置插入学生信息\n");
printf("\t5、任意位置修改学生信息\n");
printf("\t6、任意位置查找学生信息\n");
printf("\t7、表头插入一个学生信息\n");
printf("\t8、表尾插入一个学生信息\n");
printf("\t9、按照姓名查找学生信息并删除\n");
printf("\t10、按年龄查找学生并修改学号为10086\n");
printf("\t0、退出\n");
printf("请输入你的选择:");
scanf("%d",&ch);
Plink L;
switch(ch)
{
case 1:
{
L = create();
input_link(L);
}
break;
case 2:
{
output_link(L);
}
break;
case 3:
{
int pos;
printf("请输入需要删除的学生位置:");
scanf("%d",&pos);
del_pos(L,pos);
}
break;
case 4:
{
insert_pos(L);
}
break;
case 5:
{
int pos;
printf("请输入需要修改的学生位置:");
scanf("%d",&pos);
edit_pos(L,pos);
}
break;
case 6:
{
int pos;
printf("请输入需要查找的学生位置:");
scanf("%d",&pos);
find_pos(L,pos);
}
break;
case 7:
{
stu e;
printf("表头插入一个学生信息\n");
printf("请输入需要插入学生的信息:");
scanf("%d%s%d",&e.id,e.name,&e.age);
insert_front(L,e);
}
break;
case 8:
{
stu e;
printf("表尾插入一个学生信息\n");
printf("请输入需要插入学生的信息:");
scanf("%d%s%d",&e.id,e.name,&e.age);
insert_rear(L,e);
}
break;
case 9:
{
int fage;
printf("请输入需要查找的年龄:");
scanf("%d",&fage);
find_age(L,fage);
}
break;
case 10:
{
int fage;
printf("请输入需要查找的年龄:");
scanf("%d",&fage);
find_age_id(L,fage);
}
break;
case 0:
{
exit(EXIT_SUCCESS);
}
break;
}
}
return 0;
}
功能函数代码
#include "head.h"
//登录注册部分函数
int regist()
{
char regist_name[20];//注册登录用户名
char regist_code[20];//注册密码
printf("请输入注册用户名和密码:");
fgets(regist_name,sizeof(regist_name),stdin);
//scanf("%s",regist_name);
fgets(regist_code,sizeof(regist_code),stdin);
//scanf("%s",regist_code);
regist_name[strlen(regist_name)-1] = '\0';
regist_code[strlen(regist_code)-1] = '\0';
//将数据写入用户数据文件
FILE *fp1;
fp1 = fopen("./user_data.txt","a");
if(fp1 == NULL)
{
perror("fp1");
return -1;
}
fprintf(fp1,"%s %s ",regist_name,regist_code);
printf("注册成功!\n");
fclose(fp1);
return 0;
}
int login()
{
char regist_name[20];
char regist_code[20];
char login_name[20];
char login_code[20];
int login_max = 5;
for(int i=0;i<login_max;i++)
{
printf("这是你第%d次输入,你还有%d次输入机会\n",i+1,login_max-i);
printf("请输入用户名和密码:");
fgets(login_name,sizeof(login_name),stdin);
fgets(login_code,sizeof(login_code),stdin);
login_name[strlen(login_name)-1] = '\0';
login_code[strlen(login_code)-1] = '\0';
FILE *fp2;
fp2 = fopen("./user_data.txt","r");
if(fp2 == NULL)
{
perror("fp2");
return -1;
}
int flag = 0;
while(1)
{
//从用户数据文件夹提取数据
int ret = fscanf(fp2,"%s %s",regist_name,regist_code);
//读取到文件末尾
if(ret < 0)
{
break;
}
if(strcmp(regist_name,login_name)==0&&strcmp(regist_code,login_code)==0)
{
flag = 1;
printf("登录成功!\n");
return 1;
}
}
if(flag == 0)
{
printf("登录失败!\n");
}
fclose(fp2);
}
printf("输入次数已用尽,系统锁定\n");
while(1);
return 0;
}
//管理学生信息部分函数
//空间申请函数
Plink apply()
{
Plink p = malloc(sizeof(Link));
if(p == NULL)
{
printf("申请失败\n");
return NULL;
}
return p;
}
//创建链表函数
Plink create()
{
Plink p = apply();
if(p == NULL)
{
printf("创建失败!\n");
return NULL;
}
p->len = 0;
p->next = NULL;
return p;
}
//头插法创建
void insert_front(Plink L,stu e)
{
if(L == NULL)
{
printf("插入失败!\n");
return;
}
Plink p = apply();
if(NULL == p)
{
printf("申请正常节点失败!\n");
}
p->data = e;
p->next = L->next;
L->next = p;
L->len++;
}
//信息输入函数
void input_link(Plink L)
{
stu e;
int n,i;
printf("请输入学生数量:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("请输入学生信息:");
scanf("%d%s%d",&e.id,e.name,&e.age);
insert_front(L,e);
}
}
//信息输出函数
void output_link(Plink L)
{
if(L == NULL)
{
printf("输出失败!\n");
return;
}
Plink t = L->next;
while(t != NULL)
{
printf("学号:%d\t姓名:%s\t年龄:%d\n",t->data.id,t->data.name,t->data.age);
t = t->next;
}
}
//任意位置删除学生信息
void del_pos(Plink L,int pos)
{
if(pos<1||pos>L->len||L == NULL||L->len ==0)
{
printf("删除失败!\n");
return;
}
Plink t = L;
int i;
for(i=0;i<pos-1;i++)
{
t = t->next;
}
Plink Q = t->next;
t->next = Q->next;
free(Q);
Q = NULL;
L->len--;;
}
//任意位置插入学生信息
void insert_pos(Plink L)
{
int pos,i;
stu e;
printf("请输入需要插入信息的位置:");
scanf("%d",&pos);
if(pos<1||pos>L->len+1)
{
printf("插入失败!\n");
return;
}
Plink t = L;
for(i=0;i<pos-1;i++)
{
t = t->next;
}
Plink p = apply();
printf("请输入需要插入的学生信息:");
scanf("%d%s%d",&e.id,e.name,&e.age);
p->data = e;
p->next = t->next;
t->next = p;
L->len++;
}
//任意位置查找学生信息
void find_pos(Plink L,int pos)
{
Plink t = L;
if(pos<1||pos>L->len||L->len == 0||L == NULL)
{
printf("查找失败!\n");
return;
}
for(int i=0;i<pos;i++)
{
t = t->next;
}
printf("第%d位学生的信息:学号:%d姓名:%s年龄:%d\n",pos,t->data.id,t->data.name,t->data.age);
}
//任意位置修改学生信息
void edit_pos(Plink L,int pos)
{
Plink t = L;
if(pos<1||pos>L->len||L == NULL||L->len == 0)
{
printf("修改失败!\n");
return;
}
for(int i=0;i<pos;i++)
{
t=t->next;
}
stu e;
printf("请输入需要修改的学生信息:");
scanf("%d%s%d",&e.id,e.name,&e.age);
t->data = e;
}
//表头插入一个学生(头插法插入一个学生)直接调用头插法
//表尾插入一个学生信息
void insert_rear(Plink L,stu e)
{
Plink t = L;
if(L == NULL)
{
printf("插入失败\n");
return;
}
for(int i=0;i<L->len;i++)
{
t= t->next;
}
Plink p = apply();
p->data = e;
p->next = NULL;
t->next = p;
L->len++;
}
//按年龄查找学生信息
void find_age(Plink L,int fage)
{
int pos=1;
Plink t = L->next;
while(t != NULL)
{
if(t->data.age == fage)
{
printf("%d年龄的学生有:学号:%d姓名:%s年龄:%d\n",fage,t->data.id,t->data.name,t->data.age);
printf("该年龄的学生位置为:%d\n",pos);
Plink Q = t->next;
del_pos(L,pos);
t = Q;
printf("删除成功!\n");
}
else
{
pos = pos+1;
t = t->next;
}
}
}
//按年龄查找学生信息,修改学号为10086
void find_age_id(Plink L,int fage)
{
Plink t = L->next;
while(t != NULL)
{
if(t->data.age == fage)
{
printf("将%d年龄的学生学号修改为10086\n",fage);
t->data.id = 10086;
t=t->next;
}
else
{
t= t->next;
}
}
}
头文件代码
#ifndef _HEAD_H_
#define _HEAD_H_
#include <myhead.h>
#define MAX 30
typedef struct students
{
int id;
char name[20];
int age;
}stu;
typedef struct node
{
union
{
int len;
stu data;
};
struct node *next;
}Link,*Plink;
int regist();
int login();
Plink apply();
Plink create();
void insert_front(Plink,stu);
void input_link(Plink);
void output_link(Plink);
void del_pos(Plink,int);
void insert_pos(Plink);
void find_pos(Plink,int);
void edit_pos(Plink,int);
void insert_rear(Plink,stu);
void find_age(Plink,int);
void find_age_id(Plink,int);
#endif