数组-数据结构[C语言]用代码实现模拟数组

  1. 数组、结构体等聚合类型的定义和初始化是一起的

·聚合类型是一种复合数据类型,用于将多个数据项组合成一个整体。它通常用于表示数组、结构体、类等复合数据结构,以便于处理和管理。

  1. 函数的参数传递有值传递和地址传递两种,值传递无法改变实参的值,地址传递可以改变实参的值

线性结构:可以看作是用一根线把所有的节点串起来的结构

·连续存储[数组]

·离散存储[链表]

而栈和队列是对线性结构的两种常用的应用

数组的概念:

数组是由类型相同、大小相等的数据元素构成的有限序列,每个元素都有一个唯一的位置标识,且整个序列的大小是固定的。

下代码把数组模拟出来:

#include<stdio.h>

#include<malloc.h>

#include <stdlib.h>//exit()要用到这个头文件

struct Arr {

int* pBase;//存储的是数组第一个元素的地址

int len;//数组所能容纳的最大元素的个数/数组的长度

int cnt;//当前数组有效元素的个数

};

void initArr(struct Arr* pArr,int length);//初始化

bool appendArr(struct Arr* pArr, int val);//末尾添加

bool insertArr(struct Arr* pArr, int val,int pos);//插入元素---这里的pos指的是在数组中的下标的位置

bool deleteArr(struct Arr* pArr, int pos,int* val);//删除元素---int*用于接收删除的那个节点的值

int get(struct Arr arr,int pos);//获取元素

bool isEmpty(struct Arr arr);//判空

bool isFull(struct Arr arr);//判满

void showArr(struct Arr arr);//输出数组

void inversionArr(struct Arr* pArr);//逆置数组

int main() {

struct Arr arr;

int val;

initArr(&arr, 6);

appendArr(&arr, 0);

appendArr(&arr, 1);

appendArr(&arr, 2);

appendArr(&arr, 3);

inversionArr(&arr);

showArr(arr);

return 0;

}

void initArr(struct Arr* pArr, int length) {

pArr->pBase = (int*)malloc(sizeof(int) * length);

if (pArr->pBase == NULL) {

printf("动态内存分配失败\n");

exit(-1);//终止整个程序

}

else {

pArr->len = length;

pArr->cnt = 0;

}

}

void showArr(struct Arr arr) {

if (isEmpty(arr)) {

printf("数组为空\n");

}

else {

for (int i = 0; i < arr.cnt; i++) {

printf("%d\n", arr.pBase[i]);

}

}

}

bool isEmpty(struct Arr arr) {

if (arr.cnt == 0) {

return true;

}

else {

return false;

}

}

bool isFull(struct Arr arr) {

if (arr.cnt == arr.len) {

return true;

}

else {

return false;

}

}

bool appendArr(struct Arr* pArr, int val) {

if (isFull(*pArr)) {

printf("数组已满\n");

return false;

}

else {

pArr->pBase[pArr->cnt] = val;

pArr->cnt++;

return true;

}

}

bool insertArr(struct Arr* pArr, int val, int pos) {

if (isFull(*pArr)) {

printf("数组已满\n");

return false;

}

if (pos < 0 || pos > pArr->cnt) {

printf("插入位置错误\n");

return false;

}

for (int i = pArr->cnt; i > pos; i--) {

pArr->pBase[i] = pArr->pBase[i - 1];

}

pArr->pBase[pos] = val;

pArr->cnt++;

return true;

}

bool deleteArr(struct Arr* pArr, int pos, int* val) {

if (isEmpty(*pArr)) {

printf("数组为空,无法删除\n");

return false;

}

if(pos<0||pos>=pArr->cnt){

printf("删除位置错误\n");

return false;

}

*val = pArr->pBase[pos];

for (int i = pos; i < pArr->cnt-1; i++) {

pArr->pBase[i] = pArr->pBase[i + 1];

}

pArr->cnt--;

return true;

}

int get(struct Arr arr, int pos) {

if (isEmpty(arr)) {

printf("数组为空");

exit(-1);

}

return arr.pBase[pos];

}

void inversionArr(struct Arr* pArr) {

if (isEmpty(*pArr)) {

printf("数组为空,无法逆置");

}

else {

for (int i = 0; i < pArr->cnt / 2; i++) {

int t = pArr->pBase[i];

pArr->pBase[i] = pArr->pBase[pArr->cnt - 1 - i];

pArr->pBase[pArr->cnt - 1 - i] = t;

}

}

}

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

01红C

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值