数据结构之数组及其操作(C语言版)

来源:互联网 发布:淘宝苏宁易购投诉 编辑:程序博客网 时间:2024/06/05 12:02

一.数组结构体定义

#define ARRAY_SIZE 50  typedef struct {     int data[ARRAY_SIZE];     int len; }MyArray;
其中,

ARRAY_SIZE表示数组的最大长度

len表示数组的当前长度,其实也可以表示为数组最后一个元素的下标(last),没有多大区别,凭个人喜好。

二. 初始化操作

void ArrayInit(MyArray *arr){    int i;    for (i = 0; i < ARRAY_SIZE; ++i)    {        arr->data[i] = 0;    }    arr->len = 0;}
初始化有两个步骤,一是将数组中所有元素初始化为0,因为在C语言中定义一个数组时不是将所有元素初始化为0,而是保留原先存储空间中的值,所以要进行初始化;

二是将数组长度置为0(定义为末尾元素下标时可置为-1,表示没有元素)。

三. 在数组末尾追加元素

int ArrayAppend(MyArray *arr, int var){    if(arr->len == ARRAY_SIZE)    {        //数组已满,无法添加元素        return -1;    }    arr->data[arr->len++] = var;    return 0;}

往数组中添加元素时,需要检查数组是否已满,只有没满的时候才可以插入元素,插入元素后长度+1。

四. 在指定位置插入元素

int ArrayInsert(MyArray *arr, int var, int index){    if(arr->len >= ARRAY_SIZE)    {        //数组已满,无法插入元素        return -1;    }    if (index < 0 && index >= ARRAY_SIZE)    {        //指定的位置超出数组下标范围        return -1;    }    if (index >= arr->len)    {        arr->data[index] = var;        arr->len = index + 1;    }    else    {        int i;        for (i = arr->len - 1; i >= index; i--)        {            arr->data[i + 1] = arr->data[i];        }        arr->data[index] = var;        arr->len++;    }    return 0;}

指定的位置有两种合法的情况,一是在大于现有数组长度len与最大长度之间,此时插入的位置没有有效数据,可以直接插入,插入后数组长度变为指定插入位置+1;

二是在现有数组长度以内,此时需要将指定位置之后的元素都往后挪,空出位置来让新元素插入。

五.查找元素

int ArraySearch(MyArray arr, int var){    int i;    if (arr.len == 0)    {        //数组为空,无法查找        return -1;    }    for(i = 0; i < arr.len; i++)    {        if (var == arr.data[i])        {            break;        }    }    if (i >= arr.len)    {        //遍历完了整个数组,没有找到指定元素        return -1;    }    return i;//返回查找元素所在的下标}

六. 获取指定下标的元素

int ArrayGetData(MyArray arr, int index){    if (index < 0 || index >= arr.len)    {        //指定下标超出范围        return -1;    }    return arr.data[index];}

七. 删除指定位置的元素

int ArrayDelete(MyArray *arr, int index){    int i;    if (index < 0 || index >= arr->len)    {        //指定位置超出范围        return -1;    }    for (i = index; i < arr->len - 1; ++i)    {        arr->data[i] = arr->data[i + 1];    }    arr->len--;    return 0;}

八. 打印数组

void ArrayDisplay(MyArray arr){    int i;    if(arr.len == 0)    {        //数组为空        return;    }    printf("[ ");    for(i = 0; i < arr.len; i++)    {        printf("%d ", arr.data[i]);    }    printf("]\n");    printf("当前数组长度 = %d\n", arr.len);}

九. 示例

int main(){    MyArray arr;    ArrayInit(&arr);    ArrayAppend(&arr, 2);    ArrayAppend(&arr, 8);    ArrayAppend(&arr, 5);    ArrayAppend(&arr, 2);    ArrayInsert(&arr, 6, 1);    ArrayInsert(&arr, 7, 1);    ArrayInsert(&arr, 4, 1);    ArrayInsert(&arr, 14, 1);    ArrayDisplay(arr);    ArrayDelete(&arr, 3);    ArrayDisplay(arr);    printf("搜索指定数据的位置 = %d\n", ArraySearch(arr, 5));    printf("获取指定位置的数据 = %d\n", ArrayGetData(arr, 2));    return 0;}

输出结果如下:

[ 2 14 4 7 6 8 5 2 ]当前数组长度 = 8[ 2 14 4 6 8 5 2 ]当前数组长度 = 7搜索指定数据的位置 = 5获取指定位置的数据 = 4



原创粉丝点击