目录
  • 新增函数——文件操作;
  • 1.头文件和预处理
  • 2.定义学生结构体的数据结构
  • 3.定义每条记录或节点的数据结构
  • 4.函数接口代码.
    • 1.定义提示菜单
    • 2.增加学生记录
    • 3.输入学号接口·
    • 4.遍历表中学生
    • 5.增加学生记录
    • 6.删除学生信息
    • 7.查找学生信息
    • 8.修改学生信息
    • 9.统计学生人数
    • 10.清空链表
    • 11.文件操作
  • 5.main函数
    • 6.学生信息管理系统总源码(可直接复制运行)
      • 7.测试结果

        本文实例为大家分享了C语言实现学生信息管理系统的具体代码,供大家参考,具体内容如下

        前言:与上篇文章相比,增加了文件操作,可将任意时期的的学生数据存储再文件中,菜单也随之改动,增加了文件操作一栏,是否存储到相应文件中由使用者决定

        新增函数——文件操作;

        //学生数据文件储存 
        //储存任意时期的学生数据 
        void Store_List(Link head)
        {
            //文件操作 
            ofstream ofs;
            ofs.open("Std_Information.txt",ios::out);
            
            if(head==NULL)
            {
                printf("学生为空\n");
                return; 
            }
            else
            {
                Link p=head->next;
                while(p)
                {
                    ofs<< "姓名:"<<p->data.studentName<<"    学号:"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
                    p=p->next;
                }
                
            }
        }

        1.头文件和预处理

        #include <stdio.h>
        #include<string.h>
        #include<malloc.h>
        #include<stdlib.h>
        #include<stdbool.h>
        #include<iostream>
        #include<fstream>//文件操作所需头文件 
        using namespace std;
        #define NO_LENGTH  20
        #define NAME_LENGTH 11
        
        /* 定义学生结构体的数据结构 */
        typedef struct Student{
            char studentNo[NO_LENGTH];
            char studentName[NAME_LENGTH];
            int score;
        }st;
        
        /* 定义每条记录或节点的数据结构 */
        typedef struct node
        {
            struct Student data; //数据域
            struct node *next; //指针域
        }Node,*Link;  //Node为node类型的别名,Link为node类型的指针别名

        2.定义学生结构体的数据结构

        typedef struct Student{
            char studentNo[NO_LENGTH];
            char studentName[NAME_LENGTH];
            int score;
        }st;

        3.定义每条记录或节点的数据结构

        /* 定义每条记录或节点的数据结构 */
        typedef struct node
        {
            struct Student data; //数据域
            struct node *next; //指针域
        }Node,*Link;  //Node为node类型的别名,Link为node类型的指针别名

        4.函数接口代码.

        1.定义提示菜单

        //定义提示菜单
        void myMenu(){
        
            printf("*****************************菜单*****************************\n"); 
            printf("***********************1 增加学生记录*************************\n"); 
            printf("***********************2 删除学生记录*************************\n"); 
            printf("***********************3 查找学生记录*************************\n"); 
            printf("***********************4 修改学生记录*************************\n"); 
            printf("***********************5 统计学生人数 ************************\n"); 
            printf("***********************6 显示学生记录*************************\n"); 
            printf("***********************7 信息文件打印*************************\n");
            printf("***********************8 退出系统 ****************************\n"); 
            
        }

        2.增加学生记录

        void inputStudent(Link l){
             printf("请输入学生学号:");
             scanf("%s",l->data.studentNo);
             printf("请输入学生的姓名:");
             scanf("%s",l->data.studentName);
            printf("请输入学生的成绩:");
             scanf("%s",&(l->data.score));
             //每个新创建的节点的next域都初始化为NULL
             l->next = NULL;
             system("cls");
        }

        3.输入学号接口·

        void inputStudentNo(char s[],char no[]){
            printf("请输入要%s的学生学号:",s);
            scanf("%s",no);
        }

        4.遍历表中学生

        //遍历表中学生 
        void displayNode(Link head){
            if(head==NULL)
            {
                printf("学生为空\n");
                return; 
            }
            else
            {
                Link p=head->next;
                while(p)
                {
                    cout<<"姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
                    p=p->next;
                }
                
            }
           // 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息
           system("pause");
           system("cls");
        }

        5.增加学生记录

        /* 增加学生记录 */
        bool addNode(Link head){
             Link p,q;   //p,q两个节点一前一后
             Link node;  //node指针指向新创建的节点
             node=(Link)malloc(sizeof(Node));
             inputStudent(node);
        
             q = head;
             p = head->next;  //q指向head后面的第一个有效节点
             if(head->next==NULL)
                 //链表为空时
                head->next = node;
             else {
                 //循环访问链表中的所有节点
                while(p != NULL){
                    if (node->data.studentNo < p->data.studentNo){
                        //如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序
                        q->next = node;
                        node->next = p;
                        return true;
                    }
                    else{
                        //如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后)
                        q = p;
                        p = p->next;
        
                    }
                }
                //如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面
                q->next = node;
        
            }
             return true;
             system("pause");
           system("cls");
        }

        6.删除学生信息

        //删除学生信息
        bool deleteNode(Link head){
            // 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false
        
            //输入要处理的学号
                char no[NO_LENGTH];
            inputStudentNo("删除",no);
                Link p=head->next;
            Link q=head;
            while(p)
            {
                if(strcmp(p->data.studentNo,no)==0)
                {
                    cout<<"成功删除该学生"<<endl; 
                    q->next=p->next;
                    free(p);
                    system("pause");
                       system("cls");
                    return true;
                }
                else
                {
                    q=p;
                    p=p->next;
                }
            }
            cout<<"未找到该学生"<<endl; 
                system("pause");
                   system("cls");
            return false;
        }

        7.查找学生信息

        //查找学生信息 
        bool queryNode(Link head){
            // 按照给定的学号查询学生记录,如果查找成功返回true,如果没找到学号返回false
        
            //输入要处理的学号
            char no[NO_LENGTH];
            inputStudentNo("查找",no);
                Link p=head->next;
            while(p)
            {
                if(strcmp(p->data.studentNo,no)==0)
                {
                    
                       system("cls");
                       cout<<"姓名:"<<p->data.studentName<<"    学号:"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
                    return true;
                }
                else
                {
                    p=p->next;
                }
            }
            cout<<"未找到该学生"<<endl; 
           system("cls");
        
            return false;
        }

        8.修改学生信息

        //修改学生信息 
        bool modifyNode(Link head){
            // 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false
            
            //输入要处理的学号
            char no[NO_LENGTH];
            inputStudentNo("修改",no);
            Link p=head->next;
            while(p)
            {
                if(strcmp(p->data.studentNo,no)==0)
                {
                    cout<<"请输入修改后的姓名"<<endl; 
                    cin>>p->data.studentName;
                    cout<<"请输入修改后的学号"<<endl; 
                    cin>>p->data.studentNo;
                    cout<<"请输入修改后的成绩"<<endl; 
                    cin>>p->data.score;
                    system("cls");
                    return true;
                }
                else
                {
                    p=p->next;
                }
            }
            cout<<"未找到该学生,请重新输入学号"<<endl; 
            system("cls");
            return false;
        }

        9.统计学生人数

        //统计学生人数
        int countNode(Link head){
            //统计学生人数,扫描链表统计节点个数,返回节点数
            Link p;
            int count = 0;
            p = head->next;
            while(p)
            {
                p=p->next;
                count++;
            }
            //填充代码
            system("cls");
            return count;
        }

        10.清空链表

        //清空链表 
        void clearLink(Link head){
            Link q,p;
            p=head->next;
            q=head;
            while(p)
            {
                q->next=p->next;
                free(p);
                p=q->next;
            }
                //遍历链表,用free语句删除链表中用malloc建立起的所有的节点
        }

        11.文件操作

        //学生数据文件储存 
        //储存任意时期的学生数据 
        void Store_List(Link head)
        {
            //文件操作 
            ofstream ofs;
            ofs.open("Std_Information.txt",ios::out);
            
            if(head==NULL)
            {
                printf("学生为空\n");
                return; 
            }
            else
            {
                Link p=head->next;
                while(p)
                {
                    ofs<< "姓名:"<<p->data.studentName<<"    学号:"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
                    p=p->next;
                }
                
            }
        }

        5.main函数

        int main() {
            int select;
                int count;
            Link head;  // 定义链表
        
            //建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据
            head = (Link)malloc(sizeof(Node));
            head->next = NULL;
        
            while(1)
            {
                myMenu();
                printf("\n请输入你的选择(0-7):");  //显示提示信息
                scanf("%d",&select);
                switch(select)
                {
                case 1:
                    //增加学生记录
                    if(addNode(head))
                        printf("成功插入一个学生记录。\n\n");
                    break;
                case 2:
                    //删除学生记录
                    if(deleteNode(head))
                        printf("成功删除一个学生记录。\n\n");
                    else
                        printf("没有找到要删除的学生节点。\n\n");
                    break;
                case 3:
                    //查询学生记录
                    if(queryNode(head))
                        printf("成功找到学生记录。\n\n");
                    else
                        printf("没有找到要查询的学生节点。\n\n");
                    break;
                case 4:
                    //修改学生记录
                    if(modifyNode(head))
                        printf("成功修改一个学生记录。\n\n");
                    else
                        printf("没有找到要修改的学生节点。\n\n");
                    break;
                case 5:
                    //统计学生人数
                    count = countNode(head);
                    printf("学生人数为:%d\n\n",count);
                    break;
                case 6:
                    //显示学生记录
                    displayNode(head);
                    break;
                case 7:
                    //退出前清除链表中的所有结点
                    clearLink(head);
                    return 0;
                default:
                    printf("输入不正确,应该输入0-7之间的数。\n\n");
                    system("cls"); 
                    break;
                }
            }
            return 0;
        }

        6.学生信息管理系统总源码(可直接复制运行)

        #include <stdio.h>
        #include<string.h>
        #include<malloc.h>
        #include<stdlib.h>
        #include<stdbool.h>
        #include<iostream>
        #include<fstream>//文件操作所需头文件 
        using namespace std;
        #define NO_LENGTH  20
        #define NAME_LENGTH 11
        
        /* 定义学生结构体的数据结构 */
        typedef struct Student{
            char studentNo[NO_LENGTH];
            char studentName[NAME_LENGTH];
            int score;
        }st;
        
        /* 定义每条记录或节点的数据结构 */
        typedef struct node
        {
            struct Student data; //数据域
            struct node *next; //指针域
        }Node,*Link;  //Node为node类型的别名,Link为node类型的指针别名
        
        //定义提示菜单
        void myMenu(){
        
            printf("*****************************菜单*****************************\n"); 
            printf("***********************1 增加学生记录*************************\n"); 
            printf("***********************2 删除学生记录*************************\n"); 
            printf("***********************3 查找学生记录*************************\n"); 
            printf("***********************4 修改学生记录*************************\n"); 
            printf("***********************5 统计学生人数 ************************\n"); 
            printf("***********************6 显示学生记录*************************\n"); 
            printf("***********************7 信息文件打印*************************\n");
            printf("***********************8 退出系统 ****************************\n"); 
            
        }
        
        void inputStudent(Link l){
             printf("请输入学生学号:");
             scanf("%s",l->data.studentNo);
             printf("请输入学生的姓名:");
             scanf("%s",l->data.studentName);
            printf("请输入学生的成绩:");
             scanf("%d",&(l->data.score));
             //每个新创建的节点的next域都初始化为NULL
             l->next = NULL;
             system("cls");
        }
        
        void inputStudentNo(char s[],char no[]){
            printf("请输入要%s的学生学号:",s);
            scanf("%s",no);
        }
        //遍历表中学生 
        void displayNode(Link head){
            if(head==NULL)
            {
                printf("学生为空\n");
                return; 
            }
            else
            {
                Link p=head->next;
                while(p)
                {
                    cout<<"姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
                    //ofs<< "姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
                    p=p->next;
                }
                
            }
           // 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息
           system("pause");
           system("cls");
        }
        
        /* 增加学生记录 */
        bool addNode(Link head){
             Link p,q;   //p,q两个节点一前一后
             Link node;  //node指针指向新创建的节点
             node=(Link)malloc(sizeof(Node));
             inputStudent(node);
        
             q = head;
             p = head->next;  //q指向head后面的第一个有效节点
             if(head->next==NULL)
                 //链表为空时
                head->next = node;
             else {
                 //循环访问链表中的所有节点
                while(p != NULL){
                    if (node->data.studentNo < p->data.studentNo){
                        //如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序
                        q->next = node;
                        node->next = p;
                        return true;
                    }
                    else{
                        //如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后)
                        q = p;
                        p = p->next;
        
                    }
                }
                //如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面
                q->next = node;
        
            }
             return true;
             system("pause");
           system("cls");
        }
        
        bool deleteNode(Link head){
            // 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false
        
            //输入要处理的学号
                char no[NO_LENGTH];
            inputStudentNo("删除",no);
                Link p=head->next;
            Link q=head;
            while(p)
            {
                if(strcmp(p->data.studentNo,no)==0)
                {
                    cout<<"成功删除该学生"<<endl; 
                    q->next=p->next;
                    free(p);
                    system("pause");
                       system("cls");
                    return true;
                }
                else
                {
                    q=p;
                    p=p->next;
                }
            }
            cout<<"未找到该学生"<<endl; 
        system("pause");
           system("cls");
            return false;
        }
        
        //查找学生信息 
        bool queryNode(Link head){
            // 按照给定的学号查询学生记录,如果查找成功返回true,如果没找到学号返回false
        
            //输入要处理的学号
            char no[NO_LENGTH];
            inputStudentNo("查找",no);
                Link p=head->next;
            while(p)
            {
                if(strcmp(p->data.studentNo,no)==0)
                {
                    
                       system("cls");
                       cout<<"姓名:"<<p->data.studentName<<"    学号:"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
                    return true;
                }
                else
                {
                    p=p->next;
                }
            }
            cout<<"未找到该学生"<<endl; 
           system("cls");
        
            return false;
        }
        
        //修改学生信息 
        bool modifyNode(Link head){
            // 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false
            
            //输入要处理的学号
            char no[NO_LENGTH];
            inputStudentNo("修改",no);
            Link p=head->next;
            while(p)
            {
                if(strcmp(p->data.studentNo,no)==0)
                {
                    cout<<"请输入修改后的姓名"<<endl; 
                    cin>>p->data.studentName;
                    cout<<"请输入修改后的学号"<<endl; 
                    cin>>p->data.studentNo;
                    cout<<"请输入修改后的成绩"<<endl; 
                    cin>>p->data.score;
                    system("cls");
                    return true;
                }
                else
                {
                    p=p->next;
                }
            }
            cout<<"未找到该学生,请重新输入学号"<<endl; 
            system("cls");
            return false;
        }
        
        //统计学生人数
        int countNode(Link head){
            //统计学生人数,扫描链表统计节点个数,返回节点数
            Link p;
            int count = 0;
            p = head->next;
            while(p)
            {
                p=p->next;
                count++;
            }
            //填充代码
            system("cls");
            return count;
        }
        
        //清空链表 
        void clearLink(Link head){
            Link q,p;
            p=head->next;
            q=head;
            while(p)
            {
                q->next=p->next;
                free(p);
                p=q->next;
            }
                //遍历链表,用free语句删除链表中用malloc建立起的所有的节点
        }
        
        //学生数据文件储存 
        //储存任意时期的学生数据 
        void Store_List(Link head)
        {
            //文件操作 
            ofstream ofs;
            ofs.open("Std_Information.txt",ios::out);
            
            if(head==NULL)
            {
                printf("学生为空\n");
                return; 
            }
            else
            {
                Link p=head->next;
                while(p)
                {
                    ofs<< "姓名:"<<p->data.studentName<<"    学号:"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
                    p=p->next;
                }
                
            }
        }
        int main() {
            int select;
                int count;
            Link head;  // 定义链表
            
            
            //建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据
            head = (Link)malloc(sizeof(Node));
            head->next = NULL;
        
            while(1)
            {
                myMenu();
                printf("\n请输入你的选择(0-8):");  //显示提示信息
                scanf("%d",&select);
                switch(select)
                {
                case 1:
                    //增加学生记录
                    if(addNode(head))
                        printf("成功插入一个学生记录。\n\n");
                    break;
                case 2:
                    //删除学生记录
                    if(deleteNode(head))
                        printf("成功删除一个学生记录。\n\n");
                    else
                        printf("没有找到要删除的学生节点。\n\n");
                    break;
                case 3:
                    //查询学生记录
                    if(queryNode(head))
                        printf("成功找到学生记录。\n\n");
                    else
                        printf("没有找到要查询的学生节点。\n\n");
                    break;
                case 4:
                    //修改学生记录
                    if(modifyNode(head))
                        printf("成功修改一个学生记录。\n\n");
                    else
                        printf("没有找到要修改的学生节点。\n\n");
                    break;
                case 5:
                    //统计学生人数
                    count = countNode(head);
                    printf("学生人数为:%d\n\n",count);
                    break;
                case 6:
                    //显示学生记录
                    displayNode(head);
                    break;
                case 7:Store_List(head);
                        cout<<"打印成功"<<endl; 
                        system("pause");
                           system("cls");
                    break;
                case 8:
                    //退出前清除链表中的所有结点
                    clearLink(head);
                    return 0;
                default:
                    printf("输入不正确,应该输入0-8之间的数。\n\n");
                    system("pause");
                    system("cls"); 
                    break;
                }
            }
            return 0;
        }

        7.测试结果

        C语言实现学生信息管理系统(文件操作)

        C语言实现学生信息管理系统(文件操作)

        C语言实现学生信息管理系统(文件操作)

        C语言实现学生信息管理系统(文件操作)

        C语言实现学生信息管理系统(文件操作)

        C语言实现学生信息管理系统(文件操作)

        以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

        声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。