学生信息管理系统(C语言“动态链表”、“文件”实现)第一次用链表和文件写好曲折|ू・ω・` )

第一次用链表和文件来编写学生信息管理系统 (=´ω`=)写的不好请大家见谅✧(≖ ◡ ≖✿
功能介绍
1.添加学生信息;
2.对学生信息进行排序;
3.删除学生信息;
4.查询学生信息;
5.修改学生信息;
6.输出学生信息;
7.清屏;

main函数

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "head.h"
char *file1="xinxi.txt";
char file2[100];


int main()
{
    sayhello();
    int com;
    while(1)
    {
        introduce();
        while(scanf("%d",&com)!=1)
        {
            printf("*******您输入的指令不正确请重新输入*******\n");
            fflush(stdin);//清除缓存区;
            continue;//结束本次输入进行下次输入
        }
            switch(com)
            {
                case 0:saygoodbye();exit(1);//退出
                case 1:add();break;//添加
                case 2:outputs();break;//排序
                case 3:del1();break;//删除
                case 4:find1();break;//查询
                case 5:change1();break;//修改
                case 6://清屏
                    system("cls");//系统内自带的清屏函数
                    break;
                case 7:outputs();break;//输出
                default:printf("*****************没有该指令,请重新输入*****************\n");
            }

    }
            return 0;
}

头文件 head.h

#ifndef HEAD_H_INCLUDED
#define HEAD_H_INCLUDED

#define len1 sizeof(student1)
#define len2 sizeof(student2)

struct student1
{
     int no;
     char name[30];
     char sex;
     double score[4];
     int position;
     struct student1 *next;
};

struct student2
{
    int no;
    char name[30];
    char sex;
    double score[4];
    int position;
};

typedef struct student1 student1;
typedef struct student2 student2;

extern char *file1;
extern char file2[100];

//添加学生信息.c
void add2(int num,char *file);
void add1(int num);
void add();

//尾插法.c
student1 * aaa(int m);
student1 * aaa2(FILE *fp1);

//outputs.c
void outputs();

//sort.c
void charu(student1 *phead,student1 *pnew);
student1 *zhijiepaixu(FILE *fp);
student1 * paixu();
void paimingci(student1 *phead);

//介绍.c
void introduce();

//HelloGoodbye.c
void sayhello();
void saygoodbye();

//清空链表.c
void freee(student1 *phead);

//find.c
student1 * find2(int n,student1 *phead);
void find1();

//del.c
student1 * del2(int n,student1 *phead);
void del1();

//change.c
void change2(int n,int m,student1 *phead);
void change3(int n,char *pp,student1 *phead);
void change4(int n,char sex1,student1 *phead);
void change1();
void change5(int n,double score1,student1 *phead);
void change6(int n,double score1,student1 *phead);
void change7(int n,double score1,student1 *phead);
void change8(int n,student1 *xinxi,student1 *phead);
#endif // HEAD_H_INCLUDED


页眉页脚 HelloGoodbye.c

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "head.h"
void sayhello()
{
    printf("*****************************************************************************\n");
    printf("*******************************欢迎使用本系统*********************************\n");
    printf("******************************本系统由****编写********************************\n");
    printf("******************************指导教师:**************************************\n");
    printf("*****************************************************************************\n");
    printf("\n\n\n\n\n");
}

void saygoodbye()
{
    printf("\n");
    printf("******************************************************************************\n");
    printf("*****************(≧ω≦)/****欢迎下次使用!*****(*≧▽≦)**********************\n");
    printf("******************************************************************************\n");
}



程序功能介绍函数 introduce.c

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "head.h"


void introduce()
{
    printf("*****************************本系统功能介绍***********************************\n");
    printf("*****************************1表示添加学生信息********************************\n");
    printf("*****************************2表示对学生成绩进行排序**************************\n");
    printf("*****************************3表示删除学生信息********************************\n");
    printf("*****************************4表示查询学生信息********************************\n");
    printf("*****************************5表示修改学生信息********************************\n");
    printf("*****************************6表示清屏****************************************\n");
    printf("*****************************7表示输出学生信息********************************\n");
    printf("*****************************0表示退出系统************************************\n");
}

添加学生信息 add.c

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "head.h"


void add2(int num,char *file)
{
    int com;
    student1 *phead,*p;
    FILE *fp;
    if((fp=fopen(file,"ab"))==NULL)
    {
        printf("**************************文件打开失败!!!*************************\n");
        exit(1);
    }
    phead=aaa(num);
    p=phead->next;
    printf("**************是否添加上述信息?如果是请回复0,否则回复1********************\n");
    scanf("%d",&com);
    if(com==0)
    {
         while(p!=NULL)
         {
             fwrite(p,len2,1,fp);
             p=p->next;
         }
         printf("********************添加学生信息成功!!****************************\n");
         freee(phead);
    }
    fclose(fp);
}

void add1(int num)
{
    int flag;
    printf("*************是否添加到默认文件%s中?如果是请回复0,否则回复1*********************\n",file1);
    scanf("%d",&flag);
    if(flag==0)
    {
        add2(num,file1);
    }
    else if(flag==1)
    {
        printf("*********************请输入要保存的路径,形如:C:\\Users\\Desktop\\学生信息.txt*******************\n");
        scanf("%s",file2);
        add2(num,file2);
    }
}

void add()
{

    printf("********************1表示从键盘添加学生信息******************\n");
    printf("********************2表示从文件添加学生信息******************\n");
    int com,num,m;
    student1 *phead,*p;
    char file3[100];
    FILE *fp1,*fp2;
    scanf("%d",&com);
    if(com==1)
    {
        printf("*********************请输入要添加的学生个数**************************\n");
        scanf("%d",&num);
        add1(num);
    }
    else if(com==2)
    {
         printf("*******************请输入信息来源文件地址,形如:C:\\Users\\Desktop\\学生信息.txt****************\n");
         scanf("%s",file3);
         while((fp1=fopen(file3,"rb"))==NULL)
         {
             printf("*******************文件打开失败,请再次确认文件地址再次输入,形如:C:\\Users\\Desktop\\学生信息.txt******************\n");
             scanf("%s",file3);
         }
         printf("*******************文件打开成功!!********************\n");
         printf("*********************请输入要添加文件地址,形如:C:\\Users\\Desktop\\学生信息.txt*******************\n");
         scanf("%s",file2);
         while((fp2=fopen(file2,"ab"))==NULL)
         {
             printf("**********************文件打开失败,请再次确认文件地址再次输入,形如:C:\\Users\\Desktop\\学生信息.txt****************\n");
             scanf("%s",file2);
         }
         printf("*********************打开文件成功!!********************\n");
         printf("********************请再次确认是否完成信息的插入,如果是请回复0,否则回复1******************\n");
         scanf("%d",&m);
         if(m==0)
         {
              phead=aaa2(fp1);
              p=phead->next;
              while(p->next!=NULL)
         {
             fwrite(p,len2,1,fp2);
             p=p->next;
         }
         printf("********************添加学生信息成功!!***************************8\n");
         freee(phead);
         }
         fclose(fp1);
         fclose(fp2);
    }
}

尾插法构建链表 尾插法.c

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "head.h"


student1 * aaa(int m)
{
    student1 *p;
    student1 *phead=(student1 *)malloc(len1);
    phead->next=NULL;
    p=phead;
    int i;
    printf("******************请输入学生信息,格式为:学号  姓名  性别  成绩1  成绩2  成绩3********************\n");
    for(i=1;i<=m;i++)
    {
        p->next=(student1 *)malloc(len1);
        p=p->next;
        scanf("%d %s %c %lf %lf %lf",&p->no,p->name,&p->sex,&p->score[0],&p->score[1],&p->score[2]);
        p->score[3]=p->score[0]+p->score[1]+p->score[2];
        p->next=NULL;
        if(i<m)printf("******************请继续输入学生信息,格式为:学号  姓名  性别  成绩1  成绩2  成绩3*************************\n");
    }
    return phead;
}

student1 * aaa2(FILE *fp1)
{
    rewind(fp1);
    student1 *p;
    student1 *phead=(student1 *)malloc(len1);
    p=(student1 *)malloc(len1);
    phead->next=p;
    p->next=NULL;
    while(fread(p,len2,1,fp1)!=0)//这个循环最后会多出来一个空节点,因为上一次循环内存已经申请了但最后一次未完成赋值。
    {
        p->next=(student1 *)malloc(len1);
        p=p->next;
        p->next=NULL;
    }
    return phead;
}

清空链表 清空链表.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "head.h"

void freee(student1 *phead)
{
    student1 *p=phead->next;
    student1 *q=p;
    while(q!=NULL)
    {
        q=p->next;
        free(p);
        p=q;
    }
    free(phead);
}

输出函数 outputs.c

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "head.h"
void outputs()
{
    student1 *phead;
    phead=paixu();
    student1 *p=phead->next;
    printf("学号       姓名       性别     成绩1      成绩2      成绩3      总成绩     排名\n");
    while(p!=NULL)
    {
        printf("%-10d %-10s %-8c %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-8d\n",p->no,p->name,p->sex,p->score[0],
               p->score[1],p->score[2],p->score[3],p->position);
        p=p->next;
    }
    freee(phead);
}

排序函数 sort.c

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "head.h"

void paimingci(student1 *phead)
{
    int i=1;
    student1 *p;
    p=phead->next;
    while(p!=NULL)
    {
        p->position=i;
        p=p->next;
        i++;
    }
}

void charu(student1 *phead,student1 *pnew)
{
    student1 *p=phead->next;
    student1 *q=phead;
    while(p!=NULL)
    {
        if(p->score[3]<=pnew->score[3])
        {
            q->next=pnew;
            pnew->next=p;
            pnew->position;
            return;
        }
        else
        {
            q=p;
            p=p->next;
        }
    }
    q->next=pnew;
    return;
}

student1 *zhijiepaixu(FILE *fp)
{
    student1 *phead;
    phead=(student1 *)malloc(len1);
    phead->next=NULL;
    student1 *pnew=(student1 *)malloc(len1);
    while(fread(pnew,len2,1,fp)!=0)
    {
        pnew->next=NULL;
         charu(phead,pnew);
         pnew=(student1 *)malloc(len1);
    }
    paimingci(phead);
    return phead;
}

student1 * paixu()
{
    student1 *phead;
    FILE *fp;
    printf("***************请输入目标文件的地址。形如:C:\\Users\\Desktop\\学生信息.txt*******************\n");
    scanf("%s",file2);
    while((fp=fopen(file2,"rb"))==NULL)
    {
        printf("********************文件打开失败,请再次确认文件地址再次输入,形如:C:\\Users\\Desktop\\学生信息.txt****************\n");
        scanf("%s",file2);
    }
    printf("***********************文件打开成功!!!*************************\n");
    phead=zhijiepaixu(fp);
    fclose(fp);
    return phead;
}


查询学生信息 find.c

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "head.h"

student1 * find2(int n,student1 *phead)
{
    student1 *p=phead->next;
    while(p!=NULL)
    {
        if(p->no==n)
        {
            return p;
        }
        p=p->next;
    }
    return p;
}

void find1()
{
    printf("******************请输入要查找学生信息的文件来源,形如:C:\\Users\\Desktop\\学生信息.txt*******************\n");
    scanf("%s",file2);
    student1 *phead,*p;
    int no;
    FILE *fp1;
    while((fp1=fopen(file2,"rb"))==NULL)
    {
        printf("***********************您输入的文件不正确!!请检查后重新输入!***********************\n");
        scanf("%s",file2);
    }
    printf("***************************文件打开成功!**********************\n");
    phead=zhijiepaixu(fp1);
    fclose(fp1);
    printf("******************请输入要查找学生的学号。********************\n");
    scanf("%d",&no);
    p=find2(no,phead);
    if(p==NULL)
    {
        printf("**********************未查找到该学生信息!!!请确认后再输入***************************\n");
    }
    else
    {
        printf("学号       姓名       性别     成绩1      成绩2      成绩3      总成绩     排名\n");
        printf("%-10d %-10s %-8c %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-8d\n",p->no,p->name,p->sex,p->score[0],
               p->score[1],p->score[2],p->score[3],p->position);
    }
    freee(phead);
}

删除学生信息函数 del.c

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "head.h"

student1 * del2(int n,student1 *phead)
{
    student1 *p=phead->next;
    student1 *q=phead;
    while(p!=NULL)
    {
        if(p->no==n)
        {
            q->next=p->next;
            free(p);
            p=q->next;
        }
        else
        {
            q=p;
            p=p->next;
        }
    }
    return phead;
}

void del1()
{
    printf("***************请输入要删除学生信息的文件来源,形如:C:\\Users\\Desktop\\学生信息.txt*******************\n");
    scanf("%s",file2);
    student1 *phead,*p;
    int no,flag;
    FILE *fp1;
    while((fp1=fopen(file2,"rb"))==NULL)
    {
        printf("*********************您输入的文件不正确!!请检查后重新输入!***********************\n");
        scanf("%s",file2);
    }
    printf("******************文件打开成功!********************\n");
    phead=zhijiepaixu(fp1);
    fclose(fp1);
    printf("**********************请输入要删除学生的学号。**********************\n");
    scanf("%d",&no);
    p=find2(no,phead);
    if(p==NULL)
    {
        printf("********************未查找到该学生信息!!!请确认后再输入*******************\n");
    }
    else
    {
        printf("******************您确定要删除该学生的信息吗??如果是请输入0,否则请输入1。*****************\n");
        printf("学号       姓名       性别     成绩1      成绩2      成绩3      总成绩     排名\n");
        printf("%-10d %-10s %-8c %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-8d\n",p->no,p->name,p->sex,p->score[0],
               p->score[1],p->score[2],p->score[3],p->position);
        scanf("%d",&flag);
        if(flag==1)
        {
            printf("**********************未删除该学生信息,已结束本次删除服务!*************************\n");
            freee(phead);
        }
        else if(flag==0)
        {
             phead=del2(no,phead);
             fp1=fopen(file2,"wb");
             p=phead->next;
             while(p!=NULL)
            {
                fwrite(p,len2,1,fp1);
                p=p->next;
            }
            printf("**********************删除学生信息成功!!*************************\n");
            fclose(fp1);
            freee(phead);
        }
    }
}

修改学生信息函数 change.c

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "head.h"

void change2(int n,int m,student1 *phead)
{
    student1 *p=phead->next;
    while(p!=NULL)
    {
        if(p->no==n)
        {
            p->no=m;
            break;
        }
        p=p->next;
    }
}
void change3(int n,char *pp,student1 *phead)
{
    student1 *p=phead->next;
    while(p!=NULL)
    {
        if(p->no==n)
        {
            strcpy(p->name,pp);
            break;
        }
        p=p->next;
    }
}
void change4(int n,char sex1,student1 *phead)
{
    student1 *p=phead->next;
    while(p!=NULL)
    {
        if(p->no==n)
        {
            p->sex=sex1;
            break;
        }
        p=p->next;
    }
}
void change5(int n,double score1,student1 *phead)
{
    student1 *p=phead->next;
    while(p!=NULL)
    {
        if(p->no==n)
        {
            p->score[0]=score1;
            p->score[3]=p->score[0]+p->score[1]+p->score[2];
            break;
        }
        p=p->next;
    }
}
void change6(int n,double score1,student1 *phead)
{
    student1 *p=phead->next;
    while(p!=NULL)
    {
        if(p->no==n)
        {
            p->score[1]=score1;
            p->score[3]=p->score[0]+p->score[1]+p->score[2];
            break;
        }
        p=p->next;
    }
}
void change7(int n,double score1,student1 *phead)
{
    student1 *p=phead->next;
    while(p!=NULL)
    {
        if(p->no==n)
        {
            p->score[2]=score1;
            p->score[3]=p->score[0]+p->score[1]+p->score[2];
            break;
        }
        p=p->next;
    }
}
void change8(int n,student1 *xinxi,student1 *phead)
{
    student1 *p=phead->next;
    while(p!=NULL)
    {
        if(p->no==n)
        {
            p->no=xinxi->no;strcpy(p->name,xinxi->name);/*字符串不能用等号赋值*/
            p->sex=xinxi->sex;p->score[0]=xinxi->score[0];p->score[1]=xinxi->score[1];p->score[2]=xinxi->score[2];
            p->score[3]=xinxi->score[3];
            break;
        }
        p=p->next;
    }
}

void change1()
{
    printf("**********************请输入要更改学生信息的文件来源,形如:C:\\Users\\Desktop\\学生信息.txt*****************\n");
    scanf("%s",file2);
    student1 *phead,*p;
    FILE *fp;
    double score1;
    student1 *xinxi=(student1 *)malloc(len1);
    char name1[30],sex1;
    int no,com,no1,flag;
    while((fp=fopen(file2,"rb"))==NULL)
    {
        printf("********************您输入的文件不正确!!请检查后重新输入!***********************\n");
        scanf("%s",file2);
    }
    printf("******************文件打开成功!!!***********************\n");
    phead=zhijiepaixu(fp);
    fclose(fp);
    printf("*********************请输入要更改学生的学号********************\n");
    scanf("%d",&no);
    p=find2(no,phead);
    if(p==NULL)
    {
        printf("************************未查找到该学生信息!!!请确认后再输入***********************\n");
    }
    else
    {
        printf("****************您确定要修改该学生的信息吗??如果是请输入0,否则请输入1。*****************\n");
        printf("学号       姓名       性别     成绩1      成绩2      成绩3      总成绩     排名\n");
        printf("%-10d %-10s %-8c %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-8d\n",p->no,p->name,p->sex,p->score[0],
               p->score[1],p->score[2],p->score[3],p->position);
        scanf("%d",&flag);
        if(flag==1)
        {
            printf("**********************未修改该学生信息,已结束本次服务!********************\n");
            freee(phead);
        }
        else if(flag==0)
        {
            printf("**************************您要修改该学生的哪个信息???******************************\n");
            printf("**************************1表示修改该学生的学号***************************************\n");
            printf("**************************2表示修改该学生的姓名***************************************\n");
            printf("**************************3表示修改该学生的性别***************************************\n");
            printf("**************************4表示修改该学生的成绩1**************************************\n");
            printf("**************************5表示修改该学生的成绩2**************************************\n");
            printf("**************************6表示修改该学生的成绩3**************************************\n");
            printf("**************************7表示修改该学生的全部信息***********************************\n");
            scanf("%d",&com);
            switch(com)
            {
            case 1:
            {
                printf("*******************请输入该学生的新学号******************\n");
                scanf("%d",&no1);
                change2(no,no1,phead);
                fp=fopen(file2,"wb");
                p=phead->next;
                while(p!=NULL)
                {
                    fwrite(p,len2,1,fp);
                    p=p->next;
                }
                printf("***********************修改学生信息成功!!***********************\n");
                fclose(fp);
                freee(phead);
                break;
            }
            case 2:
            {
                printf("**************************请输入该学生的新姓名***********************\n");
                scanf("%s",name1);
                change3(no,name1,phead);
                fp=fopen(file2,"wb");
                p=phead->next;
                while(p!=NULL)
                {
                    fwrite(p,len2,1,fp);
                    p=p->next;
                }
                printf("***************************修改学生信息成功!!*********************\n");
                fclose(fp);
                freee(phead);
                break;
            }
            case 3:
            {
                printf("************************请输入该学生修改后的性别****************************8\n");
                fflush(stdin);
                //getchar();
                scanf("%c",&sex1);//因为上一个数据输入完后会在缓存区存在一个回车,因此当缓存区有内容时该条语句就会直接读取缓冲区的内容;
                                //所以sex1存的就是一个回车。所以要在此之前用getchar()吞掉,或在此之前用fflush(stdin)清楚缓存区。
                change4(no,sex1,phead);
                fp=fopen(file2,"wb");
                p=phead->next;
                while(p!=NULL)
                {
                    fwrite(p,len2,1,fp);
                    p=p->next;
                }
                printf("************************修改学生信息成功!!*************************\n");
                fclose(fp);
                freee(phead);
                break;
            }
            case 4:
            {
                printf("*************************请重新输入该学生的成绩1***********************\n");
                scanf("%lf",&score1);
                change5(no,score1,phead);
                fp=fopen(file2,"wb");
                p=phead->next;
                while(p!=NULL)
                {
                    fwrite(p,len2,1,fp);
                    p=p->next;
                }
                printf("*********************修改学生信息成功!!************************\n");
                fclose(fp);
                freee(phead);
                break;
            }
            case 5:
            {
                printf("***********************请重新输入该学生的成绩2***********************\n");
                scanf("%lf",&score1);
                change6(no,score1,phead);
                fp=fopen(file2,"wb");
                p=phead->next;
                while(p!=NULL)
                {
                    fwrite(p,len2,1,fp);
                    p=p->next;
                }
                printf("***************************修改学生信息成功!!*************************\n");
                fclose(fp);
                freee(phead);
                break;
            }
            case 6:
            {
                printf("************************请重新输入该学生的成绩3****************************\n");
                scanf("%lf",&score1);
                change7(no,score1,phead);
                fp=fopen(file2,"wb");
                p=phead->next;
                while(p!=NULL)
                {
                    fwrite(p,len2,1,fp);
                    p=p->next;
                }
                printf("************************修改学生信息成功!!**************************\n");
                fclose(fp);
                freee(phead);
                break;
            }
            case 7:
            {
                printf("***********************请重新输入该学生的全部信息***********************\n");
                printf("****************格式为:学号  姓名  性别  成绩1  成绩2  成绩3***********\n");
                scanf("%d %s %c %lf %lf %lf",&xinxi->no,xinxi->name,&xinxi->sex,&xinxi->score[0],&xinxi->score[1],
                      &xinxi->score[2]);
                      xinxi->score[3]=xinxi->score[0]+xinxi->score[1]+xinxi->score[2];
                change8(no,xinxi,phead);
                fp=fopen(file2,"wb");
                p=phead->next;
                while(p!=NULL)
                {
                    fwrite(p,len2,1,fp);
                    p=p->next;
                }
                printf("***********************修改学生信息成功!!************************\n");
                fclose(fp);
                freee(phead);
                break;
            }
            default :printf("**************************您输入有误,没有该操作!!!**********************\n");break;
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值