C++实现一维数组

news/2024/5/20 6:11:51 标签: 算法, 数据结构, 顺序表, 一维数组, 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--;
    }
}

http://www.niftyadmin.cn/n/1569872.html

相关文章

rabbitmq 集群消费_RabbitMQ集群管理方案

RabbitMQ集群方案的原理RabbitMQ这款消息队列中间件产品本身是基于Erlang编写&#xff0c;Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的magic cookie来实现)。因此&#xff0c;RabbitMQ天然支持Clustering。这使得RabbitMQ本身不需要像ActiveMQ、Kafka那样通过Zoo…

解决前端设计window高分屏缩放导致截图工具量出来的尺寸和实际设计尺寸不一致的问题

在前端学习过程中,我们可能经常"借鉴"一些其他网站的设计,但是坑爹的window对高分屏的适配一直不太完美,为了更好的显示效果我们必须设置缩放 但是这样一来的话,我们在网站页面用测量工具测量的结果就会变得不准确,是放大后的数值 测量结果: 一个100像素的块正好变…

一台电脑两种jdk_一台电脑上如何配置多个版本JDK,并进行自由切换

针对单个JDK的安装非常简单&#xff0c;网上资料很多&#xff0c;在这里就不作讲述。接下来讲一下多版本的切换&#xff0c;以jdk从1.7切换到1.6为例&#xff0c;操作步骤如下&#xff1a;1.修改注册表&#xff1a;HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Runtime Environm…

指针到底是个什么玩意

本文是郝斌老师《C语言自学教程》指针部分的总结,强烈推荐大家去看原教程 第一个指针程序(入门) #include <stdio.h>int main() {int *p; int i3;p&i; //&为取地址符 return 0; } 针对上述程序: 1.如何理解 int*p? int*p 不表示定义了一个名字叫做*p的变量.…

结构体是个什么玩意

结构体 1.为什么需要结构体? 为了表示一些复杂的事物,而普通的基本数据类型无法满足要求. 2.什么是结构体? 把一些基本的数据类型组合在一起,形成一个新的复合数据类型,就叫做结构体. 3.如何定义一个结构体? 第一种方式 struct Student {int age;float score;char se…

feign 整合sentinel_[Spring-Cloud-Alibaba] Sentinel 整合RestTemplate Feign

Sentinel APIGithub : WIKISphu (指明要保护的资源名称)Tracer (指明调用来源,异常统计接口)ContextUtil(标示进入调用链入口)流控规则(针对来源属性) GetMapping("/test-sentinel-api")public String testSentinelAPI(RequestParam(required false) String a) {Str…

linux系统rc路由配置_Linux下路由配置梳理

在日常运维作业中&#xff0c;经常会碰到路由表的操作。下面就linux运维中的路由操作做一梳理&#xff1a;------------------------------------------------------------------------------先说一些关于路由的基础知识&#xff1a;1)路由概念路由&#xff1a; 跨越从源主机…

什么叫诚实_一个诚实的人有哪些体现,诚实的根本是什么?

一个同事在工作上发现了一个问题&#xff0c;无意间写了一个bug&#xff0c;但又不想让他人知道&#xff0c;想偷偷摸摸地改掉&#xff0c;可又没有上线权限。终于线上出问题了&#xff0c;找到他&#xff0c;他却说问题不在他这里&#xff0c;声称自己完全是按照需求做的。查代…