动态顺序表c语言实现

主要操作结构体中的指针,在init函数里对指针进行内存开辟,checkCapacity函数在每次插入之前检查一遍,如果可用空间没有了,就开辟当前最大容量的两倍。其他操作与静态顺序表无大区别。

seqList.h

#pragma once
#define DataType int

typedef struct seqList {
    DataType * array;
    int size;           //当前元素数
    int capicity;         //最大容量
}*PSeqListD, seqListD;

void SeqListDInit(PSeqListD ps, int capacity);
void SeqListDPushBack(PSeqListD ps, DataType data);
void SeqListDPopBack(PSeqListD ps);
void SeqListDInsert(PSeqListD ps, int pos, DataType data);
void SeqListDErase(PSeqListD ps, int pos);

// 获取元素个数 
int SeqListDSize(PSeqListD ps);
// 获取顺序表的容量 
int SeqListDCapacity(PSeqListD ps);
int SeqListDEmpty(PSeqListD ps);
// 将顺序表中的元素清空 注意:不改变顺序表空间的大小 
void SeqListDClear(PSeqListD ps);
void SeqListDDestroy(PSeqListD * ps);
// 对顺序表进行增容 
int CheckCapacity(PSeqListD ps);

test.c

#include "seqListD.h"

int main()
{
    seqListD seq;
    SeqListDInit(&seq, 5);
    SeqListDPushBack(&seq, 1);
    SeqListDInsert(&seq, 0, 2);
    SeqListDInsert(&seq, 0, 3);
    SeqListDInsert(&seq, 3, 4);
    SeqListDInsert(&seq, 2, 7);
    SeqListDPushBack(&seq, 9);
    SeqListDErase(&seq, 2);
}

seqList.c

#include "seqListD.h"
#include <stdio.h>
#include <malloc.h>
void SeqListDInit(PSeqListD ps, int capacity)
{
    if (NULL == ps || capacity < 0) {
        return;
    }
    ps->size = 0;
    ps->capicity = capacity;
    ps->array = (DataType*)malloc(sizeof(DataType) * capacity);
    if (ps->array == NULL) {
        printf("分配内存失败");
    }
}

void SeqListDDestroy(PSeqListD ps)
{
    if (NULL == ps) {
        return;
    }
    free(ps->array);
    ps->array = NULL;
}
void SeqListDPushBack(PSeqListD ps, DataType data)
{
    if (NULL == ps || NULL == ps->array) {
        return;
    }
    if (CheckCapacity(ps)) {
        ps->array[ps->size] = data;
        ps->size++;
    }
}
void SeqListDPopBack(PSeqListD ps)
{
    if (NULL == ps || NULL == ps->array) {
        return;
    }
    if (ps->size == 0) {
        printf("无可删除的");
        return;
    }
    ps->size--;
}
void SeqListDInsert(PSeqListD ps, int pos, DataType data)
{
    if (NULL == ps || NULL == ps->array) {
        return;
    }
    if (CheckCapacity(ps)) {
        int i = 0;
        for (i = ps->size; i > pos; i--) {
            ps->array[i] = ps->array[i - 1];
        }
        ps->array[pos] = data;
        ps->size++;
    }
}
void SeqListDErase(PSeqListD ps, int pos) {

    if (NULL == ps || NULL == ps->array) {
        return;
    }
    if (ps->size == 0) {
        printf("没有元素可以删\n");
        return;
    }
    int i = 0;
    for (i = pos; i < ps->size - 1; i++) {
        ps->array[i] = ps->array[i + 1];
    }
    ps->size--;
}

// 对顺序表进行增容 
int CheckCapacity(PSeqListD ps)
{
    if (NULL == ps) {
        return 0;
    }
    //防止新空间开辟失败旧空间丢失的情况
    if (ps->size == ps->capicity) {
        DataType * newBase = (PSeqListD)realloc(ps->array, 2 * ps->capicity * sizeof(DataType));
        if (newBase == NULL) {
            printf("扩容失败");
            return 0;
        }
        ps->array = newBase;
        ps->capicity *= 2;
    }
    return 1;
}
// 获取元素个数 
int SeqListDSize(PSeqListD ps)
{
    if (NULL == ps) {
        return -1;
    }
    return ps->size;
}

// 获取顺序表的容量 
int SeqListDCapacity(PSeqListD ps)
{
    if (NULL == ps) {
        return -1;
    }
    return ps->capicity;
}

int SeqListDEmpty(PSeqListD ps)
{
    if (NULL == ps) {
        return -1;
    }
    return ps->size ? 1 : 0;
}

// 将顺序表中的元素清空 注意:不改变顺序表空间的大小 
void SeqListDClear(PSeqListD ps)
{
    if (NULL == ps) {
        return;
    }
    ps->size = 0;
}

猜你喜欢

转载自blog.csdn.net/hanzheng6602/article/details/79917391