数据结构——顺序表

140bc76ffaa54645976b7245e27bbaf1.png

顺序表

1.特点:

空间连续,访问元素方便

0f0e36c8c87a432c9af9bb3c8ed27353.png

 2.顺序表结构体

//存放数据类型
typedef int DataType;
//顺序表结构体
typedef struct list
{
    DataType *pData;//存放数据空间首地址
    int tlen;//最大存放元素个数
    int clen;//当前元素个数
}SeqList;

如果要存放字符串类型的,最好写成以下形式

typedef struct str 
{
    char data[128];
}str_t;

//存储数据类型 
typedef str_t DataType;

3.创建顺序表

//创建顺序表
SeqList *CreateSeqList(int Maxlen){
    SeqList *pHead = NULL;
    //1.对标签申请空间
    pHead = malloc(sizeof(SeqList));
    if(NULL == pHead){
        perror("fail to malloc");
        return NULL;
    }
    //2.赋初值
    pHead->clen = 0;
    pHead->tlen = Maxlen;
    //3.对数据申请空间
    pHead->pData = malloc(Maxlen *sizeof(pHead->pData));
    if (NULL == pHead->pData)
    {
        return NULL;
    }
    return pHead;
}

4.判断顺序表

//顺序表是否已满
int IsFullSeqList(SeqList *pTmpList){
    return pTmpList->clen == pTmpList->tlen ? 1:0;
}
//顺序表是否为空
int IsEmptySeqList(SeqList *pTmpList){
    return pTmpList->clen == 0 ? 1 : 0;
}
//获得顺序表中元素的个数
int GetCountSeqList(SeqList *pTmpList){
    return pTmpList->clen;
}
//获得顺序表中元素的容量
int GetCapacitySeqList(SeqList *pTmpList){
    return pTmpList->tlen;
}

5.末尾添加元素

//末尾添加
int AppendSeqList(SeqList *pTmpList, DataType TmpData){
    //1.判断顺序表有没有满
    if(IsFullSeqList(pTmpList)){
        return -1;
    }
    pTmpList->pData[pTmpList->clen] = TmpData;
    pTmpList->clen++;
    return 0;
}

6.指定位置插入
返回-1 表示顺序表已满   返回-2 表示插入数据的位置错误

//指定位置插入
//返回-1 表示顺序表已满   返回-2 表示插入数据的位置错误
int PosInsertSeqList(SeqList *pTmpList, int Pos, DataType TmpData){
    int i = 0;
    //1。判断顺序表有没有满
    if(IsFullSeqList(pTmpList){
        return -1;
    }
    //2.判断插入数据有错误吗
    if(!(Pos >= 0 && Pos <= pTmpList->clen)){
        return -2;
    }
    //3.从后往前移数据
    for(i = pTmpList->clen; i > Pos; i--){
        pTmpList->pData[i] = pTmpList->pData[i-1];
    }
    pTmpList->pData[Pos] = TmpData;
    pTmpList->clen++;
    return 0;
}

7.元素遍历

//参数:
//    pFun:对遍历到的每一个数据的操作方法
//    arg:对pFun函数的传参
int ForeachSeqList(SeqList *pTmList, int (*pFun)(void *Element,void *arg),void *arg){
    int i = 0;
    int ret = 0;
    for(i = 0; i < pTmList->clen; i++){
       ret = pFun(&pTmList->pData[i],arg);
       if(ret != 0){
        return -1;
       }
    }
    return 0;
}

例如:查找顺序表中的某个元素所在下标,就可以使用ForeachSeqList函数,搭配FindData函数传参对遍历到的数据进行操作

int n = 0;
int FindData(void *pElement, void *arg){
    int *pData =(int *) pElement;
    if(20 == *pData){
        return 1;
    }else{
        (*(int *)arg)++;
    }
  
    return 0;
}
  ForeachSeqList(pseqlist,FindData,&n);
    printf("n = %d\n",n);

8.删除某个元素

int DeleteSeqList(SeqList *pTmpList, int Pos){
    int n = 0;
    if(IsEmptySeqList(pTmpList)){
        return -1;
    }
    if(!(Pos >= 0 && Pos < pTmpList->clen)){
        return -2;
    }
    for(n = Pos; n < pTmpList->clen-1; n++ ){
        pTmpList->pData[n] = pTmpList->pData[n+1];
    }
    pTmpList->clen--;
    return 0;
}

9.清零

int ClearSeqList(SeqList *pTmpList){
    pTmpList->clen = 0;
    return 0;
}

10.销毁顺序表

int DestroySeqList(SeqList **ppTmpList){
    free((*ppTmpList)->pData);
    free((*ppTmpList));
    *ppTmpList = NULL;
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值