zoukankan      html  css  js  c++  java
  • 【数据结构理论与实践】之线性表

      线性表是数据结构中最简单、最常用的一种线性结构,也是学习数据结构全部内容的基础,其掌握的好坏直接影响着后续知识的学习。下面将通过四个模拟项目来学习线性表的顺序和链式存储结构。

    一、学生成绩管理

    1、项目简介

      学生成绩管理师学校教务部门日常工作的重要组成部分,处理信息量很大。本项目是对学生成绩管理的简单模拟,用菜单选择方式完成下列功能:输出学生数据、学生数据查询、添加学生数据、修改学生数据、删除学生数据。

    2、设计思路

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

    3、数据结构

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

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

      顺序表便于进行随机访问,故线性表的顺序存储结构是一种随机存储结构。

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

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

    1 typedef struct STU{
    2    char stuno[10];    //学号
    3    char name[10];    //姓名
    4    float score;           //成绩 
    5 }ElemType;

    4、程序清单

      1 /*线性表1*/
      2 #include <iostream>
      3 #include <iomanip>
      4 #include <malloc.h>
      5 #include <string.h>
      6 using namespace std;
      7 
      8 #define MaxListSize 20
      9 #define EQUAL 1
     10 typedef struct STU{
     11     char stuno[10];
     12     char name[10];
     13     float score;
     14     int age;
     15 }ElemType;
     16 class List{
     17 private:
     18     //线性表的数组表示
     19     ElemType elem[MaxListSize];
     20     int length;
     21     int MaxSize;
     22 public:
     23     void init(List **L,int ms); //输入学生数据
     24     void DestoryList(List &L){  //删除所有学生数据
     25         free(&L);
     26     }
     27     void ClearList(){            //将顺序表置为空表
     28         length = 0;
     29     }
     30     bool ListEnpty(){            //判断顺序表是否为空表
     31         return length == 0;
     32     }
     33     bool ListFull(){            //判断顺序表是否为满
     34         return length == MaxSize;
     35     }
     36     bool ListDelete(int , ElemType &e); //删除某个学生数据
     37     void ListTraverse();        //遍历顺序表
     38     int ListLength();            //返回顺序表的长度
     39     void GetElem(int , ElemType *); //学生数据查询
     40     bool UpdateList(ElemType &e, ElemType);    //修改学生数据
     41     bool ListInsert(int, ElemType &);        //添加学生数据
     42     void printlist(int);
     43     bool Less_EqualList(ElemType *e1,ElemType *e2);
     44     bool LocateElem(ElemType e, int type);
     45     bool EqualList(ElemType *e1,ElemType *e2);
     46 };
     47 
     48 //接口实现
     49 void List::init(List **L, int ms){
     50     *L = (List *)malloc(sizeof(List));
     51     (*L)->length = 0;
     52     (*L)->MaxSize = ms;
     53 }
     54 
     55 int List::ListLength(){
     56     return length;
     57 }
     58 
     59 bool List::ListDelete(int mark, ElemType &e){
     60     int i,j;
     61     if(ListEnpty())
     62         return false;
     63     if(mark>0){//删除表头元素
     64         e = elem[0];
     65         for(i = 1; i < length;i++ )
     66             elem[i-1] = elem[i];
     67     }else if(mark < 0){
     68         e = elem[length-1];
     69     }else{
     70         for(i =0;i<length;i++)
     71             if(strcmp(elem[i].name,e.name) == 0)
     72                 break;
     73             if(i>=length)return false;
     74             else e=elem[i];
     75             for(j = i+1;j<length;j++)
     76                 elem[j-1] = elem[j];
     77     }
     78     length--;
     79     return true;
     80 }
     81 
     82 void List::ListTraverse(){
     83     for(int i=0;i<length;i++){
     84         cout<<setw(8)<<elem[i].name;
     85         cout<<setw(10)<<elem[i].stuno;
     86         cout<<setw(9)<<elem[i].age;
     87         cout<<setw(8)<<elem[i].score<<endl;
     88     }
     89 }
     90 
     91 void List::GetElem(int i, ElemType *e){
     92     *e = elem[i];
     93 }
     94 
     95 bool List::EqualList(ElemType *e1,ElemType *e2){
     96     if(strcmp(e1->name,e2->name))
     97         return false;
     98     if(strcmp(e1->stuno,e2->stuno))
     99         return false;
    100     if(e1->age != e2->age)
    101         return false;
    102     if(e1->score != e2->score)
    103         return false;
    104     return true;
    105 }
    106 
    107 bool List::Less_EqualList(ElemType *e1,ElemType *e2){
    108     if(strcmp(e1->name,e2->name) <= 0)
    109         return true;
    110     else
    111         return false;
    112 }
    113 
    114 bool List::LocateElem(ElemType e, int type){
    115     int i;
    116     switch(type){
    117         case EQUAL:
    118             for(i=0;i<length;i++)
    119                 if(EqualList(&elem[i],&e))
    120                     return true;
    121                 break;
    122         default:
    123             break;
    124     }
    125     return false;
    126 }
    127 
    128 bool List::UpdateList(ElemType &e, ElemType e1){
    129     for(int i=0;i<length;i++)
    130         if(strcmp(elem[i].name,e.name) == 0){
    131             elem[i] = e1;
    132             return true;
    133         }
    134     return false;    
    135 }
    136 
    137 bool List::ListInsert(int i, ElemType &e){
    138     ElemType *p,*q;
    139     if(i <1 || i>length+1)return false;
    140     q = &elem[i-1];
    141     for(p = &elem[length-1];p >= q;--p)
    142         *(p+1) = *p;
    143     *q = e;
    144     ++length;
    145     return true;
    146 }
    147 
    148 void List::printlist(int mark){
    149     int *b = new int[length];
    150     int i,k;
    151     cout<<"    姓名     学号     年龄     成绩
    ";
    152     if(mark != 0){
    153         for(i=0;i<length;i++)b[i] = i;
    154         for(i = 0;i<length;i++){
    155             k = i;
    156             for(int j=i+1;j<length;j++){
    157                 if(mark == 1 &&elem[b[j]].score < elem[b[k]].score)
    158                     k = j;
    159                 if(mark == -1 && elem[b[k]].score < elem[b[j]].score)
    160                     k = j;
    161             }
    162         if(k != i){
    163             int x= b[i];
    164             b[i] = b[k];
    165             b[k] = x;
    166         }
    167     }
    168     for(int i = 0;i<length;i++){
    169         cout<<setw(8)<<elem[b[i]].name;
    170         cout<<setw(10)<<elem[b[i]].stuno;
    171          cout<<setw(9)<<elem[b[i]].age;     
    172          cout<<setw(8)<<elem[b[i]].score<<endl;
    173     }
    174     }else{
    175         for(i = 0;i<length;i++){
    176             cout<<setw(8)<<elem[i].name;
    177             cout<<setw(10)<<elem[i].stuno;
    178             cout<<setw(9)<<elem[i].age;
    179             cout<<setw(8)<<elem[i].score<<endl;
    180         }
    181     }
    182 }
    183 
    184 //main函数
    185 void main(){
    186     cout<<"linelise1m.cpp 运行结果:
    ";
    187     ElemType e1,e2,e3,e4,e5,e6;
    188     List *La,*Lb;
    189     int k;
    190     cout<<"首先调用插入函数.
    ";
    191     La->init(&La,4);
    192     strcpy(e1.name,"stu1");
    193     strcpy(e1.stuno,"100001");
    194     e1.age = 22;
    195     e1.score = 88;
    196     La->ListInsert(1,e1);
    197     strcpy(e2.name,"stu2");
    198     strcpy(e2.stuno,"100002");
    199     e2.age=21;
    200     e2.score=79;
    201     La->ListInsert(2,e2);
    202     strcpy(e3.name,"stu3");
    203     strcpy(e3.stuno,"100003");
    204     e3.age=19;
    205     e3.score=87;
    206     La->ListInsert(3,e3);
    207     La->printlist(0);
    208     cout<<"表La长:"<<La->ListLength()<<endl;
    209     cin.get();
    210 
    211     Lb->init(&Lb,4);
    212     strcpy(e4.name,"zmofun");
    213     strcpy(e4.stuno,"100001");
    214     e4.age=20;
    215     e4.score=94;
    216     Lb->ListInsert(1,e4);
    217     strcpy(e5.name,"bobjin");
    218     strcpy(e5.stuno,"100002");
    219     e5.age=23;
    220     e5.score=69;
    221     Lb->ListInsert(2,e5);
    222     strcpy(e6.name,"stu1");
    223     strcpy(e6.stuno,"100001");
    224     e6.age=22;
    225     e6.score=88;
    226     Lb->ListInsert(3,e6);
    227     Lb->printlist(0);
    228     cout<<"表Lb长:"<<Lb->ListLength()<<endl;
    229     cin.get();
    230 
    231     k=Lb->ListDelete(-1,e6);
    232     if(k==0) cout<<"删除失败!
    ";
    233     else cout<<"删除成功!
    ";
    234     cout<<"输出表Lb:
    ";
    235     Lb->printlist(0);
    236     cin.get();
    237     cout<<"按成绩升序输出表Lc
    ";
    238     Lb->printlist(1);cin.get();
    239     cout<<"按成绩降序输出表Lc
    ";
    240     Lb->printlist(-1);cin.get();
    241     
    242 }
    View Code

    结果如图:

    二、考试报名管理

    1、项目简介

      考试报名工作给高校报名工作带来了新的挑战,给教务管理部门增加了很多的工作量,报名数据手工录入既费时又会不可避免地出现错误。本项目对考试报名管理的简单模拟,用菜单选择方式完成下列功能:输入考生信息、输出考生信息、查询考生信息、添加考生信息、修改考生信息、删除考生信息。

    2、设计思路

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

    3、数据结构

    本项目的数据是一组考生信息,每条考生信息由准考证、姓名、性别、年龄、报考类别信息组成,这组考生信息具有相同特性,属于同一数据对象,响铃数据之间存在序偶关系。由此可以看出,这些数据也具有线性表的数据性质。

    本项目对考生数据主要进行插入、删除、修改等操作,所以采用链式存储结构比较合适, 用结构体类型定义每个考生信息,故该但练笔中的么个节点的结构可描述为:

    1 typedef struct examine{
    2     char examno[10];    //准考证号
    3     char name[10];       //姓名
    4     char sex;       //性别
    5     float age;      //年龄
    6    char examtype[5];       //成绩    
    7 }ElemType;

    4、程序清单

  • 相关阅读:
    2019.10.25 csp-s模拟测试87 反思总结
    2020.7.13
    2020.7.12 5. 最长回文子串
    全序列匹配(java)
    2020.7.10 刷题
    Matlab可视化小结
    C-means
    银行家算法(java swing)界面
    完全数——多线程 (Java)
    SIR模型实现(matlab)
  • 原文地址:https://www.cnblogs.com/baodaren/p/5165922.html
Copyright © 2011-2022 走看看