C++基于单链表实现学生成绩管理系统

 更新时间:2022年05月30日 17:18:25   作者:昭昭霜影  
这篇文章主要为大家详细介绍了C++基于单链表实现学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

/*程序说明:
    程序是由单链表实现的学生成绩管理系统,主要功能有输入/查找/删除/修改/排序/显示学生成绩;
    输入功能由带头结点的单链表实现,并且使用前插法输入学生信息;
    输入功能可以实现插入学生信息的功能,所以无需再专门写一个插入的函数;
    删除/修改学生信息要用到查找功能,所以将查找与删除/修改功能写到一起;
    查找功能使用顺序查找遍历整个单链表;
    使用直接插入法对学生信息排序;

    程序主要复习对单链表的使用,所以并没有完整的对错误输入的保护功能;
    由于学过的是c++,但教科书是由c语言为主,所以写的代码是混合c与c++;

    编译环境:visual studio 2017
    2017.5.13
*/

#include<iostream>
using namespace std;
struct Node;
typedef struct Node* PNode;
struct Node
{
    long int stuId;
    char name[30];
    //成绩
    float Math;
    float English;
    float Chinese;

    float sum;//总分
    PNode link;
};
typedef struct Node* LinkList;

//输入学生信息
LinkList Input(LinkList llist)
{
    LinkList p;
    long int n;
    cout << "\n***********************成绩输入入口***********************\n";
    cout << "请输入你想输入的学生信息个数:\n";
    cin >> n;
    for (int i = n; i > 0; i--)//前插法插入信息
    {
        p = (LinkList)malloc(sizeof(struct Node));
        cout << "输入学生学号:\n";
        cin >> p->stuId;
        cout << "输入学生姓名:\n";
        cin >> p->name;
        cout << "输入学生数学成绩:\n";
        cin >> p->Math;
        cout << "输入学生英语成绩:\n";
        cin >> p->English;
        cout << "输入学生语文成绩:\n";
        cin >> p->Chinese;

        p->sum = p->Math + p->English + p->Chinese;//总分

        //使用含有头结点的单链表实现信息的输入
        p->link = llist->link;
        llist->link = p;
    }
    return llist;
}

//查找/修正学生的信息
void Check(LinkList llist)
{
    LinkList p, q;
    long int id;
    char sName[30];
    cout << "\n***********************成绩查改入口***********************\n";
    if (llist->link == NULL)
        cout << "没有学生信息记录\n";
    else
    {
        cout << "输入查找方式:\n"
            << "1.按学号查找\n2.按姓名查找\n";
        int a;
        cin >> a;
        if (a == 1)//按学号查找
        {
            p = llist;
            q = p->link;
            cout << "输入学生学号:\n";
            cin >> id;
            while (q->stuId != id&&q->link != NULL)//从单链表表头顺序查找
            {
                p = q;
                q = q->link;
            }
            if (q->stuId == id)
            {
                cout << "学生信息如下:\n";
                cout << q->stuId << "\t" << q->name << "\t" << q->Math << "\t"
                    << q->English << "\t" << q->Chinese << "\t" << q->sum << endl;
                cout << "输入功能序号:\n"
                    << "1.修改学生信息\n2.删除学生信息\n0.退出\n";
                int b;
                cin >> b;
                if (b == 1)//修改学生信息
                {
                    cout << "请输入修正后的学生信息:\n";
                    cout << "输入学生学号:\n";
                    cin >> q->stuId;
                    cout << "输入学生姓名:\n";
                    cin >> q->name;
                    cout << "输入学生数学成绩:\n";
                    cin >> q->Math;
                    cout << "输入学生英语成绩:\n";
                    cin >> q->English;
                    cout << "输入学生语文成绩:\n";
                    cin >> q->Chinese;

                    q->sum = q->Math + q->English + q->Chinese;
                }
                else if (b == 2)//删除学生信息
                {
                    p->link = q->link;
                    free(q);
                }
            }
            else
                cout << "查无此人\n";
        }

        else if (a == 2)//按姓名查找
        {
            p = llist;
            q = p->link;
            cout << "输入学生姓名:\n";
            cin >> sName;
            while (strcmp(sName, q->name) != 0 && q->link != NULL)//从单链表表头顺序查找
            {
                p = q;
                q = q->link;
            }
            if (strcmp(sName, q->name) == 0)
            {
                cout << "学生信息如下:\n";
                cout << q->stuId << "\t" << q->name << "\t" << q->Math << "\t"
                    << q->English << "\t" << q->Chinese << "\t" << q->sum << endl;
                cout << "输入功能序号:\n"
                    << "1.修改学生信息\n2.删除学生信息\n0.退出\n";
                int b;
                cin >> b;
                if (b == 1)//修改学生信息
                {
                    cout << "请输入修正后的学生信息:\n";
                    cout << "输入学生学号:\n";
                    cin >> q->stuId;
                    cout << "输入学生姓名:\n";
                    cin >> q->name;
                    cout << "输入学生数学成绩:\n";
                    cin >> q->Math;
                    cout << "输入学生英语成绩:\n";
                    cin >> q->English;
                    cout << "输入学生语文成绩:\n";
                    cin >> q->Chinese;

                    q->sum = q->Math + q->English + q->Chinese;
                }
                else if (b == 2)//删除学生信息
                {
                    p->link = q->link;
                    free(q);
                }
            }
            else
                cout << "查无此人";
        }
    }
}

//对学生信息排序
void Sort(LinkList llist)
{
    LinkList p, q, r;
    cout << "\n***********************成绩排序入口***********************\n";

    if (llist->link == NULL)
        cout << "没有学生信息记录\n";
    else
    {
        cout << "选择排序方式:\n"
            << "1.按学号\n2.按数学成绩\n3.按英语成绩\n4.按语文成绩\n5.按总分\n";
        int a;
        cin >> a;
        //使用直接插入法进行排序
        switch (a)
        {
        case 1://按学号
            p = llist->link->link;
            llist->link->link = NULL;
            while (p != NULL)//学号由小到大排列
            {
                r = p->link;
                q = llist;
                while (q->link != NULL&&q->link->stuId < p->stuId)//查找插入位置
                    q = q->link;
                //插入
                p->link = q->link;
                q->link = p;
                p = r;
            }
            break;
        case 2://按数学
            p = llist->link->link;
            llist->link->link = NULL;
            while (p != NULL)//数学成绩由高到低排列
            {
                r = p->link;
                q = llist;
                while (q->link != NULL&&q->link->Math > p->Math)//查找插入位置
                    q = q->link;
                //插入
                p->link = q->link;
                q->link = p;
                p = r;
            }
            break;
        case 3://按英语
            p = llist->link->link;
            llist->link->link = NULL;
            while (p != NULL)//英语成绩由高到低排列
            {
                r = p->link;
                q = llist;
                while (q->link != NULL&&q->link->English > p->English)//查找插入位置
                    q = q->link;
                //插入
                p->link = q->link;
                q->link = p;
                p = r;
            }
            break;
        case 4://按语文
            p = llist->link->link;
            llist->link->link = NULL;
            while (p != NULL)//语文成绩由高到低排列
            {
                r = p->link;
                q = llist;
                while (q->link != NULL&&q->link->Chinese > p->Chinese)//查找插入位置
                    q = q->link;
                //插入
                p->link = q->link;
                q->link = p;
                p = r;
            }
            break;
        case 5://按总分
            p = llist->link->link;
            llist->link->link = NULL;
            while (p != NULL)//总分成绩由高到低排列
            {
                r = p->link;
                q = llist;
                while (q->link != NULL&&q->link->sum > p->sum)//查找插入位置
                    q = q->link;
                //插入
                p->link = q->link;
                q->link = p;
                p = r;
            }
            break;
        }
    }
}

//显示学生的信息
void Display(LinkList llist)
{
    LinkList p;
    p = llist->link;
    cout << "\n***********************成绩显示入口***********************\n";
    if (llist->link == NULL)
        cout << "没有学生信息记录\n";
    else
    {
        cout << "学生信息如下:\n";
        cout << "学号\t 姓名\t 数学\t 英语\t 语文\t 总分\n";
        while (p)//输出学生信息
        {
            cout << p->stuId << "\t" << p->name << "\t" << p->Math << "\t"
                << p->English << "\t" << p->Chinese << "\t" << p->sum<<endl;
            p = p->link;
        }
    }
}


//程序主体
int main()
{
    LinkList llist= (LinkList)malloc(sizeof(struct Node));
    llist->link = NULL;
    int a, b=1;
    while (b)//循环使用菜单
    {
        cout << "\n***********************成绩管理系统***********************\n"
            << "请选择你所需要的功能:\n"
            << "1.输入学生信息\n2.查找/修正学生信息\n3.排序学生信息\n4.显示学生信息\n5.退出\n";
        cin >> a;
        switch (a)
        {
        case 1:
            llist=Input(llist);
            break;
        case 2:
            Check(llist);
            break;
        case 3:
            Sort(llist);
            break;
        case 4:
            Display(llist);
            break;
        case 5:
            b = 0;
            break;
        }
    }
    cout << "\n***********************感谢您的使用***********************\n";
    cin.get(); cin.get();
}

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

相关文章

  • C语言实现BMP图像细化处理

    C语言实现BMP图像细化处理

    这篇文章主要为大家详细介绍了C语言实现BMP图像细化处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 基于C++实现一个简单的音乐系统

    基于C++实现一个简单的音乐系统

    C++中的Beep 函数是一个发出嗡鸣声的函数,本文将利用这个函数实现制作一个简单的声音系统。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-12-12
  • 递归删除二叉树中以x为根的子树

    递归删除二叉树中以x为根的子树

    今天小编就为大家分享一篇关于递归删除二叉树中以x为根的子树,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • C语言 使用qsort函数来进行快速排序

    C语言 使用qsort函数来进行快速排序

    排序方法有很多种:选择排序,冒泡排序,归并排序,快速排序等。 看名字都知道快速排序是目前公认的一种比较好的排序算法。因为他速度很快,所以系统也在库里实现这个算法,便于我们的使用。 这就是qsort函数
    2022-02-02
  • 如何在C++类的外部调用类的私有方法

    如何在C++类的外部调用类的私有方法

    这篇文章主要介绍了如何在C++类的外部调用类的私有方法,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-09-09
  • 在编程语言中怎样定义队列及其使用(C++)

    在编程语言中怎样定义队列及其使用(C++)

    这篇文章主要介绍了在编程语言中怎样定义队列,本文主要根据c++来介绍,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • C语言切割多层字符串(strtok_r strtok使用方法)

    C语言切割多层字符串(strtok_r strtok使用方法)

    这篇文章主要介绍了C语言切割多层字符串的方法,说了strtok的弱点,使用strtok_r的方法
    2013-11-11
  • C++学习之Lambda表达式的用法详解

    C++学习之Lambda表达式的用法详解

    Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名。本文就来为大家详细讲讲C++中Lambda表达式的使用,需要的可以参考一下
    2022-07-07
  • 详解C语言的预处理效果

    详解C语言的预处理效果

    这篇文章主要为大家介绍了C语言的预处理效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • 详解利用C语言如何实现简单的内存池

    详解利用C语言如何实现简单的内存池

    这篇文章主要给大家介绍了关于C语言如何实现简单的内存池的相关资料,设计内存池的目标是为了保证服务器长时间高效的运行,通过对申请空间小而申请频繁的对象进行有效管理,减少内存碎片的产生,合理分配管理用户内存,需要的朋友可以参考下
    2021-08-08

最新评论