数据结构(01) ——顺序表

11 篇文章 0 订阅

顺序表简介


顺序表是简单的一种线性结构,逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以 快速定位第几个元素,中间不允许有空值,插入、删除时需要移动大量元素。


顺序表的三个要素:

  • elems 记录存储位置的基地址
  • 分配一段连续的存储空间 size
  • length 记录实际的元素个数,即顺序表的长度

结构体定义

#define MAX_SIZE 100
    struct _SqList{
    ElemType *elems; // 顺序表的基地址
    int length; // 顺序表的长度
    int size; // 顺序表总的空间大小
}

顺序表的初始化

#define MAX_SIZE 100

typedef struct{
    int *elems; // 顺序表的基地址
    int length; // 顺序表的长度
    int size; // 顺序表的空间
}SqList;

bool initList(SqList &L) //构造一个空的顺序表 L
{
    L.elems=new int[MAX_SIZE]; //为顺序表分配 Maxsize 个空间
    if(!L.elems) return false; //存储分配失败
    L.length=0; //空表长度为 0
    L.size = MAX_SIZE;
    return true;
}

顺序表添加元素

bool listAppend(SqList &L, int e)
{
    if(L.length==MAX_SIZE) return false; //存储空间已满
    L.elems[L.length] = e;
    L.length++; //表长增 1
    return true;
}

顺序表插入元素

bool listInsert(SqList &L,int i, int e)
{
    if(i<0 || i>=L.length)return false; //i 值不合法
    if(L.length==MAX_SIZE) return false; //存储空间已满
    for(int j=L.length-1; j>=i; j--){
        L.elems[j+1]=L.elems[j]; //从最后一个元素开始后移,直到第 i 个元素后移
    }
    L.elems[i]=e; //将新元素 e 放入第 i 个位置
    L.length++; //表长增 1
    return true;
}

顺序表删除元素

bool listDelete(SqList &L,int i)
{
    if(i<0 || i>=L.length) return false; //不合法
    if(i == L.length-1){//删除最后一个元素,直接删除
        L.length--;
        return true;
    }
    for (int j=i; j<L.length-1; j++){
        L.elems[j] =L.elems[j+1]; //被删除元素之后的元素前移
    }
    L.length--;
    return true;
}

顺序表销毁 

void destroyList(SqList &L)
{
    if (L.elems) delete []L.elems;//释放存储空间
    L.length = 0;
    L.size = 0;
}

完整代码

#include <iostream> 

using namespace std; 

#define MAX_SIZE 100 

typedef struct{ 
    int *elems; // 顺序表的基地址 
    int length; // 顺序表的长度 
    int size; // 顺序表的空间 
}SqList; 

bool initList(SqList &L) //构造一个空的顺序表 L 
{ 
    L.elems=new int[MAX_SIZE]; //为顺序表分配 Maxsize 个空间 
    if(!L.elems) return false; //存储分配失败 
    L.length=0; //空表长度为 0 
    L.size = MAX_SIZE; 
    return true; 
}

bool listAppend(SqList &L, int e) {
    if(L.length==MAX_SIZE) return false; //存储空间已满 
    L.elems[L.length] = e; 
    L.length++; //表长增 1 
    return true; 
}

bool listInsert(SqList &L,int i, int e) { 
    if(i<0 || i>=L.length)return false; //i 值不合法 
    if(L.length==MAX_SIZE) return false; //存储空间已满 
    
    for(int j=L.length-1; j>=i; j--){ 
        L.elems[j+1]=L.elems[j]; //从最后一个元素开始后移,直到第 i 个元 素后移
    }
    
    L.elems[i]=e; //将新元素 e 放入第 i 个位置 
    L.length++; //表长增 1 
    return true; 
}

bool listDelete(SqList &L,int i) { 
    if(i<0 || i>=L.length) return false; //不合法 

    if(i == L.length-1){//删除最后一个元素,直接删除 
        L.length--; 
        return true; 
    }

    for (int j=i; j<L.length-1; j++){ 
        L.elems[j] =L.elems[j+1]; //被删除元素之后的元素前移 
    }

    L.length--; 
    return true; 
}

void listPrint(SqList &L) { 
    cout << "顺序表元素 size: "<<L.size<<", 已保存元素个数 length: "<< L.length <<endl; 

    for(int j=0; j<=L.length-1; j++){ 
        cout<<L.elems[j]<<" "; 
    }
    cout<<endl;
}

void destroyList(SqList &L) { 
    if (L.elems) delete []L.elems;//释放存储空间 
    L.length = 0; 
    L.size = 0; 
}

int main() { 
    SqList list; 
    int i,e; 

    cout << "顺序表初始化..." <<endl; 

    //1. 初始化 
    if(initList(list)){ 
        cout <<"顺序表初始化成功!" << endl; 
    }

    //2. 添加元素 
    int count = 0; 
    cout<<"请输入要添加的元素个数:"; 
    cin>>count; 

    for(int i=0; i<count; i++){ 
        cout << "\n 请输入要添加元素 e:"; 
        cin>>e; 
        if(listAppend(list, e)){ 
            cout <<"添加成功!" << endl; 
        }else{ 
            cout <<"添加失败!" << endl; 
        } 
    }
    listPrint(list); 
    
    //3. 插入元素 
    cout << "请输入要插入的位置和要插入的数据元素 e:"; 
    cin>>i>>e; 
    if(listInsert(list, i, e)){ 
        cout <<"插入成功!" << endl; 
    }else{ 
        cout <<"插入失败!" << endl;   
    }
    listPrint(list);

    //4. 删除元素 
    cout << "请输入要删除的位置 i:"; 
    cin>>i; 
    if(listDelete(list, i)){ 
        cout <<" 删除成功!" << endl; 
    }else{ 
        cout <<"删除失败!" << endl; 
    }
    listPrint(list); 

    //5. 销毁 cout << "顺序表销毁..."<<endl; 
    destroyList(list); 
    system("pause"); 
    return 0; 
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萝卜兽编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值