ESP-IDF:在C++环境下实现动态数组例程,包括初始化,添加数值,查找,删除,打印等功能

本文展示了C++中使用结构体DYNAMICARRAY管理动态数组的方法,包括初始化、向数组尾部添加元素(push_back)、按值查找元素、按值和位置删除元素以及释放内存的操作。测试案例演示了动态数组在插入、查找和删除过程中的工作流程。

代码:

/* 动态数组 */
struct DYNAMICARRAY
{
int *pAddress;
int size;
int capacity;
};

DYNAMICARRAY *initialDynamicArray()
{
DYNAMICARRAY *p = (DYNAMICARRAY *)malloc(sizeof(DYNAMICARRAY));
p->size = 0;
p->capacity = 5;
p->pAddress = (int *)malloc(sizeof(int) * p->capacity);
return p;
}

void push_back(DYNAMICARRAY *p, int b)
{
if (p == NULL)
{
return;
}
if (p->size == p->capacity)
{
int *newArray = (int *)malloc(sizeof(int) * p->capacity * 2);
for (int i = 0; i < p->size; i++)
{
newArray[i] = p->pAddress[i];
}
free(p->pAddress);
p->capacity = p->capacity * 2;
p->pAddress = newArray;
}

p->pAddress[p->size] = b;
p->size++;

}

void print_arrary(DYNAMICARRAY *p)
{
if (p == NULL)
{
return;
}
for (int i = 0; i < p->size; i++)
{
cout << p->pAddress[i] << endl;
}
cout << “mArray size=” << p->size << endl;
cout << “mArray capcitory” << p->capacity << endl
<< endl;
}

void free_mArray(DYNAMICARRAY *p)
{
if (p == NULL)
{
return;
}
free(p->pAddress);
free§;
p = NULL;
}

int find_mArray_by_value(DYNAMICARRAY *p, int b)
{
if (p == NULL)
{
return -1;
}
int pos = -1;
for (int i = 0; i <= p->size; i++)
{
if (b == p->pAddress[i])
{
pos = i;
// cout << “in find_mArray_by_value”
// << “i=” << i << " pos=" << pos << endl;
break;
}
if (i == p->size)
{
cout << “can’t find_mArray_by_value” << endl
<< endl;
break;
}
}
return pos;
}

void remove_by_value_in_array(DYNAMICARRAY *p, int b)
{
if (p == NULL)
{
return;
}
int pos = find_mArray_by_value(p, b);
for (int i = pos; i <= p->size; i++)
{
if (i == p->capacity)
{
p->pAddress = NULL;
p->size -= 1;
break;
}
p->pAddress[i] = p->pAddress[i + 1];
}
p->size -= 1;
}

void remove_by_position_in_array(DYNAMICARRAY *p, int b)
{
if (p == NULL)
{
return;
}
int pos = b;
for (int i = pos; i <= p->size; i++)
{
if (i == p->capacity)
{
p->pAddress = NULL;
p->size -= 1;
break;
}
p->pAddress[i] = p->pAddress[i + 1];
}
p->size -= 1;
}

void test07()
{
DYNAMICARRAY *mArry = initialDynamicArray();
cout << “--------print mArray before any change--------” << endl;
print_arrary(mArry);
for (int i = 0; i < 15; i++)
{
push_back(mArry, i);
}
cout << “--------print mArray after insert 0~15 --------” << endl;
print_arrary(mArry);

cout << "--------查找数值8,在动态数组中的位置 --------" << endl;
int val = 8;
int pos = 0;
pos = find_mArray_by_value(mArry, val);
cout << "value:" << val << " at pos " << pos << endl
     << endl;

cout << "--------删除数值9--------" << endl;
remove_by_value_in_array(mArry, 9);
print_arrary(mArry);

cout << "--------删除位置0上的数值--------" << endl;
remove_by_position_in_array(mArry, 0);
print_arrary(mArry);

free_mArray(mArry);

}

extern “C” void app_main(void)
{
test07();
}

结果:

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值