数据结构——顺序表_C语言

数据结构——顺序表

1、结构定义

  • size:顺序表空间大小;
  • length:当前顺序表长度;
  • *data:数据;

2、顺序表的操作

  • 初始化/创建顺序表;
  • 清除顺序表;
  • 插入数据;
  • 删除数据;
  • 扩容;

3、库

vector.h

#ifndef __VECTOR_H__
#define __VECTOR_H__

typedef struct Vector
{
    unsigned int size;        //顺序表大小
    unsigned int length;      //顺序表当前长度
    unsigned char *data;      //顺序表的内容
} Vector;


Vector *Vector_Init(int n);
void Vector_Clear(Vector *v);
char Vector_Expand(Vector *v);
char Vector_Insert(Vector *v, unsigned int dat, unsigned int index);
char Vector_Erase(Vector *v, unsigned int index);


#endif

vector.c

#include <stdio.h>
#include <stdlib.h>
#include <vector.h>

Vector *Vector_Init(int n)    //顺序表初始化
{
    Vector *v = (Vector *)malloc(sizeof(Vector));
    v->data = (unsigned char *)malloc(sizeof(unsigned char) * n);
    v->size = n;
    v->length = 0;

    return v;
}

void Vector_Clear(Vector *v)    //清除顺序表
{
    if(v == NULL)
    {
        return;
    }
    else
    {
        free(v->data);
        free(v);
        return;
    }
}

char Vector_Expand(Vector *v)    //顺序表扩容
{
    int extr_size = v->size;
    unsigned char *p;
    while (extr_size)
    {
        p = (unsigned char *)realloc(v->data, sizeof(unsigned char) * (v->size + extr_size));
        if(p) break;
        extr_size >>= 1;
    }
    if(extr_size == 0)
    {
        return 0;
    }
    v->data = p;
    v->size += extr_size;

    return 1;
}

char Vector_Insert(Vector *v, unsigned int dat, unsigned int index)    //顺序表插入
{
    if(v == NULL)
    {
        return -1;
    }
    if(index < 0 ||index > v->length)
    {
        return -2;
    }
    if(v->length == v->size)
    {
        if(!Vector_Expand(v)) return -3;
    //    printf("success to expand the vector size is %d\n", v->size);
    }
    for(unsigned int i = v->length; i > index; i--)
    {
        v->data[i] = v->data[i - 1];
    }
    v->data[index] = dat;
    v->length += 1;

    return 1;
}

char Vector_Erase(Vector *v, unsigned int index)    //顺序表元素删除
{
    if(v == NULL)
    {
        return -1;
    }
    if(index < 0 || index >= v->length)
    {
        return -2;
    }
    for(unsigned int i = index + 1; i < v->length; i++)
    {
        v->data[i - 1] = v->data[i];
    }
    v->length -= 1;

    return 1;
}

************************************************OVER************************************************

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值