当前位置:首页 > 开发教程 > C语言 >

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

时间:2022-05-31 09:29 来源:未知 作者:一人难称百人心 收藏

这篇文章主要为大家详细介绍了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++基于单链表实现学生成绩管理系统

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


下一篇:没有了

C语言阅读排行

最新文章