C实现顺序表

定义一个结构体

typedef struct {
    int *data;  //指向了第一个数据元素
    int maxSize;
    int length;
} SeqList;

初始化开辟一段连续的内存空间

void InitList(SeqList *L){
    // malloc 申请一连串的内存空间 返回起始位置地址的指针
    // 然后强转成数据元素类型所对应的指针 (int*) 指向int的指针  
    // 内存空间按每份int 4B  等分
    L->data = (int *) malloc(initSize*sizeof(int ) );
    L->length = 0;
    L->maxSize = initSize;
}

如果初始化开辟的空间不够用 则扩容

其中malloc() 与 free() 是较为不安全的

因为释放申请的空间后,其内数据也不会抹掉,如果再次malloc 申请到有残留数据的空间。可能会造成错误。(这里不太懂,欢迎大佬互动)

void IncreaseSize(SeqList *L, int len){
    // 获取初始的那一片连续空间 暂存原本的值
    int *p =  L->data;
    //原本的变量 重新开辟一段内存空间
    L->data = (int *) malloc((L->maxSize + len) * sizeof(int ) );
    // 原本值 赋予 新的内存空间中
    // 时间开销较大
    for (int i = 0; i < L->length; ++i) {
        L->data[i] = p[i];
    }
    //顺序表最大长度更新 结构体属性
    L->maxSize = L->maxSize + len;
    //释放掉暂存数据的空间
    free(p);
}

向尾部添加一个元素

下标与位序相差1, length正好是最大下标的后一位。

void push_list(SeqList *L, int el){
    // 下标+1 等于长度  如果大于等于  则容器分配的内存空间不足
    if(L->length+1 >= L->maxSize){
        // 扩容 空间翻倍
        IncreaseSize(L,L->maxSize*2);
    }
    // 向尾部添加元素
    L->data[L->length] = el;
    L->length += 1;
}

删掉尾元素

void drop_tail(SeqList *L){
    // 删除尾巴 用开辟的内存空间下一位置地址 替换尾巴的数值
    L->data[L->length-1] = L->data[L->maxSize];
    --L->length;
    // 实际元素小于内存占用一半
    if(L->length < L->maxSize / 2){
        IncreaseSize(L,L->length/4 * 3 );
    }
}

插入 元素从尾元素开始 依次向后位移一位

// 自由插入
// 顺序表 插入后半部分 尾元素向后依次移动一位
bool add_list(SeqList *L, int index, int el){
    if(index < L->length){
        for (int i = L->length; i >= index+1; --i) {
            L->data[i] = L->data[i-1];
        }
        L->data[index] = el;
    } else if(index >= L->maxSize || index < 0 || index > L->length+1){
        return 0;
    }
    ++L->length;
    return 1;
}

删除

// 自由删除
// 顺序表 被删除的下一位开始 依次向前移动一位
bool remove_index(SeqList *L, int index){
    // 不可删除未存在的值
    if(L->length <= index){
        return 0;
    }
    --L->length;
    for(int i = index; i <= L->length; ++i){
        L->data[i] = L->data[i+1];
    }
    // 实际元素小于内存占用一半
    if(L->length < L->maxSize / 2){
        IncreaseSize(L,L->length/4 * 3 );
    }
    return 1;
}

更改

// 安位改
void update_index(SeqList *L, int index, int el){
    if(index < L->length){
        L->data[index] = el;
    }
}
// 安值改
void update_value(SeqList *L, int value, int el){
    for (int i = 0; i < L->length; ++i) {
        if(value == L->data[i]){
            L->data[i] = el;
        }
    }
}

查询

// 查询元素首个位置  返回位序
int select_element(SeqList *L, int  el){
    for (int i = 0; i < L->length; ++i) {
        if(el == L->data[i]){
            return i+1;
        }
    }
    return 0;
}
// 安位查找
int select_index(SeqList *L, int index){
    return L->data[index];
}

迭代器

// 迭代器
int* iter(SeqList *L){
    return L->data;
}

main() 测试

int main(){
    //不可以声明为指针  否则是指向SeqList结构体的  传值时就不是变量L了
    SeqList L;
    // 取变量L地址
    InitList(&L);

    printf("data all the");
    for (int i = 0; i < 10; ++i) {
        push_list(&L,i);
        printf(" %d", L.data[i]);
    }
    printf("\n");

    push_list(&L, 333);
    printf("push[10] is %d \n", L.data[10]);
    drop_tail(&L);
    printf("drop[10] is %d \n", L.data[10]);

    printf("drop[10] is %d \n", *(iter(&L) + 1));

    printf("L size %d \n", (int) sizeof(L.data));

    add_list(&L,8,33333);
    add_list(&L,13,13);
    remove_index(&L,3);
    for (int i = 0; i < L.maxSize; ++i) {
        printf("%d:%d ",i, L.data[i]);
    }
    printf("\n%d", L.length);

    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值