C语言实现学生信息管理系统(链表)

发布时间:2023-03-24 09:00

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

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

        1.头文件和预处理

        #include 
        #include
        #include
        #include
        #include
        #include
        using namespace std;
        #define NO_LENGTH  20
        #define NAME_LENGTH 11

        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\"); 
            
        }

        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<<\"姓名:\"<data.studentName<<\"    学号\"<data.studentNo<<\"  成绩:\"<data.score<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)
                {
                    q->next=p->next;
                    free(p);
                    system(\"pause\");
           system(\"cls\");
                    return true;
                }
                else
                {
                    q=p;
                    p=p->next;
                }
            }
        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<<\"姓名:\"<data.studentName<<\"    学号\"<data.studentNo<<\"  成绩:\"<data.score<next;
                }
            }
           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<<\"请输入修改后的姓名\"<>p->data.studentName;
                    cout<<\"请输入修改后的学号\"<>p->data.studentNo;
                    cout<<\"请输入修改后的成绩\"<>p->data.score;
                    system(\"cls\");
                    return true;
                }
                else
                {
                    p=p->next;
                }
            }
            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建立起的所有的节点
        }

        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 
        #include
        #include
        #include
        #include
        #include
        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\"); 
            
        }
        
        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<<\"姓名:\"<data.studentName<<\"    学号\"<data.studentNo<<\"  成绩:\"<data.score<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)
                {
                    q->next=p->next;
                    free(p);
                    system(\"pause\");
           system(\"cls\");
                    return true;
                }
                else
                {
                    q=p;
                    p=p->next;
                }
            }
        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<<\"姓名:\"<data.studentName<<\"    学号\"<data.studentNo<<\"  成绩:\"<data.score<next;
                }
            }
           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<<\"请输入修改后的姓名\"<>p->data.studentName;
                    cout<<\"请输入修改后的学号\"<>p->data.studentNo;
                    cout<<\"请输入修改后的成绩\"<>p->data.score;
                    system(\"cls\");
                    return true;
                }
                else
                {
                    p=p->next;
                }
            }
            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建立起的所有的节点
        }
        
        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;
        }

        7.测试结果

        \"C语言实现学生信息管理系统(链表)_第1张图片\"

        \"C语言实现学生信息管理系统(链表)_第2张图片\"

        \"C语言实现学生信息管理系统(链表)_第3张图片\"

        \"C语言实现学生信息管理系统(链表)_第4张图片\"

        \"C语言实现学生信息管理系统(链表)_第5张图片\"

        \"C语言实现学生信息管理系统(链表)_第6张图片\"

        \"C语言实现学生信息管理系统(链表)_第7张图片\"

        \"C语言实现学生信息管理系统(链表)_第8张图片\"

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

        ItVuer - 免责声明 - 关于我们 - 联系我们

        本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

        桂ICP备16001015号