暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据结构:第九节-线性表的顺序存储(下)

Cpp入门到精通 2024-05-14
53

点击蓝字

山月

关注我们

第九节 线性表的顺序存储(下)


上节介绍了线性表的顺序存储,线性表的顺序存储是指使用数组或类似数组的方式来存储线性表中的元素,其中的元素是连续存储的,那么这类数据结构什么特点呢,我们这节通过一个学生信息管理系统的例子来帮助大家理解!


学生管理系统可以使用线性表来存储和管理学生信息。在这个系统中,每个学生可以看作是线性表中的一个元素,线性表用来存储多个学生的信息。我们接下来分析一下如果我们要实现一个学生管理系统需要经过哪些步骤。


1.进行需求分析

学生信息录入:管理员能够录入学生基本信息,如姓名、性别、年龄、学号等。

学生信息查询:管理员能根据不同条件查询学生信息,如按学号、姓名、班级等查询。

学生信息删除:管理员可以删除学生信息,确保数据的完整性和安全性。


2.数据结构设计

分析系统所需存储的数据,如学生信息、教师信息、课程信息等。我们在这节以学生信息为例,设计合适的数据结构来存储学生信息,容器我们选用vector。

    struct Student {
    string name;
    int age;
    string studentID;
    };

    我们设计了一个学生结构体,其中包含了多个数据,我们之前讲到容器的类型比如说:int,char,float等等,这些都是系统提供的数据类型,当我们需要将多个相关数据作为一个单元来管理时,可以使用结构体作为容器的类型,比如说这里的学生信息就包含了多个信息。我们使用自定义数据类型作为容器的类型。(我们这里使用自定义数据类型主要是为了学习自定义数据类型做容器的类型,因为我们之前在学习容器的时候没有介绍。)

    3.进行界面设计

    我们可以考虑使用命令行界面(CLI)来实现,因为它简单直观,易于实现。在main函数里写可以,直接输出即可!

      int choice;
      while (true) {
      cout << "========== 学生信息管理系统 ==========" << endl;
      cout << " 1. 添加学生信息" << endl;
      cout << " 2. 显示所有学生信息" << endl;
      cout << " 3. 删除学生信息" << endl;
      cout << " 4. 查找学生信息" << endl;
      cout << " 5. 退出系统" << endl;
      cout << "请选择操作:";
      cin >> choice;
      }

      显示如下:

      4.模块划分

      接下来就要分模块来分别处理我们之前要实现的操作,学生信息的增删改查:

      第一步:我们需要定义一个名为 StudentManager 的类。这个类将用来管理学生信息,包括添加、删除、查找和显示学生信息等功能。

        class StudentManager {
        private:
        vector<Student>students;
        public:


        };

        通过将容器设为私有成员变量,使它只能在类的内部被访问和操作,具有封装性与数据安全性。

        第二步:在main函数中声明一个名为manager的 StudentManager 类型的对象。声明这个对象后,我们可以使用它来调用 StudentManager 类中定义的各种方法。

          StudentManager manager;

          第三步:之后我们就要进行操作的设计:

          增加学生信息:

            void addStudent() {
            Student newStudent;
            cout << "请输入学生姓名:";
            cin >> newStudent.name;
            cout << "请输入学生年龄:";
            cin >> newStudent.age;
            cout << "请输入学生学号:";
            cin >> newStudent.studentID;
            students.push_back(newStudent);
            cout << "学生信息添加成功!" << endl;
            }

            显示所有学生信息:

              void displayAllStudents() {
              cout << "所有学生信息如下:" << endl;
              for (const auto& student : students) {
              cout << "姓名:" << student.name << ",年龄:" << student.age << ",学号:" << student.studentID << endl;
              }
              }

              删除学生信息:

                void deleteStudent() {
                if (students.empty()) {
                cout << "学生信息为空,无法删除!" << endl;
                return;
                }


                string studentID;
                cout << "请输入要删除学生的学号:";
                cin >> studentID;


                for (auto it = students.begin(); it != students.end(); ++it) {
                if (it->studentID == studentID) {
                students.erase(it);
                cout << "学生信息删除成功!" << endl;
                return;
                }
                }
                cout << "未找到该学生信息,无法删除!" << endl;
                }

                查找学生信息:

                  void findStudent() {
                  if (students.empty()) {
                  cout << "学生信息为空,无法查找!" << endl;
                  return;
                  }


                  string studentID;
                  cout << "请输入要查找学生的学号:";
                  cin >> studentID;


                  for (const auto& student : students) {
                  if (student.studentID == studentID) {
                  cout << "找到学生信息:" << endl;
                  cout << "姓名:" << student.name << ",年龄:" << student.age << ",学号:" << student.studentID << endl;
                  return;
                  }
                  }
                  cout << "未找到该学生信息!" << endl;
                  }

                  我们把界面选项与操作链接:

                    switch (choice) {
                    case 1:
                    manager.addStudent();
                    break;
                    case 2:
                    manager.displayAllStudents();
                    break;
                    case 3:
                    manager.deleteStudent();
                    break;
                    case 4:
                    manager.findStudent();
                    break;
                    case 5:
                    cout << "感谢使用学生信息管理系统,再见!" << endl;
                    return 0;
                    default:
                    cout << "无效选择,请重新输入!" << endl;
                    }

                    简单的学生信息系统就实现完成了,那么我们分析一下顺序表学生信息管理系统的特点。

                    1.简单方便:我们使用了一个动态数组就实现了系统,而且操作也非常简单。

                    2.内存连续存储:学生信息在内存中是连续存储的,这样可以方便地进行随机访问和操作,我们可以直接通过下标访问学生信息,我们现在不用上述操作方法来添加信息,直接使用代码来添加,因为我们没有使用文件来保存之前添加的信息,所以不能很好的演示:

                      vector<Student>students;
                      students.push_back({ "XDOne",20,"180201"});
                      students.push_back({ "WenTeng",21,"180202" });
                      students.push_back({ "XiangYu",35,"180203" });
                      cout << "第三位学生信息:";
                      cout << "姓名:" << students[2].name << ",年龄:" << students[2].age << ",学号:" << students[2].studentID << endl;

                      3.插入和删除效率较低

                      假设我们需要在中间插入一个学生,需要将后面的学生信息往后移动,效率较低。

                      这就是线性表的顺序存储,感谢观看!欢迎各位的点赞与关注!您的点赞和关注是我学习更新的动力!如有问题,可下方留言!



                      往期推荐

                      C++基础知识

                      C++进阶知识

                      C++STL知识

                      • end • 

                      欢我们的内容就点“在看”分享给小伙伴哦

                      文章转载自Cpp入门到精通,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论