数据结构——线性表的顺序表示

 

//
// Created by 10841 on 2022/2/11.
// 顺序表就是线性表的顺序表示出来,可以当数组理解
//顺序表 : 顺序表是地址连续的存储单元 依次存取线性表的数据元素
#include <iostream>
using namespace std;
#define MAXSIZE 10
//定义学生 类型
typedef struct Student{
    char ID [20];// 没有string类型
    char Name[20];
}Student;

//定义线性表 类型
typedef struct {
    Student *elem;
    int length;   //顺序表的长度
}StuList;
/**
 * 初始化线性表
 * @return
 */
bool InitSequence(StuList &L){
    L.elem = new Student[MAXSIZE];   //初始化线性表,就是创建一个学生数组
    if(!L.elem){                     //判断 线性表是否创建成功
        return false;
    }
    L.length = 0;                   //线性表初始化后 长度为0
    return true;
}
/**
 * 线性表的插入
 * @param L 线性表变量  带& 是要返回去用
 * @param i 插入的位置
 * @param stu 插入的数据
 * @return
 */
bool InsertSequence(StuList &L,int i,Student stu){
    if (i<0 || i > L.length+1){         //判断要插入的位置是否 在合理的区间,这里判断错误1
        return false;
    }
    if(L.length == MAXSIZE){        //判断线性表中是否为满
        return false;
    }
    for (int j = L.length; j >= i-1; --j) {      //把插入的位置 空出来 ,之前的数据向后移动,j的判断条件是i
        L.elem[j+1] = L.elem[j];
    }
    L.elem[i-1] = stu;              //把学生数据放入到要线性表的位置
    L.length++;                     // 之前的 MAXSIZE是 创建的Student数组,而L是指针,从一开始就没有给 L 分配空间
    return true;
}
/**
 * 线性表的删除
 * @param L
 * @param i 删除的位置
 * @return
 */
bool DeleteSequence(StuList &L,int i){
    if(i<0 || i>L.length-1){        //查看删除位置是否 在合理的区间,,这里判断错误2
        return false;
    }
    for (int j = i; j <L.length-1 ; ++j) {
        L.elem[j-1] = L.elem[j];   // j要减一  学生是从0开始的
    }
    L.length--;
    return true;
}
/**
 * 拿到 下标为i的数
 * @param L
 * @param i 下标
 * @param S 返回值
 * @return
 */
bool GetListI(StuList &L,int i ,Student &S){
    if (i<1 || i>L.length){    //i 在合理的区间
        return false;
    }
    S = L.elem[i-1]; //下标从0开始 所以要减一
    return true;
}
/**
 * 寻找此项  在线性表中的 下标
 * @param L
 * @param i
 * @return
 */
int SelectGetIist(StuList &L ,Student S){
    for (int i = 0; i < L.length-1; ++i) {
        if (L.elem[i].ID==S.ID){
            return i+1;
        }
    }
    return 0;
}
/**
 * 把B表插入到L表
 * @param L
 * @param B
 */
void ListMerge(StuList &L,StuList B){
    int i = L.length,j = B.length;
    for (int k = 0; k < j; ++k) {
        if (!SelectGetIist(L,B.elem[k])){
            InsertSequence(L,++i,B.elem[k]);
        }
    }
}
/**
 * 输出所有线性表中的数据
 * @param L
 * @param i
 * @return
 */
Student SelectStudentALL(StuList &L,int i){
//    判断i是否合法 就是有没有超出 线性表的长度,没有比0小
    if(i>0 || i<L.length){
        return L.elem[i];
    }
}
int main(){
    StuList demo;
    InitSequence(demo);

    Student student1 = {"1", "张三"};
    Student student2 = {"2", "李四"};
    InsertSequence(demo, 1, student1);
    InsertSequence(demo, 2, student2);
    for (int i = 0; i < demo.length; ++i) {
        cout << demo.elem[i].ID << ":" << demo.elem[i].Name <<"\n";
    }
    GetListI(demo, 1, student2);
    cout << student2.ID << student2.Name << "\n";
    cout << SelectGetIist(demo, student1) << "\n";
    ListMerge(demo, demo);
    cout << demo.length;
    DeleteSequence(demo,1);
    cout << demo.length;

    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值