数据结构顺序表代码实现

数据结构顺序表代码实现

首先顺序表存储容量有两种分配方式

第一张静态分配

typedef int ElemType; //给int类型取别名
#define MaxSize 50  //定义最大长度 
typedef struct{
    ElemType data[MaxSize];  // 存放线性表当中元素的最大容量
    int length;   //存放线性表的长度
}SqList;

第二种动态分配

#define InitSize 100 
typedef struct{
    ElemType *data;     //定义一个动态分配数组指针
    int MaxSize,length;   //数组的最大容量和当前的长度
}SqList;
//动态分配c语句为
//L.data = (ElemType*)malloc(sizeof(ElemType)*InitSize);
//c++语句为
//L.data = new ElemType[InitSize];

现在我们来创建一个顺序表

//数组元素a[0.....n-1]创建顺序表l
void CreateList(SqList *&L,ElemType a[],int n ) //由a中的n个元素创建线性表
{
     int i = 0,k = 0;   //k表示线性表l中元素的个数,初始值为0
    L = (SqList*) malloc(sizeof(SqList)); //分配存放线性表的空间
    while(i<n){
     L->data[k] = a[i];  //将元素a[i]存放到l中
     k++;
     i++;
    }
    L->length = k;
}

初始化线性表

void InitList(SqList *& L)
{
    L = (SqList*) malloc(sizeof(SqList));   //分配线性表的存放空间
    L ->length = 0;   //置空线性表的长度为0
}

销毁线性表

//销毁线性表
void DestroyList(SqList *& L){
    free(L);  //释放l所指的空间
}

判断线性表是否为空表

//判断线性表是否为空表
bool ListEmpty(SqList *L){
    return (L->length ==0);
}

求线性表的长度

//求线性表的长度
int ListLength(SqList *L){
     return (L->length);
}

输出线性表

//输出线性表
void DispList(SqList *L){
    for (int i = 0; i < L->length; i++) {
        printf("%d",L->data[i]);
        printf("\n");
    }
}

求线性表中某个元素的值

bool GetElem(SqList *L,int i ,ElemType &e){
    if(i<1 || i>L->length)
        return false;
    e = L ->data[i-1];//    取到元素的值
    return true;
}

按元素值查找

//按元素值查找
int LocateElem(SqList *L,ElemType e){
    int i = 0;
    while(i<L->length&&L->data[i]!=e)
        i++;
    if(i>=L->length)    //未找到时 返回0
        return 0;
    else
        return i+1;     //注意这里的i指到数组下标 找到之后要返回位序故i+1
}

在第i个位置插入元素

//插入数据元素
bool ListInsert(SqList *&L,int i,ElemType e){
    int j;
    if(i<1 || i>L->length+1)
        return false;
    i--;//将位序转化为数组下标
    for (j = L->length;j>i;j--) {
        L->data[j] = L->data[j-1];  //第i个元素及第i元素以后的元素依次向后移动一位
    }
    L->data[i] = e;
    L->length++;
    return true;
}

删除第i个位置的元素

//删除数据元素
bool ListDelete(SqList *&L,int i ,ElemType &e)
{
    int j;
    if(i<1 ||i>L->length)
        return false;
    i--;           //将位序转化为数组下标
    e = L->data[i];
    for (int j = i; j < L->length-1 ; j++) {
        L->data[j] =L->data[j+1];   //将data[i]之后的元素向前移动一个位置
    }
    L->length--;
    return true;
}
上一篇:【Gym102832B/2020CCPC长春B】The Tortoise and the Hare(式子转换+树套树)


下一篇:fastapi异步web框架入门