基于链表文件操作的学生信息管理系统

// 仅供参考

#include <stdio.h>

#include <windows.h>

#include <stdlib.h>

#include <string.h>

typedef struct Node{

 int id;//学号

 char name[50];//姓名
 
 char sex[10];//性别

 int age,room;

 char tel[50];

 char course[50];//选择课程

 int pts;//分数

 char cls[50];//班级

 struct Node *next;

}node;


int readfile(node *L);//读取学生信息文件

void printStuInfo(node *L);//输出学生信息

void addStuInfo(node *L);//学生信息添加

void insertStuInfo(node *L,node e);//插入学生信息函数

int savefile(node *L);//学生文件信息保存(添加或删除后使用)

void printSearchCls(node *L);//按班级查找

void printSearchCourse(node *L);//按课程查找

void printsearchStu(node *L);//查询学生信息

node * searchStuInfo(int id,node *L);//查找学生信息函数 返回(前一个)指针

void printchangeStucourseInfo(node *L);//学生成绩录入 

void printchangeStuInfo(node *L);//学生信息修改

void deleteStuInfo(node *ps);//ps 为删除节点的前一个

void sortInfo(node *L);//冒泡排序 

void exitprogame();//退出


node list;

void menu()//主菜单
{
    printf("**********************************************************************************************************************\n");
	printf("*                                                                                                                   *\n");
	printf("*                                             欢迎使用教务管理系统                                                  *\n");
	printf("*                                                    ......                                                         *\n");
	printf("*                                                    ......                                                         *\n");
	printf("**********************************************************************************************************************\n");
	printf("*                                                                                                                   *\n");
	printf("*                                 --------------------------------------                                            *\n");
    printf("*                                *|                                    |*                                           *\n");
    printf("*                                *|                                    |*                                           *\n");
	printf("*                                *|           1:个人信息查询           |*                                           *\n");
	printf("*                                *|                                    |*                                           *\n");
	printf("*                                *|           2.学生信息录入           |*                                           *\n");
	printf("*                                *|                                    |*                                           *\n");
	printf("*                                *|           3:班级信息总览           |*                                           *\n");
	printf("*                                *|                                    |*                                           *\n");
	printf("*                                *|           4:学生信息修改           |*                                           *\n");
	printf("*                                *|                                    |*                                           *\n");
	printf("*                                *|           5:学生信息删除           |*                                           *\n");
	printf("*                                *|                                    |*                                           *\n");
	printf("*                                *|           6:课程成绩总览           |*                                           *\n");
	printf("*                                *|                                    |*                                           *\n");
	printf("*                                *|           7:学生成绩录入<教师使用> |*                                           *\n");
	printf("*                                *|                                    |*                                           *\n");
	printf("*                                *|           8:排序信息(学号)         |*                                           *\n");
	printf("*                                *|                                    |*                                           *\n");
	printf("*                                *|           9:退出                   |*                                           *\n");
	printf("*                                *|                                    |*                                           *\n");
	printf("*                                *|                                    |*                                           *\n");
	printf("*                                 --------------------------------------                                            *\n");
	printf("*                                                                                                                   *\n");
	printf("*                                                                                                                   *\n");
	printf("**********************************************************************************************************************\n");
    printf("请输入相关数字:");

}

int readfile(node *L)//读取文件信息
{
    FILE *fp=fopen("studentInfo.txt","r");
    node st;
    node *s;
    node *t=L;

    if(fp==NULL)
    {
        return 0;
    }
    else
    {
        while(fscanf(fp,"%d %s %s %d %s %d %s %d %s",&st.id,st.name,st.sex,&st.age,st.tel,&st.room,st.course,&st.pts,st.cls)!=EOF)
        {
            s=(node*)malloc(sizeof(node));
            *s=st;
            t->next=s;
            t=s;
            t->next=NULL;
        }
    }
    fclose(fp);
    return 1;
}

void printStuInfo(node *L)//输出文件信息
{
    node *p=L->next;
    printf("___________________________________________________________________________________\n");
    printf("|学号\t|姓名\t|性别\t|年龄\t|手机号\t\t|宿舍号\t|选课\t|分数\t|班级\t|\n");
    if(p!=NULL)
    {
        while(p!=NULL)
        {
      printf("|%d\t|%s\t|%s\t|%d\t|%s\t|%d\t|%s\t|%d\t|%s\t|\n",p->id,p->name,p->sex,p->age,p->tel,p->room,p->course,p->pts,p->cls);
             printf("_____________________________________________________________________________\n");
             p=p->next;
        }
    }
}

void addStuInfo(node *L)//学生信息添加
{
    node st;
    printf("请输入新增学生的相关信息:\n");
    printf("学号:\n");
    scanf("%d",&st.id);
    printf("姓名:\n");
    scanf("%s",st.name);
    printf("性别:\n");
    scanf("%s",st.sex);
    printf("年龄:\n");
    scanf("%d",&st.age);
    printf("手机号:\n");
    scanf("%s",st.tel);
    printf("宿舍号:\n");
    scanf("%d",&st.room);
    printf("班级:\n");
    scanf("%s",st.cls);
    int pts=-1;
    st.pts=pts;
    char course[50]="unknown";
    strcpy(course,st.course);
    insertStuInfo(&list,st);
}


void insertStuInfo(node *L,node e)//插入函数
{
    //头插法
    node *head=L;
    node *p=(node*)malloc(sizeof(node));
    *p=e;//存入信息
    p->next=head->next;
    head->next=p;
    savefile(&list);
}

int savefile(node *L)//文件信息保存(添加或删除后使用)
{
    FILE *fp=fopen("studentInfo.txt","w");
    if(fp==NULL)
    {
        printf("ERROR2");
        return 0;
    }
    node *p=L->next;
    while(p!=NULL)
    {
        fprintf(fp,"%d %s %s %d %s %d %s %d %s\n",p->id,p->name,p->sex,p->age,p->tel,p->room,p->course,p->pts,p->cls);
        p=p->next;
    }
     fclose(fp);
     return 1;
}

void printsearchStu(node *L)//查询学生信息
{
    printf("请输入查询学生的学号:");
    int id;
    scanf("%d",&id);
    node *p;
    p = searchStuInfo(id,L);
    if(p==NULL)
	{
	  printf("查无此人!\n");
    }
    else
    {
        p=p->next;
       printf("___________________________________________________________________________________\n");
     printf("|学号\t|姓名\t|性别\t|年龄\t|手机号\t\t|宿舍号\t|选课\t|分数\t|班级\t|\n");
      printf("|%d\t|%s\t|%s\t|%d\t|%s\t|%d\t|%s\t|%d\t|%s\t|\n",p->id,p->name,p->sex,p->age,p->tel,p->room,p->course,p->pts,p->cls);
             printf("______________________________________________________________________________\n");
    }
}

void printSearchCls(node *L)//按班级查找
{
    printf("请输入查询的班级:");
    char cls[50];
    int flag=0;
    scanf("%s",cls);
    node *p=L;
    while(p!=NULL)
    {
        if(strcmp(cls,p->cls)==0)
        {
            flag=1;
      printf("_____________________________________________________\n");
      printf("|学号\t|姓名\t|性别\t|年龄\t|手机号\t\t|宿舍号\t|选课\t|分数\t|班级\t|\n");
      printf("|%d\t|%s\t|%s\t|%d\t|%s\t|%d\t|%s\t|%d\t|%s\t|\n",p->id,p->name,p->sex,p->age,p->tel,p->room,p->course,p->pts,p->cls);
      printf("__________________________________________________\n");
        }
        p=p->next;
    }
    if(flag==0) printf("无相关信息");
}
 

void printSearchCourse(node *L)//按课程查找
{
    printf("请输入查询的课程:\n");
    char course[50];
    int flag=0;
    scanf("%s",course);
    node *p=L;
    while(p!=NULL)
    {
        if(strcmp(course,p->course)==0)
        {
            flag=1;
      printf("_____________________________________________________________________________________\n");
       printf("|学号\t|姓名\t|性别\t|年龄\t|手机号\t\t|宿舍号\t|选课\t|分数\t|班级\t|\n");
      printf("|%d\t|%s\t|%s\t|%d\t|%s\t|%d\t|%s\t|%d\t|%s\t|\n",p->id,p->name,p->sex,p->age,p->tel,p->room,p->course,p->pts,p->cls);
      printf("______________________________________________________________________________________\n");
        }
        p=p->next;
    }
    if(flag==0) printf("无相关信息\n");
    else
	{
		p=L;
	printf("不及格名单如下:\n");
    while(p!=NULL)
    {
        if((strcmp(course,p->course)==0)&&(p->pts<60)&&(p->pts>=0))
        {
           printf("%s\n",p->name);
        }
        p=p->next;
    }
}
}

node * searchStuInfo(int id,node *L)//查找函数 返回指针
{
    node *p=L;
    while(p->next!=NULL)
    {
        if(p->next->id==id) {return p;}
        p=p->next;
    }
    return NULL;
}

void printchangeStuInfo(node *L)
{
    printf("请输入要修改的学生学号:\n");
    int id;
    scanf("%d",&id);
    node *p =searchStuInfo(id,L);
    if(p==NULL)
    {
        printf("查无此人!\n");
        return;
    }
    p=p->next;
    int choice=-1;
    while(1)
    {
        printf("请输入需要修改的信息对应编号:");
        printf("修改姓名----------1");
        printf("修改性别----------2");
        printf("修改年龄----------3");
        printf("修改手机号-------4");
        printf("修改宿舍号-------5");
        printf("修改班级----------6");
        scanf("%d",&choice);
        switch(choice)
        {
            case 1:printf("请输入姓名:\n");
            scanf("%s",p->name);
            break;
            case 2:printf("请输入性别:\n");
            scanf("%s",p->sex);
            break;
            case 3:printf("请输入年龄:\n");
            scanf("%d",&p->age);
            break;
            case 4:printf("请输入手机号:\n");
            scanf("%s",p->tel);
            break;
            case 5:printf("请输入宿舍号:\n");
            scanf("%d",&p->room);
            break;
            case 6:printf("请输入班级:\n");
            scanf("%s",p->cls);
            break;
        }
        printf("是否继续修改学生信息?(y-1 / n-0)\n");
		scanf("%d",&choice);
		if(choice == 0){
			break;
		}
    }
      printf("_____________________________________________________________________________________\n");
     printf("|学号\t|姓名\t|性别\t|年龄\t|手机号\t\t|宿舍号\t|选课\t|分数\t|班级\t|\n");
      printf("|%d\t|%s\t|%s\t|%d\t|%s\t|%d\t|%s\t|%d\t|%s\t|\n",p->id,p->name,p->sex,p->age,p->tel,p->room,p->course,p->pts,p->cls);
             printf("______________________________________________________________________________\n");
             savefile(L);
}

void printchangeStucourseInfo(node *L)
{
	printf("请输入需要录入的学生学号:\n");
	int id;
    scanf("%d",&id);
    node *p =searchStuInfo(id,L);
    if(p==NULL)
    {
        printf("查无此人!\n");
        return;
    }
    int choice=-1;
    p=p->next;
	while(1)
    {
        printf("请输入需要修改的信息对应编号:");
        printf("录入课程名称----------1\n");
        printf("录入成绩--------------2\n");
        scanf("%d",&choice);
        switch(choice)
        {
            case 1:printf("请输入课程名称:\n");
            scanf("%s",p->course);
            break;
            case 2:printf("请输入成绩:\n");
            scanf("%d",&p->pts);
            break;
        }
        printf("是否继续修改学生信息?(y-1 / n-0)\n");
		scanf("%d",&choice);
		if(choice == 0){
			break;
		}
    }
      printf("____________________________________________________________________________________\n");
     printf("|学号\t|姓名\t|性别\t|年龄\t|手机号\t\t|宿舍号\t|选课\t|分数\t|班级\t|\n");
      printf("|%d\t|%s\t|%s\t|%d\t|%s\t|%d\t|%s\t|%d\t|%s\t|\n",p->id,p->name,p->sex,p->age,p->tel,p->room,p->course,p->pts,p->cls);
             printf("______________________________________________________________________________\n");
             savefile(L);
}

void printDeleteStuInfo(node *L)
{
    printf("请输入要删除的学生学号:");
    int id;
    scanf("%d",&id);
    node *p ;
    p=searchStuInfo(id,L);//此函数获得所求节点的前一个结点
    node *q;
    q=p;
    if(p==NULL)
    {
        printf("查无此人!");
        return;
    }
    p=p->next;
   printf("_______________________________________________________________________________________\n");
     printf("|学号\t|姓名\t|性别\t|年龄\t|手机号\t\t|宿舍号\t|选课\t|分数\t|班级\t|\n");
      printf("|%d\t|%s\t|%s\t|%d\t|%s\t|%d\t|%s\t|%d\t|%s\t|\n",p->id,p->name,p->sex,p->age,p->tel,p->room,p->course,p->pts,p->cls);
             printf("_____________________________________________________________________________\n");
             deleteStuInfo(q);
             savefile(L);
}

void sortInfo(node *L)
{
	int i,count = 0,num;//count=链表结点的个数,num内层循环,
	node *p,*q,*tail;
	p = L;
	while(p->next != NULL)//结点个数
	{
		count++;
		p = p->next;
	}
	for(i=0;i < count - 1;i++)
	{
		num = count - i - 1;
		q=L->next;
		p=q->next;
		tail=L;//让tail始终指向q前一个结点
		while(num--)//内层循环
		{
			if(q->id > p->id)//如果该结点的值大于后一个结点,则交换
			{
				q->next=p->next;
				p->next=q;
				tail->next=p;
			}
				tail = tail->next;
				q=tail->next;
				p=q->next;
		 } 
	} 
}

void deleteStuInfo(node *ps)//ps 为删除节点的前一个
{
    node * s =ps->next;
    ps->next =s->next;
    s->next=NULL;
    free(s);
}

void exitprogame()
{
    printf("退出程序\n");
    exit(0);
}

int main()
{
	readfile(&list);
    int caozuoshu;
    while(1)
    {
    menu();
    scanf("%d",&caozuoshu);
    switch(caozuoshu)
    {
    case 1:
        {
        	system("cls");
            printsearchStu(&list);
            break;
        }
    case 2 :
        {
        	system("cls");
            addStuInfo(&list);
            break;
        }
    case 3 :
        {
        	system("cls");
            printSearchCls(&list);
            break;
        }
    case 4:
        {
        	system("cls");
            printchangeStuInfo(&list);
            break;
        }
    case 5:
        {
        	system("cls");
            printDeleteStuInfo(&list);
            break;
        }
    case 6:
        {
        	system("cls");
            printSearchCourse(&list);
            break;
        }
    case 7:
        {
        	system("cls");
        	int password;
			printf("请输入密码:\n");
			scanf("%d",&password);
			if(password==20020903)
			{
            printchangeStucourseInfo(&list);
            break;
        }
        else
        {
        	printf("密码错误!\n");
        	break;
		}
        }
    case 8:
	{
		sortInfo(&list);
		break;
		}    
    case 9:
        {
        	system("cls");
            exitprogame();
            break;
        }
    }
    printf("是否需要继续操作?(yes:1 / no:0 ):");
    scanf("%d",&caozuoshu);
    if(caozuoshu==0) break;
}
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值