C++实现一维数组

在这里插入图片描述

#include <stdio.h>
#include <malloc.h>

typedef struct SArr
{
    //数组第一个元素的地址
    int *pBase;
    //数组能存放的最大元素个数
    int length;
    //有效元素的个数
    int cnt;
} Arr;

//初始化数组
void init_arr(Arr *, int);
//数组末尾追加元素
bool append(Arr *, int);
//判读数组是否为空
bool is_empty(Arr *);
//判断数组是否已满
bool is_full(Arr *);
//添加元素
bool insert(Arr *, int, int);
//删除元素
bool deleteEle(Arr *, int, int *);
//数组反转
void reserve(Arr *);
//显示数组
void show_arr(Arr *);

int main()
{
    Arr arr;
    init_arr(&arr, 5);
    append(&arr, 0);
    append(&arr, 2);
    insert(&arr, 7, 1);
    insert(&arr, 1, 2);
    insert(&arr, 2, 3);
    insert(&arr, 2, 4);
    insert(&arr, 3, 5);
    show_arr(&arr);
    int val;
    deleteEle(&arr, 2, &val);
    printf("你要删除的元素是%d\n", val);
    show_arr(&arr);
    reserve(&arr);
    printf("反转后的数组为:");
    show_arr(&arr);
    return 0;
}

void init_arr(Arr *arr, int length)
{
    //初始化数组的大小
    arr->pBase = (int *)malloc(sizeof(int) * length);
    if (NULL == arr->pBase)
    {
        printf("初始化数组失败\n");
    }
    else
    {
        //初始化数组中存的元素个数为0
        arr->cnt = 0;
        //初始化数组的长度
        arr->length = length;
    }
}

bool append(Arr *arr, int ele)
{
    if (is_full(arr))
    {
        return false;
    }
    arr->pBase[arr->cnt] = ele;
    arr->cnt++;
    return true;
}

// index  插入元素位置的下标
bool insert(Arr *pArr, int index, int ele)
{
    if (is_full(pArr))
    {
        return false;
    }
    //检查插入位置是否合法 索引不能为负数   不得跳跃式插入 比如数组中只有两个元素 不得插入到第四个位置
    if (index < 0 || index > pArr->cnt)
    {
        printf("插入位置不合法!\n");
        return false;
    }
    for (int i = pArr->cnt - 1; i >= index; i--)
    {
        pArr->pBase[i + 1] = pArr->pBase[i];
    }
    pArr->pBase[index] = ele;
    pArr->cnt++;
}

bool is_empty(Arr *arr)
{
    if (arr->cnt != 0)
    {
        return false;
    }
    else
    {
        return true;
    }
}

bool is_full(Arr *arr)
{
    if (arr->cnt != arr->length)
    {
        return false;
    }
    else
    {
        return true;
    }
}

void show_arr(Arr *arr)
{
    if (is_empty(arr))
    {
        printf("当前数组为空\n");
    }
    printf("数组中的元素==>");
    for (int i = 0; i < arr->cnt; i++)
    {
        printf("%d\t", arr->pBase[i]);
    }
    printf("\n");
}

bool deleteEle(Arr *pArr, int index, int *pVal)
{
    //检查索引的合法性
    if (index < 0 || index > pArr->cnt - 1)
    {
        return false;
    }

    *pVal = pArr->pBase[index];
    for (int i = index; i <= pArr->cnt - 1; i++)
    {
        pArr->pBase[i] = pArr->pBase[i + 1];
    }
    pArr->cnt--;
    return true;
}

void reserve(Arr *pArr)
{
    int i = 0;
    int j = pArr->cnt - 1;
    int temp;
    while (i < j)
    {
        temp = pArr->pBase[i];
        pArr->pBase[i] = pArr->pBase[j];
        pArr->pBase[j] = temp;
        i++;
        j--;
    }
}

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:博客之星2021 设计师:Hiro_C 返回首页
评论 11

打赏作者

鑫宇_

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值