C语言中的顺序表

顺序表就是逻辑上相邻的数据元素物理上也相邻,连续存储
时间复杂度:最好O(1),最差O(n)

特点:

  • 支持随机访问
  • 存储密度高
  • 拓展容量不方便
  • 插入、删除元素不方便

定义顺序表

typedef int SLDataType;
typedef struct SeqList
{
    SLDataType *a;//动态开辟的数组
    size_t size;//有效数据个数
    size_t capacity;//容量大小
} SeqList;

初始化顺序表

void SeqListInit(SeqList *psl)
{
    assert(psl !=NULL);//断言,防止传进来的指针为空
    psl->a = NULL;//初始顺序表为空
    psl->size = 0;//初始数据个数为0
    psl->capacity = 0;//初始空间容量0
}

销毁顺序表

void SeqListDestroy(SeqList *psl)
{
    assert(psl != NULL);
    free(psl->a);//释放malloc给数组a开辟的空间
    psl->a = NULL;
    psl->size =  0;
    psl->capacity = 0;
}

检查顺序表是否满,方便增容

void CheckCapacity(SeqList *psl)
{
    assert(psl !=NULL);
    
    if(psl->size == psl->capacity)
    {
        size_t newcapacity;
        if(psl->capacity == 0)
        {
            newcapacity = psl->capacity = 4;
        }
        else
        {
            newcapacity = 2*psl->capacity;
        }
        SLDataType *p = (SLDataType *)relloc(psl->,newcapacity);
        if (NULL == p)
        {
            perror("relloc");
            exit(-1);
        }
        psl->a = p;
        psl->capacity = newcapacity;
    }
}

顺序表头插

voidSeqlistPushFront(SeqList *psl,SLDataType x)
{
    assert(psl);
    CheckCapacity(psl);
    
    int i = 0;
    for(i = psl->size-1;i>=0;i++)
    {
        psl->a[i + 1] = psl->a[i];
    }
    psl->a[0] = x;
    psl->size++;
}

顺序表尾插

void SeqListPushBack(SeqList *psl,SLDataType num)
{
    assert(psl != NULL);
    CheckCapacity(psl);
    
    psl->a[psl->size] = x;
    psl->size++;
}

顺序表头删

void SeqListPopFront(SeqList *psl)
{
    assert(psl);
    
    int i = 0;
    for(i = 0;i<psl->size;i++)
    {
        psl->a[i] = psl->a[i+1];
    }
    psl->size--;
}

顺序表尾删

void SeqListPopBack(SeqList *psl)
{
    assert(psl);
    assert(psl->size > 0);//顺序表不能为空
    
    //根据SLDataType类型,给0值
    psl->a[psl->size] = 0;
    psl->size--;
}

顺序表查找指定值

int SeqListFind(const SeqList *psl,SLDataType x)
{
    assert(psl);
    int i = 0;
    for(i=0;i<psl->size;i++)
    {
        if(psl->a[i] == x)
        {
            return i;
        }
        return -1;
    }
}

在顺序表指定下标位置插入数据

void SeqListInsert(SeqList *psl,size_t pos,SLDataType x)
{
    assert(psl);
    assert(pos >= 0 && pos <= psl->size);
    CheckCapacity(psl);
    
    size_t i = 0;
    for(i=psl->size;i>pos;i--)
    {
        psl->a[i] = psl->a[i-1];
    }
    psl->a[pos] = x;
    psl->size++;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值