1. 设计思路

本实战的实质是完成对学生成绩信息的建立、查找、插入、修改、删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。

2. 数据结构

本项目的数据是一组学生的成绩信息,每条学生的成绩信息由学号、姓名和成绩组成,这组学生的成绩信息具有相同特性,属于同一数据对象,相邻数据元素之间存在序偶关系。由此可以看出,这些数据具有线性表中数据元素的性质,所以该系统的数据采用线性表来存储。

顺序表是线性表的顺序存储结构,是指用一组连续的内存单元依次存放线性表的数据元素。在顺序存储结构下,逻辑关系相邻的两个元素在物理位置上也相邻,这是顺序表的特点。本项目可以采用顺序表的线性表顺序存储结构。

若一个数据元素仅占一个存储单元,则其存储方式参见下图。

从图中可见,第 i个数据元素的地址为
Loc(ai)=loc(a1)+(i-1)

假设线性表中每个元素占用 k个存储单元,那么在顺序表中,线性表的第 i个元素的存储位置与第 1 个元素的存储位置的关系是
Loc(ai)=loc(a1)+(i-1)*k

这里 Loc(ai)是第 i个元素的存储位置,loc(a1)是第 1 个元素的存储位置,也称为线性表的基址。显然,顺序表便于进行随机访问,故线性表的顺序存储结构是一种随机存储结构。

顺序表适宜于做查找这样的静态操作;顺序存储的优点是存储密度大,存储空间利用率高。缺点是插入或删除元素时不方便。

用结构体类型定义每个学生数据,故该数组中的每个数据的结构可描述为:

typedef struct StudentTag
{std::string id;std::string name;int age;float score;
}Student;

3. 程序清单

project.h文件:

#include <iostream>
#include <string>typedef struct StudentTag
{std::string id;std::string name;int age;float score;// 结构体初始化StudentTag(std::string i="", std::string n="", int a=0, float s=0.0) {id = i;name = n;age = a;score = s;}
}Student;class LinearList
{public:LinearList(int size);~LinearList();void init_list();void clear_list();bool is_empty();bool is_full();int print_list();int get_list_length();int get_element(int i, Student &data);int insert_element(int i, Student data);int delete_element(int i, Student &data);int update_element(int i, Student data);private:Student *stu;int length;int cap;
};

project.cpp

#include "project.h"LinearList::LinearList(int size)
{stu = new Student[size];if(stu == NULL){std::cout << " new error" << std::endl;}length = 0;cap = size;std::cout << "constructor done" << std::endl;
}LinearList::~LinearList()
{if(stu != NULL){delete[] stu;stu = NULL;length = 0;cap = 0;}std::cout << "destructor done" << std::endl;
}void LinearList::init_list()
{std::cout << "init_list start" << std::endl;stu->id = "00001";stu->name = "Tom";stu->age = 18;stu->score = 99.5;(stu+1)->id = "00002";(stu+1)->name = "Jack";(stu+1)->age = 19;(stu+1)->score = 98;length += 2;std::cout << "init_list done" << std::endl;
}void LinearList::clear_list()
{std::cout << "clear_list start" << std::endl;for(int i=0; i<length; ++i){(stu+i)->id = "";(stu+i)->name = "";(stu+i)->age = 0;(stu+i)->score = 0;}length = 0;cap = 0;std::cout << "clear_list done" << std::endl;
}bool LinearList::is_empty()
{return length == 0 ? true : false;
}bool LinearList::is_full()
{return length == cap && length != 0 ? true : false;
}int LinearList::print_list()
{for(int i=0; i<length; ++i){std::cout   << "id:" << (stu+i)->id << " "<< "name:" << (stu+i)->name << " "<< "age:" << (stu+i)->age << " "<< "score:" << (stu+i)->score << " "<< std::endl;}return 0;
}int LinearList::get_list_length()
{return length;
}int LinearList::get_element(int i, Student &data)
{if(i < 1 || i > length){std::cout << "i is not in (1, " << length << ")" << std::endl;return -1;}data = *(stu + i - 1);return 0;
}int LinearList::insert_element(int i, Student data)
{if(i < 1 || i > cap){std::cout << "i is not in (1, " << cap << ")" << std::endl;return -1;}// 要插入的元素在原始线性表最后一个元素之后if(i >= length){*(stu + length) = data;   }else // 要插入的元素在原始线性表第一个元素和最后一个元素之间{for(int j=length; j>=i; --j){*(stu + j + 1) = *(stu + j);}*(stu + i) = data;}length += 1;return 0;
}int LinearList::delete_element(int i, Student &data)
{if(is_empty() || (i < 1 || i > length)){return -1;}data = *(stu + i - 1);for(int j=i; j<length; ++j){*(stu + j - 1 ) = *(stu + j);}length -= 1;return 0;
}int LinearList::update_element(int i, Student data)
{if(i < 1 || i >= length){std::cout << "i is not in (1, " << length << ")" << std::endl;return -1;}*(stu + i - 1) = data;return 0;
}

main.cpp

#include "project.cpp"int main()
{LinearList L(10);L.init_list();L.print_list();// L.clear_list();// L.print_list();bool is_empty = L.is_empty();std::cout << "is_empty: " << is_empty << std::endl; bool is_full = L.is_full();std::cout << "is_full: " << is_full << std::endl;    std::cout << "length: " << L.get_list_length() << std::endl;  Student s;L.get_element(2, s);std::cout << "第 2 个元素为 "  << "id:" << s.id << " "<< "name:" << s.name << " "<< "age:" << s.age << " "<< "score:" << s.score << " "<< std::endl;Student si("00003", "wohu", 18, 97);L.insert_element(2, si);std::cout << "插入元素之后的结果" << std::endl;L.print_list();Student sd;L.delete_element(1, sd);std::cout << "要删除的元素为 "  << "id:" << sd.id << " "<< "name:" << sd.name << " "<< "age:" << sd.age << " "<< "score:" << sd.score << " "<< std::endl;std::cout << "删除元素之后的结果" << std::endl;L.print_list();Student su("00004", "kuku", 20, 94);std::cout << "要更改的元素为 "  << "id:" << su.id << " "<< "name:" << su.name << " "<< "age:" << su.age << " "<< "score:" << su.score << " "<< std::endl;L.update_element(1, su);std::cout << "更新元素之后的结果" << std::endl;L.print_list();
}

数据结构(04)— 线性顺序表实战相关推荐

  1. python数据结构之线性顺序表

    线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列.本文结合了互联网上的一些代码,以及结合百度百科关于线性顺序表的定义,实现了全部代码. 在稍复杂的线性 ...

  2. C++实现线性顺序表的初始化,插入,删除,销毁,清空等功能

    C++实现线性顺序表的初始化,插入,删除,销毁,清空等功能 以下代码主要严蔚参考敏主编的<数据结构>(C语言)编写 //线性顺序表 #include <iostream> #d ...

  3. 数据结构之——《顺序表》

    数据结构之--<顺序表> 1.含义 2.分类 3.接口函数实现 4.顺序表的优缺点 1.含义 顺序表示用一段纹理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组 ...

  4. c语言线性顺序表,C语言程序——线性顺序表.doc

    C语言程序--线性顺序表.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文 ...

  5. java实现线性顺序表

    2019独角兽企业重金招聘Python工程师标准>>> /*** * 线性顺序表*/ public class SequentialLinearList {private char[ ...

  6. 【数据结构】【顺序表】 SqList *L与SqList*L的区别

    [数据结构][顺序表] SqList *&L与SqList*L的区别 显然,对于顺序表的抽象数据模型中的函数,其参数使用各不相同. SqList *&L的情况 它的意思是,L是对Lis ...

  7. 数据结构之动态顺序表(含游戏菜单)

    上一篇文章我们谈了数据结构的静态顺序表,以及实现了静态顺序表,具体可以看我的上一篇文章->>>数据结构之静态顺序表. 我们可以知道,静态顺序表的缺点是:  因为使用的是定长数组,所以 ...

  8. 数据结构(07)— 线性顺序表基本操作

    1. 顺序表结构 #define MaxLen 50typedef struct {int data[MaxLen]; // 定义一个数组来存储线性表中所有元素int len; // 存储线性表的长度 ...

  9. 数据结构 线性顺序表 学生管理系统

    今年是专升本第一年,跟老师学习做了个学生管理系统,有菜单选项,基本的增删改查都是没有问题的,废话不多说,代码呈上: #include <stdio.h> #include<mallo ...

最新文章

  1. python基础知识填空-Python基础知识(1)
  2. Linux 安装完毕要做的事
  3. Pix2Pix Z图像翻译系统(自制)
  4. Chrome remote debugging protocol在自动化测试中的应用和实践
  5. Eclipse程序员要掌握的常用快捷键
  6. Ubuntu 20.04 安装 .deb 文件报 failed to install file: not supported
  7. ffmpeg打开音频设备
  8. 微信开发学习 问题1: 网页授权问题 “该连接无法访问” 解决方法
  9. spark学习——(二)spark基础环境配置-linux(1)
  10. 分享一份接口测试项目(非常值得练手)
  11. html全局背景代码,html背景代码
  12. ARP协议详解 ARP报文结构
  13. 解决系统任务管理器已经被管理员停用
  14. 文读懂安防视频监控系统中H.265、SVAC、GB/T28181、ONVIF、PSIA的区别。
  15. Arduino与Matlab的串口通讯:通过光敏电阻进行人数统计,以及改进:人物方向的判断并进行加减。
  16. VM虚拟机去虚拟化教程(三)修改内存品牌和序列号
  17. 套料排版代码python_钣金制造管理系统Fabcost自动套料排版设置
  18. 累进税率算法c语言,我国现行税制中运用的累进税率形式有( )。
  19. 基于5G智慧园区的车联网系统应用示范
  20. 乐视2 usb计算机连接,乐视手机怎么连接电脑?乐视手机连接电脑具体方法

热门文章

  1. 2022-2028年中国纳滤膜产业发展态势及市场发展策略报告
  2. Go 学习笔记(62)— Go 中 switch 语句中的 switch 表达式和 case 表达式之间的关系
  3. Mybatis传递多个参数的4种方式
  4. docfetcher,filelocator使用
  5. RabbitMQ超详细安装教程(Linux)
  6. SpringBoot-web开发(二): 页面和图标定制(源码分析)
  7. TensorRT深度学习训练和部署图示
  8. 2021年大数据基础(三):​​​​​​​​​​​​​​​​​​​​​大数据应用场景
  9. 2021年大数据ZooKeeper(四):ZooKeeper的shell操作
  10. 2021年大数据Spark(十六):Spark Core的RDD算子练习