精华内容
下载资源
问答
  • 最近在复习数据结构,早上刚复习完链表,就想到了学生信息管理系统这个经典的大作业,然后呢,花了一早上加一中午的功夫给重新实现了一遍,里面可能会有的不好的地方,但也代表了我实现的一些想法,在这里我将分享...

    04b9893b831582ff6b083cddfaa94013.png

    最近在复习数据结构,早上刚复习完链表,就想到了学生信息管理系统这个经典的大作业,然后呢,花了一早上加一中午的功夫给重新实现了一遍,里面可能会有写的不好的地方,但也代表了我实现的一些想法,在这里我将分享出来。

    我是在Ubuntu上用vim写的,当然了这些代码window下也可以运行。文章最后有完整代码。

    一 实现功能

    1、查看学生信息

    2、添加学生信息。

    3、删除学生信息

    4、修改学生信息

    5、保存学生信息到文件

    6、刷新学生信息(从文件中恢复学生信息)

    0、退出系统

    二 表示学生的数据结构

    struct student
    {
      char name[10]; //名字
      int score;      //分数                                                                                                                                       
      int number;     //序号
      int age;        //年龄
    };
    struct LNode
    {
      struct student data; //数据域
      struct LNode *next;  //指针域
    };
    typedef struct LNode LinkList;

    三 实现菜单

    void meum()
    {
      printf("n   *****************************   n");
      printf("         学生信息管理系统          n");
      printf("   *****************************   n");
      printf("           系统菜单功能            n");
      printf("   *****************************   n");
      printf("          1.查看学生信息           n");
      printf("          2.添加学生信息           n");
      printf("          3.删除学生信息           n");
      printf("          4.修改学生信息           n");
      printf("          5.保存学生信息           n");
      printf("          6.刷新学生信息           n");
      printf("          0.退出系统               n");
    }
    

    四 实现增加学生的功能

    void creat_node(LinkList *L)
    {
      char name;
      LinkList *node=NULL;
      LinkList *temp=L->next;  //作为链表连接的中间点
      node=(LinkList *)malloc(sizeof(LinkList));  //分配内存
      if(node==NULL)
      {
        printf("分配普通节点内存出错!");
        exit(1);
      }
      memset(node,0,sizeof(LinkList));
      printf("n请输入学生序号:");
      scanf("%d",&node->data.number);
      printf("n请输入学生名:");
      scanf("%s",node->data.name);
      printf("n请输入学生成绩:");
      scanf("%d",&node->data.score);
      printf("n请输入学生年龄:");
      scanf("%d",&node->data.age);
    
      L->next=node;                                                                                                                                          
      node->next=temp;
    }
    

    五 显示学生信息

    void show_student(LinkList *L)
    {
      LinkList *p=L->next;
      int i=0;
      printf("n    **************************      n");
      printf("            学生信息                n");
      printf("    **************************      n");
      printf("   序号    姓名    成绩    年龄 n");
      while(p)
      {
        printf("      %d      %s      %d      %d     n",p->data.number,p->data.name,p->data.score,p->data.age);
        i++;                                                                                                                                                 
        p=p->next;
      }
    }
    

    六 删除学生

    可以选择

    1、按序号删除。

    2、按姓名删除。

    void delete_student(LinkList *L)
    {
      int x=0;
      int number;
      char name[10];
      LinkList *temp,*pre;
      temp=L->next;
      while(1)
      {
        printf("n    请选择:");
        printf("n    1.按序号删除!");
        printf("n    2.按姓名删除!");
        printf("n    请输入选择:");
        scanf("%d",&x);
        if(x==1 || x==2)
          break;
        else 
          printf("n   输入错误,请重新输入!");
      }
      if(x==1)            //根据输入的序号找到学生并删除
      {
        printf("n    请输入要删除的学生序号:");
        scanf("%d",&number);
        while(temp->data.number!=number && temp->next!=NULL)
        {
          pre=temp;
          temp=temp->next;
        }
        if(temp->data.number==number)
        {
          pre->next=temp->next;
          free(temp);
        }
        else
        {
          printf("n    没有所要删除的学生序号!");
        }
      }
      else if(x==2)      //根据输入的姓名找到学生并删除
      {
        printf("n     请输入要删除的学生名字:");
        scanf("%s",name);
        while(strcmp(temp->data.name,name)!=0 && temp->next!=NULL)
        {
          pre=temp;
          temp=temp->next;
        }
        if(strcmp(temp->data.name,name)==0)
        {
          pre->next=temp->next;
          free(temp);
        }
        else
        {
          printf("n     没有要删除的学生姓名!");
        }
      }
    }
    

    七 修改学生信息

    首先找到学生,然后对找到的学生信息进行修改。

    可以选择按序号和按姓名来找学生。

    找到学生后,可以选择修改学生的任意一项信息。

    void modify_student(LinkList *L)
    {
      int x=0;
      int number;
      char name[10];
      LinkList *temp;
      temp=L->next;
      while(1)
      {
        printf("n    请选择:");
        printf("n    1.知道要修改学生的序号!");
        printf("n    2.知道要修改学生的名字!");                                                                                                             
        printf("n    请输入选择:");
        scanf("%d",&x);
        if(x==1 || x==2)
          break;
        else
          printf("n   输入错误,请重新输入!");
      }
      if(x==1)
      {
        printf("n    请输入要修改学生的序号:");
        scanf("%d",&number);
        while(temp->data.number!=number && temp->next!=NULL)
        {
          temp=temp->next;
        }
        if(temp->data.number==number)
        {
          printf("n     已经找到要修改学生的信息!");
        }
        else
        {
          printf("n    没有要修改学生的序号!");
        }
      }
      else if(x==2)
      {
        printf("n     请输入要修改学生的名字:");
        scanf("%s",name);
        while(strcmp(temp->data.name,name)!=0 && temp->next!=NULL)
        {
          temp=temp->next;
        }
        if(strcmp(temp->data.name,name)==0)
        {
          printf("n     已经找到要修改学生的信息!");
        }
        else
        {
          printf("n     没有要修改学生的姓名!");
        }
      }
      printf("n     ************************");
      printf("n   姓名:%s  序号:%d  成绩:%d  年龄:%d",temp->data.name,temp->data.number,temp->data.score,temp->data.age);
      do{
        printf("n     请选择:");
        printf("n     1.修改序号!");
        printf("n     2.修改名字!");
        printf("n     3.修改成绩!");
        printf("n     4.修改年龄!");
        printf("n     请输入选择:");
        scanf("%d",&x);
      }while(x<1 || x>4);
      if(x==1)
      {
        printf("n     请输入修改后的序号:");
        scanf("%d",&temp->data.number);
      }
      if(x==2)
      {
        printf("n     请输入修改后的名字:");
        scanf("%s",temp->data.name);
      }
      if(x==3)
      {
        printf("n     请输入修改后的成绩:");
        scanf("%d",&temp->data.score);
      }
      if(x==4)
      {
        printf("n     请输入修改后的年龄:");
        scanf("%d",&temp->data.age);
      }
    
    }
    

    八 保存到文件

    void save(LinkList *L)
    {
      FILE *fp;
      int i=0;
      LinkList *temp;                                                                                                                                        
      temp=L->next;
      if((fp=fopen("student.txt","a"))==NULL)
      {
        printf("n     无法打开文件!");
        exit(1);
      } 
      while(temp!=NULL)
      {
        i++;
        fprintf(fp,"%d %s %d %d n",temp->data.number,temp->data.name,temp->data.score,temp->data.age);
        printf("n     第%d个已经保存!",i);
        temp=temp->next;
      }
      fclose(fp);
    }
    

    九 从文件中恢复

    void refresh(LinkList *L)
    {
      FILE *fp;
      LinkList *node=NULL;                                                          
      LinkList *temp=L->next;
      node=(LinkList *)malloc(sizeof(LinkList));
      if(node==NULL)
      {
        printf("分配普通节点内存出错!");
        exit(1);
      }
      memset(node,0,sizeof(LinkList));  
      fp=fopen("student.txt","r");
      if(fp==NULL)
      {
        printf("n     无法打开文件!");
        exit(1);
      }
      while(!feof(fp))
      {
        fscanf(fp,"%d %s %d %d",&node->data.number,node->data.name,&node->data.score,&node->data.age);
        L->next=node;
        node->next=temp;
        temp=node;
        node=(LinkList *)malloc(sizeof(LinkList));
        if(node==NULL)
        {
          printf("分配普通节点内存出错!");
          exit(1);
        }
        memset(node,0,sizeof(LinkList));
      }                                                                                                                                                      
      printf("n     已经成功刷新学生信息!");
    }
    

    十 主函数

    主函数中先创建一个头节点(不保存学生信息,便于操作空链表),然后进入主菜单,功能选择模块被我独立成一个函数,代码在主函数后面。

    void main()
    { 
      int i;
      LinkList *L=NULL;
      L=(LinkList *)malloc(sizeof(LinkList));
      if(L==NULL)
      { 
        printf("分配头节点内存出错!");
        exit(1);
      }
      memset(L,0,sizeof(LinkList));
      L->next=NULL;
      
      int stop=1;
      while(1)
      { 
        meum();
        choice(&stop,L);
        if(stop==0)
          break;
        printf("n     下一步操作:");
        printf("n     1.返回主界面");
        printf("n     2.退出系统");
        printf("n     请输入操作:");
        scanf("%d",&i);
        if(i==2)
          break;
      }
    }
    void choice(int *stop,LinkList *L)
    {
      int num;
      printf("nn          请输入菜单选项:");
      scanf("%d",&num);
      switch (num)
      {
        case 0: *stop=0; break;
        case 1: show_student(L); break;
        case 2: creat_node(L); break;
        case 3: delete_student(L); break;
        case 4: modify_student(L); break;
        case 5: save(L); break;
        case 6: refresh(L); break;
        default: printf("      请在0-6中间选择n");
      }
    }
    

    十一 优化建议

    上面有一些写法可以进行优化的,但是因为这只是一个小项目没必要分那么多函数(分了引用次数也十分有限),并且这样更符合我的思路(一功能一模块),就没有进行优化。可以优化的如下:

    1、将有复用的代码段独立写成函数,减少代码函数,例如选择和分配节点空间那里独立成函数。

    2、将部分较长的函数进行功能分割,便于阅读。

    十二 扩展建议

    一、增加排序功能。

    二、增加代码修改后写回文件时的检验是否修改的功能。

    三、扩展界面。

    十四 全部代码

    #include<stdio.h>                                                                                                                                        
    #include<stdlib.h>
    #include<string.h>
    
    struct student
    { 
      char name[10];
      int score;
      int number;
      int age;
    };
    struct LNode
    { 
      struct student data;
      struct LNode *next;
    };
    typedef struct LNode LinkList;
    
    
    void meum();
    void choice(int *stop,LinkList *L);
    void creat_node(LinkList *L);
    void show_student(LinkList *L);
    void delete_student(LinkList *L);
    void modify_student(LinkList *L);
    void save(LinkList *L);
    void refresh(LinkList *L);
    
    void main()
    { 
      int i;
      LinkList *L=NULL;
      L=(LinkList *)malloc(sizeof(LinkList));
      if(L==NULL)
      { 
        printf("分配头节点内存出错!");
        exit(1);
      }
      memset(L,0,sizeof(LinkList));
      L->next=NULL;
      
      int stop=1;
      while(1)
      { 
        meum();
        choice(&stop,L);
        if(stop==0)
          break;
        printf("n     下一步操作:");
        printf("n     1.返回主界面");
        printf("n     2.退出系统");
        printf("n     请输入操作:");
        scanf("%d",&i);
        if(i==2)
          break;
      }
    }
    
    void choice(int *stop,LinkList *L)
    {
      int num;
      printf("nn          请输入菜单选项:");
      scanf("%d",&num);
      switch (num)
      {
        case 0: *stop=0; break;
        case 1: show_student(L); break;
        case 2: creat_node(L); break;
        case 3: delete_student(L); break;
        case 4: modify_student(L); break;
        case 5: save(L); break;
        case 6: refresh(L); break;
        default: printf("      请在0-6中间选择n");
      }
    }
    
    void meum()
    {
      printf("n   *****************************   n");
      printf("         学生信息管理系统          n");
      printf("   *****************************   n");
      printf("           系统菜单功能            n");
      printf("   *****************************   n");
      printf("          1.查看学生信息           n");
      printf("          2.添加学生信息           n");
      printf("          3.删除学生信息           n");
      printf("          4.修改学生信息           n");
      printf("          5.保存学生信息           n");
      printf("          6.刷新学生信息           n");
      printf("          0.退出系统               n");
    }
    
    void creat_node(LinkList *L)
    {
      char name;
      LinkList *node=NULL;
      LinkList *temp=L->next;  //作为链表连接的中间点
      node=(LinkList *)malloc(sizeof(LinkList));  //分配内存
      if(node==NULL)
      {
        printf("分配普通节点内存出错!");
        exit(1);
      }
      memset(node,0,sizeof(LinkList));
      printf("n请输入学生序号:");
      scanf("%d",&node->data.number);
      printf("n请输入学生名:");
      scanf("%s",node->data.name);
      printf("n请输入学生成绩:");
      scanf("%d",&node->data.score);
      printf("n请输入学生年龄:");
      scanf("%d",&node->data.age);
    
      L->next=node;                                                                                                                                          
      node->next=temp;
    }
    
    void show_student(LinkList *L)
    {
      LinkList *p=L->next;
      int i=0;
      printf("n    **************************      n");
      printf("            学生信息                n");
      printf("    **************************      n");
      printf("   序号    姓名    成绩    年龄 n");
      while(p)
      {
        printf("      %d      %s      %d      %d     n",p->data.number,p->data.name,p->data.score,p->data.age);
        i++;                                                                                                                                                 
        p=p->next;
      }
    }
    
    void delete_student(LinkList *L)
    {
      int x=0;
      int number;
      char name[10];
      LinkList *temp,*pre;
      temp=L->next;
      while(1)
      {
        printf("n    请选择:");
        printf("n    1.按序号删除!");
        printf("n    2.按姓名删除!");
        printf("n    请输入选择:");
        scanf("%d",&x);
        if(x==1 || x==2)
          break;
        else 
          printf("n   输入错误,请重新输入!");
      }
      if(x==1)            //根据输入的序号找到学生并删除
      {
        printf("n    请输入要删除的学生序号:");
        scanf("%d",&number);
        while(temp->data.number!=number && temp->next!=NULL)
        {
          pre=temp;
          temp=temp->next;
        }
        if(temp->data.number==number)
        {
          pre->next=temp->next;
          free(temp);
        }
        else
        {
          printf("n    没有所要删除的学生序号!");
        }
      }
      else if(x==2)      //根据输入的姓名找到学生并删除
      {
        printf("n     请输入要删除的学生名字:");
        scanf("%s",name);
        while(strcmp(temp->data.name,name)!=0 && temp->next!=NULL)
        {
          pre=temp;
          temp=temp->next;
        }
        if(strcmp(temp->data.name,name)==0)
        {
          pre->next=temp->next;
          free(temp);
        }
        else
        {
          printf("n     没有要删除的学生姓名!");
        }
      }
    }
    
    void modify_student(LinkList *L)
    {
      int x=0;
      int number;
      char name[10];
      LinkList *temp;
      temp=L->next;
      while(1)
      {
        printf("n    请选择:");
        printf("n    1.知道要修改学生的序号!");
        printf("n    2.知道要修改学生的名字!");                                                                                                             
        printf("n    请输入选择:");
        scanf("%d",&x);
        if(x==1 || x==2)
          break;
        else
          printf("n   输入错误,请重新输入!");
      }
      if(x==1)
      {
        printf("n    请输入要修改学生的序号:");
        scanf("%d",&number);
        while(temp->data.number!=number && temp->next!=NULL)
        {
          temp=temp->next;
        }
        if(temp->data.number==number)
        {
          printf("n     已经找到要修改学生的信息!");
        }
        else
        {
          printf("n    没有要修改学生的序号!");
        }
      }
      else if(x==2)
      {
        printf("n     请输入要修改学生的名字:");
        scanf("%s",name);
        while(strcmp(temp->data.name,name)!=0 && temp->next!=NULL)
        {
          temp=temp->next;
        }
        if(strcmp(temp->data.name,name)==0)
        {
          printf("n     已经找到要修改学生的信息!");
        }
        else
        {
          printf("n     没有要修改学生的姓名!");
        }
      }
      printf("n     ************************");
      printf("n   姓名:%s  序号:%d  成绩:%d  年龄:%d",temp->data.name,temp->data.number,temp->data.score,temp->data.age);
      do{
        printf("n     请选择:");
        printf("n     1.修改序号!");
        printf("n     2.修改名字!");
        printf("n     3.修改成绩!");
        printf("n     4.修改年龄!");
        printf("n     请输入选择:");
        scanf("%d",&x);
      }while(x<1 || x>4);
      if(x==1)
      {
        printf("n     请输入修改后的序号:");
        scanf("%d",&temp->data.number);
      }
      if(x==2)
      {
        printf("n     请输入修改后的名字:");
        scanf("%s",temp->data.name);
      }
      if(x==3)
      {
        printf("n     请输入修改后的成绩:");
        scanf("%d",&temp->data.score);
      }
      if(x==4)
      {
        printf("n     请输入修改后的年龄:");
        scanf("%d",&temp->data.age);
      }
    
    }
    
    void save(LinkList *L)
    {
      FILE *fp;
      int i=0;
      LinkList *temp;                                                                                                                                        
      temp=L->next;
      if((fp=fopen("student.txt","a"))==NULL)
      {
        printf("n     无法打开文件!");
        exit(1);
      } 
      while(temp!=NULL)
      {
        i++;
        fprintf(fp,"%d %s %d %d n",temp->data.number,temp->data.name,temp->data.score,temp->data.age);
        printf("n     第%d个已经保存!",i);
        temp=temp->next;
      }
      fclose(fp);
    }
    
    void refresh(LinkList *L)
    {
      FILE *fp;
      LinkList *node=NULL;                                                          
      LinkList *temp=L->next;
      node=(LinkList *)malloc(sizeof(LinkList));
      if(node==NULL)
      {
        printf("分配普通节点内存出错!");
        exit(1);
      }
      memset(node,0,sizeof(LinkList));  
      fp=fopen("student.txt","r");
      if(fp==NULL)
      {
        printf("n     无法打开文件!");
        exit(1);
      }
      while(!feof(fp))
      {
        fscanf(fp,"%d %s %d %d",&node->data.number,node->data.name,&node->data.score,&node->data.age);
        L->next=node;
        node->next=temp;
        temp=node;
        node=(LinkList *)malloc(sizeof(LinkList));
        if(node==NULL)
        {
          printf("分配普通节点内存出错!");
          exit(1);
        }
        memset(node,0,sizeof(LinkList));
      }                                                                                                                                                      
      printf("n     已经成功刷新学生信息!");
    }
    展开全文
  • (使用C语言)(基本思路已给出) 基于链表的学生成绩管理系统(1)输入5个学生3门课的成绩存入链表中; (2)输出学生信息; (3)求每个学生的平均分; (4)输入一个学号num,查找其学号等于num的学生。要求:用链表存放学生...
  • 最近在复习数据结构,早上刚复习完链表,就想到了学生信息管理系统这个经典的大作业,然后呢,花了一早上加一中午的功夫给重新实现了一遍,里面可能会有的不好的地方,但也代表了我实现的一些想法,在这里我将分享...

    bab4a416312915f5a4b34ff6a8503dd1.png

    最近在复习数据结构,早上刚复习完链表,就想到了学生信息管理系统这个经典的大作业,然后呢,花了一早上加一中午的功夫给重新实现了一遍,里面可能会有写的不好的地方,但也代表了我实现的一些想法,在这里我将分享出来。

    我是在Ubuntu上用vim写的,当然了这些代码window下也可以运行。文章最后有完整代码。

    一 实现功能

    1、查看学生信息

    2、添加学生信息。

    3、删除学生信息

    4、修改学生信息

    5、保存学生信息到文件

    6、刷新学生信息(从文件中恢复学生信息)

    0、退出系统

    二 表示学生的数据结构

    struct 

    三 实现菜单

    void meum()
    {
      printf("n   *****************************   n");
      printf("         学生信息管理系统          n");
      printf("   *****************************   n");
      printf("           系统菜单功能            n");
      printf("   *****************************   n");
      printf("          1.查看学生信息           n");
      printf("          2.添加学生信息           n");
      printf("          3.删除学生信息           n");
      printf("          4.修改学生信息           n");
      printf("          5.保存学生信息           n");
      printf("          6.刷新学生信息           n");
      printf("          0.退出系统               n");
    }
    

    四 实现增加学生的功能

    void creat_node(LinkList *L)
    {
      char name;
      LinkList *node=NULL;
      LinkList *temp=L->next;  //作为链表连接的中间点
      node=(LinkList *)malloc(sizeof(LinkList));  //分配内存
      if(node==NULL)
      {
        printf("分配普通节点内存出错!");
        exit(1);
      }
      memset(node,0,sizeof(LinkList));
      printf("n请输入学生序号:");
      scanf("%d",&node->data.number);
      printf("n请输入学生名:");
      scanf("%s",node->data.name);
      printf("n请输入学生成绩:");
      scanf("%d",&node->data.score);
      printf("n请输入学生年龄:");
      scanf("%d",&node->data.age);
    
      L->next=node;                                                                                                                                          
      node->next=temp;
    }
    

    五 显示学生信息

    void show_student(LinkList *L)
    {
      LinkList *p=L->next;
      int i=0;
      printf("n    **************************      n");
      printf("            学生信息                n");
      printf("    **************************      n");
      printf("   序号    姓名    成绩    年龄 n");
      while(p)
      {
        printf("      %d      %s      %d      %d     n",p->data.number,p->data.name,p->data.score,p->data.age);
        i++;                                                                                                                                                 
        p=p->next;
      }
    }
    

    六 删除学生

    可以选择

    1、按序号删除。

    2、按姓名删除。

    void delete_student(LinkList *L)
    {
      int x=0;
      int number;
      char name[10];
      LinkList *temp,*pre;
      temp=L->next;
      while(1)
      {
        printf("n    请选择:");
        printf("n    1.按序号删除!");
        printf("n    2.按姓名删除!");
        printf("n    请输入选择:");
        scanf("%d",&x);
        if(x==1 || x==2)
          break;
        else 
          printf("n   输入错误,请重新输入!");
      }
      if(x==1)            //根据输入的序号找到学生并删除
      {
        printf("n    请输入要删除的学生序号:");
        scanf("%d",&number);
        while(temp->data.number!=number && temp->next!=NULL)
        {
          pre=temp;
          temp=temp->next;
        }
        if(temp->data.number==number)
        {
          pre->next=temp->next;
          free(temp);
        }
        else
        {
          printf("n    没有所要删除的学生序号!");
        }
      }
      else if(x==2)      //根据输入的姓名找到学生并删除
      {
        printf("n     请输入要删除的学生名字:");
        scanf("%s",name);
        while(strcmp(temp->data.name,name)!=0 && temp->next!=NULL)
        {
          pre=temp;
          temp=temp->next;
        }
        if(strcmp(temp->data.name,name)==0)
        {
          pre->next=temp->next;
          free(temp);
        }
        else
        {
          printf("n     没有要删除的学生姓名!");
        }
      }
    }
    

    七 修改学生信息

    首先找到学生,然后对找到的学生信息进行修改。

    可以选择按序号和按姓名来找学生。

    找到学生后,可以选择修改学生的任意一项信息。

    void modify_student(LinkList *L)
    {
      int x=0;
      int number;
      char name[10];
      LinkList *temp;
      temp=L->next;
      while(1)
      {
        printf("n    请选择:");
        printf("n    1.知道要修改学生的序号!");
        printf("n    2.知道要修改学生的名字!");                                                                                                             
        printf("n    请输入选择:");
        scanf("%d",&x);
        if(x==1 || x==2)
          break;
        else
          printf("n   输入错误,请重新输入!");
      }
      if(x==1)
      {
        printf("n    请输入要修改学生的序号:");
        scanf("%d",&number);
        while(temp->data.number!=number && temp->next!=NULL)
        {
          temp=temp->next;
        }
        if(temp->data.number==number)
        {
          printf("n     已经找到要修改学生的信息!");
        }
        else
        {
          printf("n    没有要修改学生的序号!");
        }
      }
      else if(x==2)
      {
        printf("n     请输入要修改学生的名字:");
        scanf("%s",name);
        while(strcmp(temp->data.name,name)!=0 && temp->next!=NULL)
        {
          temp=temp->next;
        }
        if(strcmp(temp->data.name,name)==0)
        {
          printf("n     已经找到要修改学生的信息!");
        }
        else
        {
          printf("n     没有要修改学生的姓名!");
        }
      }
      printf("n     ************************");
      printf("n   姓名:%s  序号:%d  成绩:%d  年龄:%d",temp->data.name,temp->data.number,temp->data.score,temp->data.age);
      do{
        printf("n     请选择:");
        printf("n     1.修改序号!");
        printf("n     2.修改名字!");
        printf("n     3.修改成绩!");
        printf("n     4.修改年龄!");
        printf("n     请输入选择:");
        scanf("%d",&x);
      }while(x<1 || x>4);
      if(x==1)
      {
        printf("n     请输入修改后的序号:");
        scanf("%d",&temp->data.number);
      }
      if(x==2)
      {
        printf("n     请输入修改后的名字:");
        scanf("%s",temp->data.name);
      }
      if(x==3)
      {
        printf("n     请输入修改后的成绩:");
        scanf("%d",&temp->data.score);
      }
      if(x==4)
      {
        printf("n     请输入修改后的年龄:");
        scanf("%d",&temp->data.age);
      }
    
    }
    

    八 保存到文件

    void save(LinkList *L)
    {
      FILE *fp;
      int i=0;
      LinkList *temp;                                                                                                                                        
      temp=L->next;
      if((fp=fopen("student.txt","a"))==NULL)
      {
        printf("n     无法打开文件!");
        exit(1);
      } 
      while(temp!=NULL)
      {
        i++;
        fprintf(fp,"%d %s %d %d n",temp->data.number,temp->data.name,temp->data.score,temp->data.age);
        printf("n     第%d个已经保存!",i);
        temp=temp->next;
      }
      fclose(fp);
    }
    

    九 从文件中恢复

    void refresh(LinkList *L)
    {
      FILE *fp;
      LinkList *node=NULL;                                                          
      LinkList *temp=L->next;
      node=(LinkList *)malloc(sizeof(LinkList));
      if(node==NULL)
      {
        printf("分配普通节点内存出错!");
        exit(1);
      }
      memset(node,0,sizeof(LinkList));  
      fp=fopen("student.txt","r");
      if(fp==NULL)
      {
        printf("n     无法打开文件!");
        exit(1);
      }
      while(!feof(fp))
      {
        fscanf(fp,"%d %s %d %d",&node->data.number,node->data.name,&node->data.score,&node->data.age);
        L->next=node;
        node->next=temp;
        temp=node;
        node=(LinkList *)malloc(sizeof(LinkList));
        if(node==NULL)
        {
          printf("分配普通节点内存出错!");
          exit(1);
        }
        memset(node,0,sizeof(LinkList));
      }                                                                                                                                                      
      printf("n     已经成功刷新学生信息!");
    }
    

    十 主函数

    主函数中先创建一个头节点(不保存学生信息,便于操作空链表),然后进入主菜单,功能选择模块被我独立成一个函数,代码在主函数后面。

    void main()
    { 
      int i;
      LinkList *L=NULL;
      L=(LinkList *)malloc(sizeof(LinkList));
      if(L==NULL)
      { 
        printf("分配头节点内存出错!");
        exit(1);
      }
      memset(L,0,sizeof(LinkList));
      L->next=NULL;
      
      int stop=1;
      while(1)
      { 
        meum();
        choice(&stop,L);
        if(stop==0)
          break;
        printf("n     下一步操作:");
        printf("n     1.返回主界面");
        printf("n     2.退出系统");
        printf("n     请输入操作:");
        scanf("%d",&i);
        if(i==2)
          break;
      }
    }
    void choice(int *stop,LinkList *L)
    {
      int num;
      printf("nn          请输入菜单选项:");
      scanf("%d",&num);
      switch (num)
      {
        case 0: *stop=0; break;
        case 1: show_student(L); break;
        case 2: creat_node(L); break;
        case 3: delete_student(L); break;
        case 4: modify_student(L); break;
        case 5: save(L); break;
        case 6: refresh(L); break;
        default: printf("      请在0-6中间选择n");
      }
    }
    

    十一 优化建议

    上面有一些写法可以进行优化的,但是因为这只是一个小项目没必要分那么多函数(分了引用次数也十分有限),并且这样更符合我的思路(一功能一模块),就没有进行优化。可以优化的如下:

    1、将有复用的代码段独立写成函数,减少代码函数,例如选择和分配节点空间那里独立成函数。

    2、将部分较长的函数进行功能分割,便于阅读。

    十二 扩展建议

    一、增加排序功能。

    二、增加代码修改后写回文件时的检验是否修改的功能。

    三、扩展界面。

    十四 全部代码

    #include<stdio.h>                                                                                                                                        
    #include<stdlib.h>
    #include<string.h>
    
    struct student
    { 
      char name[10];
      int score;
      int number;
      int age;
    };
    struct LNode
    { 
      struct student data;
      struct LNode *next;
    };
    typedef struct LNode LinkList;
    
    
    void meum();
    void choice(int *stop,LinkList *L);
    void creat_node(LinkList *L);
    void show_student(LinkList *L);
    void delete_student(LinkList *L);
    void modify_student(LinkList *L);
    void save(LinkList *L);
    void refresh(LinkList *L);
    
    void main()
    { 
      int i;
      LinkList *L=NULL;
      L=(LinkList *)malloc(sizeof(LinkList));
      if(L==NULL)
      { 
        printf("分配头节点内存出错!");
        exit(1);
      }
      memset(L,0,sizeof(LinkList));
      L->next=NULL;
      
      int stop=1;
      while(1)
      { 
        meum();
        choice(&stop,L);
        if(stop==0)
          break;
        printf("n     下一步操作:");
        printf("n     1.返回主界面");
        printf("n     2.退出系统");
        printf("n     请输入操作:");
        scanf("%d",&i);
        if(i==2)
          break;
      }
    }
    
    void choice(int *stop,LinkList *L)
    {
      int num;
      printf("nn          请输入菜单选项:");
      scanf("%d",&num);
      switch (num)
      {
        case 0: *stop=0; break;
        case 1: show_student(L); break;
        case 2: creat_node(L); break;
        case 3: delete_student(L); break;
        case 4: modify_student(L); break;
        case 5: save(L); break;
        case 6: refresh(L); break;
        default: printf("      请在0-6中间选择n");
      }
    }
    
    void meum()
    {
      printf("n   *****************************   n");
      printf("         学生信息管理系统          n");
      printf("   *****************************   n");
      printf("           系统菜单功能            n");
      printf("   *****************************   n");
      printf("          1.查看学生信息           n");
      printf("          2.添加学生信息           n");
      printf("          3.删除学生信息           n");
      printf("          4.修改学生信息           n");
      printf("          5.保存学生信息           n");
      printf("          6.刷新学生信息           n");
      printf("          0.退出系统               n");
    }
    
    void creat_node(LinkList *L)
    {
      char name;
      LinkList *node=NULL;
      LinkList *temp=L->next;  //作为链表连接的中间点
      node=(LinkList *)malloc(sizeof(LinkList));  //分配内存
      if(node==NULL)
      {
        printf("分配普通节点内存出错!");
        exit(1);
      }
      memset(node,0,sizeof(LinkList));
      printf("n请输入学生序号:");
      scanf("%d",&node->data.number);
      printf("n请输入学生名:");
      scanf("%s",node->data.name);
      printf("n请输入学生成绩:");
      scanf("%d",&node->data.score);
      printf("n请输入学生年龄:");
      scanf("%d",&node->data.age);
    
      L->next=node;                                                                                                                                          
      node->next=temp;
    }
    
    void show_student(LinkList *L)
    {
      LinkList *p=L->next;
      int i=0;
      printf("n    **************************      n");
      printf("            学生信息                n");
      printf("    **************************      n");
      printf("   序号    姓名    成绩    年龄 n");
      while(p)
      {
        printf("      %d      %s      %d      %d     n",p->data.number,p->data.name,p->data.score,p->data.age);
        i++;                                                                                                                                                 
        p=p->next;
      }
    }
    
    void delete_student(LinkList *L)
    {
      int x=0;
      int number;
      char name[10];
      LinkList *temp,*pre;
      temp=L->next;
      while(1)
      {
        printf("n    请选择:");
        printf("n    1.按序号删除!");
        printf("n    2.按姓名删除!");
        printf("n    请输入选择:");
        scanf("%d",&x);
        if(x==1 || x==2)
          break;
        else 
          printf("n   输入错误,请重新输入!");
      }
      if(x==1)            //根据输入的序号找到学生并删除
      {
        printf("n    请输入要删除的学生序号:");
        scanf("%d",&number);
        while(temp->data.number!=number && temp->next!=NULL)
        {
          pre=temp;
          temp=temp->next;
        }
        if(temp->data.number==number)
        {
          pre->next=temp->next;
          free(temp);
        }
        else
        {
          printf("n    没有所要删除的学生序号!");
        }
      }
      else if(x==2)      //根据输入的姓名找到学生并删除
      {
        printf("n     请输入要删除的学生名字:");
        scanf("%s",name);
        while(strcmp(temp->data.name,name)!=0 && temp->next!=NULL)
        {
          pre=temp;
          temp=temp->next;
        }
        if(strcmp(temp->data.name,name)==0)
        {
          pre->next=temp->next;
          free(temp);
        }
        else
        {
          printf("n     没有要删除的学生姓名!");
        }
      }
    }
    
    void modify_student(LinkList *L)
    {
      int x=0;
      int number;
      char name[10];
      LinkList *temp;
      temp=L->next;
      while(1)
      {
        printf("n    请选择:");
        printf("n    1.知道要修改学生的序号!");
        printf("n    2.知道要修改学生的名字!");                                                                                                             
        printf("n    请输入选择:");
        scanf("%d",&x);
        if(x==1 || x==2)
          break;
        else
          printf("n   输入错误,请重新输入!");
      }
      if(x==1)
      {
        printf("n    请输入要修改学生的序号:");
        scanf("%d",&number);
        while(temp->data.number!=number && temp->next!=NULL)
        {
          temp=temp->next;
        }
        if(temp->data.number==number)
        {
          printf("n     已经找到要修改学生的信息!");
        }
        else
        {
          printf("n    没有要修改学生的序号!");
        }
      }
      else if(x==2)
      {
        printf("n     请输入要修改学生的名字:");
        scanf("%s",name);
        while(strcmp(temp->data.name,name)!=0 && temp->next!=NULL)
        {
          temp=temp->next;
        }
        if(strcmp(temp->data.name,name)==0)
        {
          printf("n     已经找到要修改学生的信息!");
        }
        else
        {
          printf("n     没有要修改学生的姓名!");
        }
      }
      printf("n     ************************");
      printf("n   姓名:%s  序号:%d  成绩:%d  年龄:%d",temp->data.name,temp->data.number,temp->data.score,temp->data.age);
      do{
        printf("n     请选择:");
        printf("n     1.修改序号!");
        printf("n     2.修改名字!");
        printf("n     3.修改成绩!");
        printf("n     4.修改年龄!");
        printf("n     请输入选择:");
        scanf("%d",&x);
      }while(x<1 || x>4);
      if(x==1)
      {
        printf("n     请输入修改后的序号:");
        scanf("%d",&temp->data.number);
      }
      if(x==2)
      {
        printf("n     请输入修改后的名字:");
        scanf("%s",temp->data.name);
      }
      if(x==3)
      {
        printf("n     请输入修改后的成绩:");
        scanf("%d",&temp->data.score);
      }
      if(x==4)
      {
        printf("n     请输入修改后的年龄:");
        scanf("%d",&temp->data.age);
      }
    
    }
    
    void save(LinkList *L)
    {
      FILE *fp;
      int i=0;
      LinkList *temp;                                                                                                                                        
      temp=L->next;
      if((fp=fopen("student.txt","a"))==NULL)
      {
        printf("n     无法打开文件!");
        exit(1);
      } 
      while(temp!=NULL)
      {
        i++;
        fprintf(fp,"%d %s %d %d n",temp->data.number,temp->data.name,temp->data.score,temp->data.age);
        printf("n     第%d个已经保存!",i);
        temp=temp->next;
      }
      fclose(fp);
    }
    
    void refresh(LinkList *L)
    {
      FILE *fp;
      LinkList *node=NULL;                                                          
      LinkList *temp=L->next;
      node=(LinkList *)malloc(sizeof(LinkList));
      if(node==NULL)
      {
        printf("分配普通节点内存出错!");
        exit(1);
      }
      memset(node,0,sizeof(LinkList));  
      fp=fopen("student.txt","r");
      if(fp==NULL)
      {
        printf("n     无法打开文件!");
        exit(1);
      }
      while(!feof(fp))
      {
        fscanf(fp,"%d %s %d %d",&node->data.number,node->data.name,&node->data.score,&node->data.age);
        L->next=node;
        node->next=temp;
        temp=node;
        node=(LinkList *)malloc(sizeof(LinkList));
        if(node==NULL)
        {
          printf("分配普通节点内存出错!");
          exit(1);
        }
        memset(node,0,sizeof(LinkList));
      }                                                                                                                                                      
      printf("n     已经成功刷新学生信息!");
    }
    展开全文
  • 要做课程作业了,就学着网上模版了个链表学生信息系统,但我想分成老师-学生两个登陆模块。思路如下: mian()中设置ahead结构体指针。 老师模块完成学生成绩的增删改查排序(借鉴网上的已完成)。。老师模块结束后...
  • 之前参照网上的资料用链表实现了图书管理系统,包括简单的增删改查功能以及借书还书功能,我是VC6.0下的一个控制台程序,格式参照的网上的。在动手编码之前,你需要理清自己的思路。首先,需要确定图书馆里系统中...
  • C语言写的,用到了链表和文件的功能,做到的容错功能,很好
  • 由于工作原因很久没有博客了,今天用链表这种数据结构了一个学生信息管理系统,我并没有写链表的释放,希望伙伴们能自己研究研究,后期我会把释放补上。 test.c #include <stdio.h> #include "stu_data.h...

    由于工作原因很久没有写博客了,今天用链表这种数据结构写了一个学生信息管理系统,我并没有写链表的释放,希望伙伴们能自己研究研究,后期我会把释放补上。
    test.c

    #include <stdio.h>
    #include "stu_data.h"
    #include <string.h>
    #include <stdlib.h>
    
    int main()
    {
        linklist sql;
        char choose, sel_name[20] = {};
        int id, flag = 1;
        sql = stu_sreate();
        main_menu();
        while (flag)
        {
            choose = getc(stdin);
            if (choose == 49)
            {
                data_l stu_data;
                stu_data = stu_input();
                stu_insert(sql, stu_data);
                free(stu_data);
                printf("请选择业务代号:");
            }
            else if (choose == 50)
            {
                printf("请输入要删除的学员名字:");
                scanf("%s", sel_name);
                stu_delete(sql, sel_name);
                printf("请选择业务代号:");
            }
            else if (choose == 51)
            {
                printf("请输入要修改的学员id:");
                scanf("%d", &id);
                stu_update(sql, id);
                printf("请选择业务代号:");
            }
            else if (choose == 52)
            {
                printf("请输入要查询的学员名字:");
                scanf("%s", sel_name);
                stu_select(sql, sel_name);
                printf("请选择业务代号:");
            }
            else if (choose == 53)
            {
                stu_show(sql);
                printf("请选择业务代号:");
            }
            else if (choose == 54)
            {
                main_menu();
                printf("请选择业务代号:");
            }
            else if (choose == 42)
            {
                flag = 0;
            }
            else
            {
                continue;
            }
        }
        return 0;
    }
    

    stu_data.c

    #include <stdlib.h>
    #include <stdio.h>
    #include "stu_data.h"
    #include <string.h>
    
    /*
    *主界面菜单
    ***/
    int main_menu()
    {
        printf("/***************菜单*************/\n");
        printf("1、添加成员\t\t2、删除成员\n");
        printf("3、修改成员\t\t4、查找成员\n");
        printf("5、显示所有成员\t\t6、显示菜单\n");
        printf("/********************************/\n");
        return 0;
    }
    
    /*
    *创建链表
    ***/
    linklist stu_sreate()
    {
        linklist stu_l;
        stu_l = (linklist)malloc(sizeof(linknode));
        if (stu_l == NULL)
        {
            printf("stu_sreate:malloc is fail\n");
            return NULL;
        }
        stu_l->data = (data_l)malloc(sizeof(data_n));
        if (stu_l == NULL)
        {
            printf("stu_sreate:malloc is fail\n");
            return NULL;
        }
        stu_l->data->id = 0;
        stu_l->data->age = 0;
        memset(stu_l->data->name, 0, sizeof(stu_l->data->name));
        memset(stu_l->data->telephone, 0, sizeof(stu_l->data->telephone));
        stu_l->next = NULL;
        return stu_l;
    }
    
    /*
    *插入数据
    ***/
    int stu_insert(linklist sql, data_l value)
    {
        linklist stu_n, stu_l;
        stu_l = sql;
        stu_n = (linklist)malloc(sizeof(linknode));
        if (stu_n == NULL)
        {
            printf("stu_sreate:malloc is fail\n");
            return -1;
        }
        stu_n->data = (data_l)malloc(sizeof(data_n));
        if (stu_n == NULL)
        {
            printf("stu_sreate:malloc is fail\n");
            return -1;
        }
        while (stu_l->next)
        {
            stu_l = stu_l->next;
        }
        stu_l->next = stu_n;
        stu_n->data->id = value->id;
        stu_n->data->age = value->age;
        strcpy(stu_n->data->name, value->name);
        strcpy(stu_n->data->telephone, value->telephone);
        stu_n->next = NULL;
        return 0;
    }
    /*
    *学生信息输入
    ***/
    data_l stu_input()
    {
        data_l stu_n;
        stu_n = (data_l)malloc(sizeof(data_n));
        if (stu_n == NULL)
        {
            printf("stu_input:malloc is fail\n");
            return NULL;
        }
        int id = 0, age = 0;
        char name[20] = {}, telephone[20] = {};
        printf("请输入学生ID:\n");
        scanf("%d", &id);
        printf("请输入学生姓名:\n");
        scanf("%s", name);
        printf("请输入学生年龄:\n");
        scanf("%d", &age);
        printf("请输入学生电话:\n");
        scanf("%s", telephone);
        stu_n->id = id;
        stu_n->age = age;
        strcpy(stu_n->name, name);
        strcpy(stu_n->telephone, telephone);
        return stu_n;
    }
    
    /*
    *显示所有数据
    **/
    int stu_show(linklist sql)
    {
        if (sql == NULL)
        {
            printf("shu_show:linklist is empty\n");
            return -1;
        }
        linklist stu_l;
        stu_l = sql;
        printf("---------------------------------\n");
        printf("|ID\t|姓名\t|年龄\t|电话\t|\n");
        printf("---------------------------------\n");
        while (stu_l->next)
        {
            printf("|%d\t|%s\t|%d\t|%s\t|\n", stu_l->next->data->id, stu_l->next->data->name, stu_l->next->data->age, stu_l->next->data->telephone);
            printf("---------------------------------\n");
            stu_l = stu_l->next;
        }
        return 0;
    }
    /*
    *按名字删除人员信息
    ***/
    int stu_select(linklist sql, char *name)
    {
        if (sql == NULL)
        {
            printf("stu_delete:parameter is errror\n");
            return -1;
        }
        linklist stu_l;
        stu_l = sql;
        while (stu_l->next)
        {
            if (strcmp(name, stu_l->next->data->name) == 0)
            {
                printf("---------------------------------\n");
                printf("|ID\t|姓名\t|年龄\t|电话\t|\n");
                printf("---------------------------------\n");
                printf("|%d\t|%s\t|%d\t|%s\t|\n", stu_l->next->data->id, stu_l->next->data->name, stu_l->next->data->age, stu_l->next->data->telephone);
                printf("---------------------------------\n");
                break;
            }
            stu_l = stu_l->next;
        }
        return 0;
    }
    /*
    *按名字删除个人信息
    ***/
    int stu_delete(linklist sql, char *name)
    {
        if (sql == NULL)
        {
            printf("stu_delete:parameter is errror\n");
            return -1;
        }
        linklist stu_l, stu_d;
        stu_l = sql;
        while (stu_l->next)
        {
            if (strcmp(name, stu_l->next->data->name) == 0)
            {
                stu_d = stu_l->next;
                stu_l->next = stu_l->next->next;
                free(stu_d);
                break;
            }
            stu_l = stu_l->next;
        }
        return 0;
    }
    
    /*
    *按id修改信息
    **/
    int stu_update(linklist sql, int id)
    {
        if (sql == NULL)
        {
            printf("stu_delete:parameter is errror\n");
            return -1;
        }
        linklist stu_l;
        stu_l = sql;
        char name[20] = {}, telephone[20] = {};
        int age = 0;
        while (stu_l->next)
        {
            if (stu_l->next->data->id == id)
            {
                printf("请输入修改的姓名:\n");
                scanf("%s", name);
                printf("请输入%s的年龄:\n", name);
                scanf("%d", &age);
                printf("请输入%s的电话:\n", name);
                scanf("%s", telephone);
                strcpy(stu_l->next->data->name, name);
                strcpy(stu_l->next->data->telephone,telephone);
                stu_l->next->data->age = age;
                break;
            }
    
            stu_l = stu_l->next;
        }
        return 0;
    }
    
    

    stu_data.h

    typedef struct stu_data
    {
        int id;
        char name[20];
        int age;
        char telephone[20];
    } data_n, *data_l;
    
    typedef struct node
    {
        data_l data;
        struct node *next;
    } linknode, *linklist;
    
    int main_menu();                            //主界面菜单
    linklist stu_sreate();                      //创建链表
    int stu_insert(linklist sql, data_l value); //插入数据
    data_l stu_input();                         //学生信息输入
    int stu_show(linklist sql);                 //显示所有数据
    int stu_select(linklist sql, char *name);   //按名字查询人员信息
    int stu_delete(linklist sql,char *name);    //按名字删除个人信息
    int stu_update(linklist sql,int id);        //按id修改信息
    

    运行结果
    在这里插入图片描述
    这个程序还有很多没有完善的地方,大家可以一起研究哈

    展开全文
  • Linux系统下的学生信息管理系统 首先要有一个链表,用来记录学生的姓名/学号/各科成绩/总分等信息。然后将链表的操作函数一起在头文件中。 vi StuList.h//编写头文件 1 #ifndef STULIST_H 2 #define STULIST_H 3 ...

    Linux系统下的学生信息管理系统
    代码功能:区分教师、学生登录两种模式,教师登录需要密码验证,可以进行学生信息的添加、删除、修改、排序、查找、打印、退出等功能,学生登录不需要密码验证,但只能进行查询操作。
    首先要有一个链表,用来记录学生的姓名/学号/各科成绩/总分等信息。然后将链表的操作函数一起写在头文件中。

    vi StuList.h //编写头文件

       #ifndef    STULIST_H
       #define    STULIST_H
       typedef struct Node{
           int id;
           char name[32];
           double yu;
           double shu;
           double ying;
           double sum;
          struct Node * next;
      }node_t;
      int len(node_t *p);//求已记录学生的数量
      int add(node_t *p,node_t* n);//增加学员
      void show(node_t* p);//打印所有的学员数据
      int del(node_t* p,int id);//删除学员
      int seek(node_t* p,char* name);//查找学员
      //void seek(node_t* p,int id);//查找学员
      int keep(node_t* p,node_t* n);//修改学员信息
      int sort(node_t* p,int op);//排序
      int ReadFile(node_t* p);//读物文件的记录
      int WriteFile(node_t* p);//向文件写入数据
      int clear(node_t* p);//清空链表
      #endif //STULIST_H在这里插入代码片
    

    vi Ui.h //编写登录界面的头文件

       #ifndef UI_H
       #define UI_H
       void initUi();//开始界面
       void AddUi();//增加学员界面
       void DateUi();//数据显示界面
       void DelUi();//删除界面
       void SortUi();//排序界面
       void QuitUi();//退出界面
       #endif //UI_H
    

    vi StuList.c //编写StuList源文件

       #include <stdio.h>
       #include <stdlib.h>
       #include <string.h>
       #include "StuList.h"
       int len(node_t *p)//求已记录学生的数量
       {   
           int size = 0;
               while(p->next!=NULL){
                           p=p->next;
                              size++;
                                  }
                  return size;
      }
      int add(node_t *p,node_t* n)//增加学员
      {   
          //循环便利链表找到尾节点
          while(p->next!=NULL){
              p=p->next;
          }
          n->next = NULL;
          p->next = n;
      }
      void show(node_t* p)//打印所有的学员数据
      {   
          while(p->next!=NULL){
              p = p->next;
              printf("%d\t%s\t%lg\t%lg\t%lg\t%lg\n",p->id,p->name,p->ying,    p->yu,p->shu,p->sum);
          }
      }
      int del(node_t* p,int id)//删除学员
      {
          node_t* p1 = p;//记录上一个节点
          while(p->next!=NULL){
              p1 = p;
              p = p->next;
              if(p->id == id){
                  p1->next = p->next;
                  free(p);
                  p = NULL;
                  return 0;
              }
          }
          return -1;
      }
      int seek(node_t* p,char* name)//查找学员
      {
          int i = -1;
          while(p->next!=NULL){
              p=p->next;
              if(strcmp(p->name,name)==0){
                  printf("%s\t的学号是%d\t,英语成绩为%lg\t语文成绩为%lg\t>    数学成绩为%lg\t总分为%lg\n",p->name,p->id,p->ying,p->yu,p->shu,p->su    m);
                  i = 0;
              }
          }
          return i;
      }
      /*void seek(node_t * p, int id){
          while(p->next != NULL){
              p = p->next;
              if(p->id == id){
                  printf("%d\t%s\t%lg\t%lg\t%lg\t%lg\n",p->id,p->name,p->y    ing,p->yu,p->shu,p->sum); 
              }
          }
      }  */
      int keep(node_t* p,node_t* n)//修改学员信息
      {
          while(p->next!=NULL){
              p=p->next;
              if(p->id==n->id){
                  n->next = p->next;
                  *p = *n;
              }
          }
      }
      int SortId(node_t* p){
          node_t* p1 = p;
          while(p->next!=NULL){
              p=p->next;
              p1 = p;
              while(p1->next!=NULL){
                  p1 = p1->next;
                  if(p1->id<p->id){
                      node_t tmp = *p;
                      *p = *p1;
                      *p1 = tmp;
                      node_t* p2 = p->next;
                      p->next = p1->next;
                      p1->next = p2;
                  }
              }
          }
      }
      int SortName(node_t* p){
          node_t* p1 = p;
          while(p->next!=NULL){
              p=p->next;
              p1 = p;
              while(p1->next!=NULL){
                  p1 = p1->next;
                 if(strcmp(p1->name,p->name)==1){
                     node_t tmp = *p;
                     *p = *p1;
                     *p1 = tmp;
                     node_t* p2 = p->next;
                     p->next = p1->next;
                     p1->next = p2;
                 }
             }
         }
     }
     int SortYu(node_t* p){
         node_t* p1 = p;
         while(p->next!=NULL){
             p=p->next;
             p1 = p;
             while(p1->next!=NULL){
                 p1 = p1->next;
                 if(p1->yu > p->yu){
                     node_t tmp = *p;
                     *p = *p1;
                     *p1 = tmp;
                     node_t* p2 = p->next;
                     p->next = p1->next;
                     p1->next = p2;
                 }
             }
         }
     }
     int SortShu(node_t* p){
         node_t* p1 = p;
         while(p->next!=NULL){
             p=p->next;
             p1 = p;
             while(p1->next!=NULL){
                 p1 = p1->next;
                 if(p1->shu > p->shu){
                     node_t tmp = *p;
                     *p = *p1;
                     *p1 = tmp;
                     node_t* p2 = p->next;
                     p->next = p1->next;
                     p1->next = p2;
                 }
             }
         }
     }
     int SortYing(node_t* p){
         node_t* p1 = p;
         while(p->next!=NULL){
             p=p->next;
             p1 = p;
             while(p1->next!=NULL){
                 p1 = p1->next;
                 if(p1->ying > p->ying){
                     node_t tmp = *p;
                     *p = *p1;
                     *p1 = tmp;
                     node_t* p2 = p->next;
                     p->next = p1->next;
                     p1->next = p2;
                 }
             }
         }
     }
     int SortSum(node_t* p){
         node_t* p1 = p;
         while(p->next!=NULL){
             p=p->next;
             p1 = p;
             while(p1->next!=NULL){
                 p1 = p1->next;
                 if(p1->sum > p->sum){
                     node_t tmp = *p;
                     *p = *p1;
                     *p1 = tmp;
                     node_t* p2 = p->next;
                     p->next = p1->next;
                     p1->next = p2;
                 }
             }
         }
     }
     int sort(node_t* p,int op)//排序
     {
         switch(op){
             case 1:
                 SortId(p);
                 break;
             case 2:
                 SortName(p);
                 break;
             case 3:
                 SortYu(p);
                 break;
             case 4:
                 SortShu(p);
                 break;
             case 5:
                 SortYing(p);
                 break;
             case 6:
                 SortSum(p);
                 break;
         }
     }
     int ReadFile(node_t* p)//读物文件的记录
     {
         FILE* fp = fopen("./stu.bin","r");
         if(fp!=NULL){
             while(p->next!=NULL){
                 p=p->next;
             }
             while(1){
                 node_t* n = (node_t*)malloc(sizeof(node_t));
                 if(fread(n,sizeof(node_t),1,fp)==0){
                     free(n);
                     n = NULL;
                     break;
                 }
                 else{
                     n->next = NULL;
                     p->next = n;
                     p=p->next;//p=n
                 }
             }
             fclose(fp);
             fp = NULL;
         }
     }
     int WriteFile(node_t* p)//向文件写入数据
     {
         FILE* fp = fopen("./stu.bin","w");
         if(fp==NULL) return -1;
         while(p->next!=NULL){
             p = p->next;
             fwrite(p,sizeof(node_t),1,fp);
         }
         fclose(fp);
         fp = NULL;
     }
     int clear(node_t* p)//清空链表
     {
         while(p->next!=NULL){
             node_t* p1 = p;
             p=p->next;
             p1->next = p->next;
             free(p);
             p = p1;
         }
     }
    

    到这里学生信息管理系统的代码就完成一大半了,下面将开始编写登录界面的源代码

    vi Ui.c

       #include <stdio.h>
       #include <stdlib.h>
       #include "StuList.h"
       #include <unistd.h>
       #include "ui.h"
       void ReviseUi();
       void StuUi();
       void AskUi();
       node_t head;//头节点
      void logo(){
          ReadFile(&head);
          while(1){
              int a = 0, b = 0, c = 110;
              printf("**************学生信息查询系统*************\n");
              printf("**1、教师登录     2、学生登录     3、退出**\n");
              printf("*******************************************\n");
              printf("请选择登录模式:\n");
              scanf("%d",&a);
              switch(a){
                  case 1:
                      printf("请输入密码\n");
                      scanf("%d",&b);
                      if(b == c){
                          ReadFile(&head);
                          initUi();
                      }
                      break;
                  case 2:
                      StuUi();
                      break;
                  case 3:
                      QuitUi();
                      break;
              }
          }
      }
      void StuUi(){     //学生登录界面
          while(1){
              system("clear");
              printf("*********************\n");
              printf("***1 查询   2 退出***\n");
              printf("*********************\n");
              printf("请输入操作指令:\n");
              int i = 0;
              scanf("%d",&i);
              scanf("%*[^\n]");
              scanf("%*c");
              switch(i){
                  case 1:
                      AskUi();
                      break;
                  case 2:
                      QuitUi();
                      break;
              }
          }
      }
       void initUi(){    //教师登录界面
         while(1){
              system("clear");
              printf("******************** *\n");
              printf("***1 增加    2 删除***\n");
              printf("***3 显示    4 排序***\n");
              printf("***5 修改    6 查找***\n");
              printf("***0 退出          ***\n");
              printf("******************** *\n");
              printf("请输入操作指令:\n");
              int i = 0;
              scanf("%d",&i);
              scanf("%*[^\n]");
              scanf("%*c");
              switch(i){
                  case 1:
                      AddUi();
                      break;
                  case 2:
                      DelUi();
                      break;
                  case 3:
                      DateUi();
                      break;
                  case 4:
                      SortUi();
                      DateUi();
                      break;
                  case 5:
                      ReviseUi();
                      DateUi();
                      break;
                  case 6:
                      AskUi();
                      break;
                  case 0:
                      QuitUi();
                      break;
                  /*case 8:
                      QuitUi();
                      break;*/
              }
         }
     }
     void AddUi(){//增加学员界面3     node_t* n = (node_t*)malloc(sizeof(node_t));
         printf("请依次输入学生姓名,id,英语,语文,数学成绩:\n");
         scanf("%s",n->name);
         scanf("%d%lg%lg%lg",&n->id,&n->ying,&n->yu,&n->shu);
         scanf("%*[^\n]");
         scanf("%*c");
         n->sum = n->ying+n->yu+n->shu;
         n->next = NULL;     
         add(&head,n);
         printf("增加学员成功,点击回车继续\n");
         getchar();
     }
     void DateUi(){//数据显示界面
         printf("学号\t姓名\t英语\t语文\t数学\t总成绩\n");
         show(&head);
         printf("共有%d个学员信息,点击回车继续\n",len(&head));
         getchar();
     }
     void DelUi(){//删除界面
         int id = 0;
         printf("请输入要删除的学生id\n");
         scanf("%d",&id);
         scanf("%*[^\n]");
         scanf("%*c");
         del(&head, id);
         printf("删除学员成功,点击回车继续\n");
         getchar();
     }
     void SortUi(){//排序界面
         int a = 0;
         printf("请选择排序方式:\n");
         printf("1 学号排序    2 姓名排序\n");
         printf("3 语文排序    4 数学排序\n");
         printf("5 英语排序    6 总分排序\n");
         scanf("%d",&a);
         /*scanf("%*[^\n]");
         scanf("%*c");*/
         sort(&head, a);
         printf("排序完成,点击回车继续。\n");
         getchar();
     }
     void ReviseUi(){   //信息修改
         node_t *n =(node_t *)malloc(sizeof(node_t)) ;
         printf("以学号为基础,学号不变,其他信息改变。");
         printf("请输入要修改的学生姓名\tid\t语文\t数学\t英语成绩\n");
         scanf("%s",n->name);
         scanf("%d%lg%lg%lg",&n->id,&n->yu,&n->shu,&n->ying);
         n->sum = n->yu + n->shu + n->ying ;
         keep(&head,n);
         printf("修改学员成功,点击回车继续。\n");
         getchar();
     }
     void QuitUi(){//退出界面
         WriteFile(&head);
         printf("数据正在保存请稍后...\n");
         sleep(1);     
         printf("数据保存完成,点击任意键继续\n");
         clear(&head);
         getchar();
         exit(-1);
     }
     void AskUi(){    //学生查询成绩
         char name[32] = {0};
         printf("请输入要查询的姓名:\n");
     //    scanf("%s",name);
     //    scanf("%*[^\n]");
       //  scanf("%*c");
         //fgets(name,31,stdin);
         gets(name);
         seek(&head, name);
         printf("查询结束,点击回车继续。\n");
         getchar();
     }
     /*void AskUi(){
         int id = 0;
         printf("请输入要查询的学号:\n");
         scanf("%d",&id);
         scanf("%*[^\n]");
         scanf("%*c");
         seek(&head, id);
         printf("查询结束,点击回车继续。\n");
         getchar();
     }*/
    

    下面只需要编写主程序就可以了

    vi main.c

       #include "ui.h"
       //#include "StuList.h"
       int main(){
           logo();
           return 0;
       }
    
    

    编写完成后就可以编译执行了

    gcc main.c ui.c StuList.c
    

    下面展示一下运行结果
    在这里插入图片描述
    在这里插入图片描述
    试一下,可以的。

    ~

    展开全文
  • 利用c语言链表或结构体数组实现学生信息的管理,编写有登录界面的学生信息管理系统,可以实现学生信息的录入,显示,删除,排序,统计,文件读写等功能。 需要C/C++资料的同学请加小编C/C++编程QQ群:825414254...
  • 大一上学期的期末作业,只记得当时弄了好长时间。在代码的过程中,能发现很多问题,错误,折磨人的很。不过也确实学到了好多东西。这其中,有王瑶哥和菲菲姐的热心帮助。... 等以后有机会C++再个吧。
  • 相信很多大一的同学在做c语言程序设计期末大作业的时候,都会被这些题目所困扰:学生成绩管理系统、学生信息管理系统、图书借阅管理系统、通讯录、选课系统......上网百度到别人的代码,有的人C++,有的人类C...
  • c语言写学生宿舍管理系统

    千次阅读 2007-09-24 16:18:00
    下面是我用c语言在linux环境下的一个学生宿舍管理系统,数据结构是 用链表。不完整,只有输入学生信息和 计算机给学生自动分配宿舍,没有考虑男女宿舍,我 是 这样想的:对每栋宿舍都作标记,0表示女生宿舍,1表示...
  • 学生成绩管理系统(基于链表和文件读写操作) 本程序为作者的大一下学期的c语言期末作业,如有问题和不足,欢迎大家指出共同探讨。 程序主要实现的功能有:学生信息的录入(动态链表创建),输出所有学生信息(链表遍历),...
  • 信息管理系统 简介: 该管理系统分为三个权限:学生,老师,管理员 双向链表实现,文件储存,有账号密码功能。 密码实现MD5加密,较难破解 实现了链表添加,查找,排序,删除等基本操作 管理员能够管理学生...
  • 第一次用链表和文件来编写学生信息管理系统 (=´ω`=)的不好请大家见谅✧(≖ ◡ ≖✿ 功能介绍 1.添加学生信息; 2.对学生信息进行排序; 3.删除学生信息; 4.查询学生信息; 5.修改学生信息; 6.输出学生信息; ...
  • 这是我在用c语言写学生管理系统时,想将录入的学生信息进行总分排序,所想出的两种排序方法。冒泡排序的大体思路就是先遍历记录结点总数n,然后做n次循环,每次找出链表中总分最高的学生结点,然后将他们依次尾插...
  • c语言学生成绩管理系统

    热门讨论 2013-03-14 22:27:45
    一、题目: 学生成绩管理系统 二、目的与要求 1. 目的: (1)基本掌握面向过程程序设计的基本思路和方法; (2)达到熟练掌握C语言的基本知识和技能; (3)能够利用所学的基本知识和技能,解决简单的程序设计问题...
  • 只会让你学生信息管理系统然后你去考二级C语言还可能考不过(话说今天二级出成绩了,附查询链接:成绩查询链接)言归正传,其实C语言学到数组就可以实现贪吃蛇游戏,不用等到数据结构用链表。而且,最重要的...

空空如也

空空如也

1 2 3
收藏数 54
精华内容 21
关键字:

用c语言链表写学生信息管理系统

c语言 订阅