一.顺序表(1)

[toc]

前言

线性表(Liner List)

线性表:是具有==相同数据类型==的n(n≥0)个数据元素的==有限==序列,其中n为表长,当n = 0时,线性表是一个空表。

特点:一对一,除第一个唯一前驱,除最后一个有唯一后继.

a1-->a2-->a3-->a4

数据结构三要素:逻辑结构,存储结构,运算.

线性表是一种逻辑结构,有两种存储结构:顺序表和链表.

基本操作

  • 创建,销毁
  • 增加元素
  • 删除元素
  • 按位查找
  • 按值查找

常用操作

  • 判断表空
  • 求表长
  • 打印表

整个项目的构建

image-20210328141636320

编程软件采用vscode,采用cmake管理多文件,不需要手动编译.

关于具体vscode的讲解,我有写,但是还没整理好.

顺序表(静态分配)

静态分配,元素为结构体的顺序表

定义

我们取元素为结构体,写一个复杂一点点的,注意比较结构体相同的时候,不能用==.

未命名文件
#define MAXSIZE 10

typedef struct{
    int number;  //序号
    string name; //姓名
    

}Student;

//定义一个静态,元素为字符的顺序表,最大元素10
typedef struct 
{
    int length;             //当前表长
    Student data[MAXSIZE] ; //数据

}Seqlist;

初始化

==典型错误==

//初始化
void initList(Seqlist & l){
    l.length=0;
}
  • 由于内存中的脏数据,假如不初始化可能产生意想不到的效果.

我们强制打印一下,明显不是我们想要的结果

void test(){
    Seqlist l;
    initList(l);
    //insertListByOrder(l,1,'a');
    //printList(l);
    for(int i=0;i<10;i++){
        cout << "第" <<i <<"个" <<endl;
        cout << "名字是:"<<l.data[i].name << endl;
        cout << "序号是:" <<l.data[i].number << endl;
    }
}
image-20210328110744796

完善后的如下:

void initList(Seqlist & l){
    for(int i=0;i<Maxsize;i++){
        l.data[i].number=0;
        l.data[i].name="";
    }
    l.length=0;
}
image-20210328111320482

静态分配没必要销毁.

image-20210328143132687
  • 注意健壮性,判断位置与表满,

  • 尤其注意插入位置是1到表长+1

  • 由于需要修改顺序表,注意采用&

bool insertList(Seqlist & l,int n,int number,string name){
    //插入位置检查
    if(n<1||n>l.length+1){
        cout <<"插入位置不合法" <<endl;
        return false;
    }
    //表满检查
    if(l.length>=MAXSIZE){
        cout <<"表已满" <<endl;
        return false;
    }
    /* //从最后开始往后移一个位置
    for(int i=l.length-1;i>=n-1;i--){
        l.data[i+1]=l.data[i];
    }
    l.data[n-1]=e;
    l.length++;
    return true; */
    for(int i=l.length;i>=n;i--){
        l.data[i].name=l.data[i-1].name;
        l.data[i].number=l.data[i-1].number;

    }
    l.data[n-1].name=name;
    l.data[n-1].number=number;
    l.length++;
    return true;
}

调用代码,注意返回是bool,所以可以判断是否插入成功,printList()在后面有解释

   if(insertList(l,1,0,"Alice")){
        cout <<"insert success" <<endl;
    }
    //insertList(l,1,0,"Alice");
    insertList(l,2,1,"Baker");
    insertList(l,3,2,"Chris");

    printList(l);
image-20210328140459095

  • 注意有多个返回值,所以通过指针修改

  • 删除位置的合法性判断,1到表长

bool deleteListByOrder(Seqlist & l,int n,int &number,string & name){
    if(n<1||n>l.length){
        cout <<"删除位置不合法" <<endl;
        return false;

    }

    number=l.data[n-1].number;
    name=l.data[n-1].name;
    for(int i=n;i<l.length;i++){
        l.data[i-1].name=l.data[i].name;
        l.data[i-1].number=l.data[i].number;
    }
    l.length--;
    return true;

}

调用

string name;
    int number;
    if(deleteListByOrder(l,2,number,name)){
        cout <<"删除的学生序号是" <<number <<endl;
        cout <<"删除的学生名字是" <<name <<endl;
    }
    printList(l);

[图片上传失败...(image-8a461d-1616913118803)]/upload/image-20210328140621044.png)

// 按位序查找元素
void findElementByOrder(Seqlist  l,int n,int & number,string & name);

// 按内容---姓名查找位置,第一次出现,,没有返回-1
int findElementByValue(Seqlist  l,string name);

//按内容---结构体查找位置
int findStructByValue(Seqlist  l,Student student);
  • 注意判断结构体相同的方法
  • 由于
void findElementByOrder(Seqlist  l,int n,int &number,string & name){
    if(n<1||n>l.length){
        cout <<"查找位置不合法" <<endl;
        return;

    }
    number=l.data[n-1].number;
    name=l.data[n-1].name;

}

int findElementByValue(Seqlist  l,string name){
    for(int i=0;i<l.length;i++){
        if(l.data[i].name==name){
            return i+1;
        }
    }
    return -1;


}

int findStructByValue(Seqlist  l,Student student){
    for(int i=0;i<l.length;i++){
        if(isSameStudent(l.data[i],student)){
            return i+1;
        }
    }
    return -1;



}

调用

    int n=2;
    string name2="";
    int number2;
    findElementByOrder(l,n,number2,name2);
    cout << "第" <<n <<"个位置的序号是" << number2 <<endl;
    cout << "第" <<n <<"个位置的名字是" << name2 <<endl;

    cout <<"Alice的位序是" <<findElementByValue(  l,"Alice") <<endl;

    Student a;
    a.number=0;
    a.name="Alice";
    if(findStructByValue(l,a)){
        cout <<"位序是" <<findStructByValue(l,a) <<endl;
    }

image-20210328141449802

工具

//打印一下顺序表
void printList(Seqlist  l);

//表长
int lengthOfList(Seqlist l);

//判断表空 
bool isEmpty(Seqlist l);

//判断结构体相同
bool isSameStudent(Student a,Student b);
void printList(Seqlist  l){
    for (int i=0;i<l.length;i++){
        cout <<"第" << i+1 <<"个学生序号是 " << l.data[i].number <<endl;
        cout <<"第" << i+1 <<"个学生名字是 " << l.data[i].name <<endl;
    }
}

int lengthOfList(Seqlist l){
    return l.length ;
}

bool isEmpty(Seqlist l){
    if(l.length!=0){
        return false;
    }
    return true;
}

bool isSameStudent(Student a,Student b){
    if(a.name==b.name&&a.number==b.number){
        return true;
    }
    return false;
}

源程序如有必要,留言.

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容