C语言初步学习:数组的增删查改

引言

本项目实现了基于静态数组的动态数组操作功能,包括增删查改等基本操作。

核心功能实现

1. 添加元素 (`add`)

void add(int e, int arr[], int s) {

arr[s] = e;

}

  • **作用**: 直接在数组末尾添加新元素

  • **设计原因**: 利用 [size] 参数作为索引,将新元素放置在当前有效元素之后,实现高效的尾部插入操作

2. 删除元素

按下标删除 (`remove`)

int remove(int index, int arr[], int s) {

if (index < 0 || index >= s) {

printf("输入的下标不在合理范围内\n");

return 0;

}

int o = arr[index];

for (int i = index; i < s - 1; i++) {

arr[i] = arr[i + 1];

}

arr[s - 1] = 0;

return o;

}

  • **作用**: 根据指定下标删除元素,并将后续元素前移填补空位

  • **设计原因**:

  • 先进行边界检查确保索引有效性

  • 保存待删除元素用于返回

  • 通过循环将目标位置后的所有元素向前移动一位

  • 将最后一个位置赋值零以清除无效数据

按值删除 (`removeBye`)

int removeBye(int e, int arr[], int s) {

int index = 0;

for (int i = 0; i < s; i++) {

int n = arr[i];

if (n != e) {

arr[i - index] = arr[i];

} else {

index++;

}

}

return index;

}

  • **作用**: 删除数组中所有等于指定值的元素

  • **设计原因**:

  • 使用 `index` 变量记录已遇到的待删除元素个数

  • 采用双指针思想,将保留的元素移动到正确位置

  • 返回删除的元素总数,供外部更新 `size` 变量

3. 查找元素

按下标查找 (`get`)

int get(int index, int arr[], int s) {

if (index < 0 || index >= s) {

printf("索引位置不合法");

return NULL;

}

return arr[index];

}

  • **作用**: 根据下标获取对应元素值

  • **设计原因**:

  • 提供安全的元素访问机制,先检查索引是否在有效范围内

  • 若索引非法则输出错误提示并返回 NULL(注意此处存在类型不匹配问题)

按值查找 (`indexOf`)

int indexOf(int e, int arr[], int s) {

for (int i = 0; i < s; i++) {

if (arr[i] == e) {

return i;

}

}

return -1;

}

  • **作用**: 查找指定元素在数组中的首次出现位置

  • **设计原因**:

  • 线性遍历数组寻找匹配元素

  • 找到则返回对应下标,未找到返回 -1 表示不存在

4. 插入元素 ([insert]

void insert(int index, int arr[], int s, int e) {

if (index < 0 || index > s) {

printf("插入位置不合法\n");

return ;

}

for (int i = s; i > index; i--) {

arr[i] = arr[i - 1];

}

arr[index] = e;

}

  • **作用**: 在指定位置插入新元素,原有元素向后移动

  • **设计原因**:

  • 允许在数组末尾插入(index == s),所以边界检查使用 `index > s`

  • 从后往前移动元素避免覆盖

  • 在指定位置放置新元素

完整代码如下:

#include <stdio.h>

#include <stdlib.h>

//使用常规数组实现

#define len 100

//添加单个元素

void add(int e, int arr[], int s) {

arr[s] = e;

}

//删除(根据下标)

int remove(int index, int arr[], int s) {

if (index < 0 || index >= s) {

printf("输入的下标不在合理范围内\n");

return 0;

}

int o = arr[index];

for (int i = index; i < s - 1; i++) {

arr[i] = arr[i + 1];

}

arr[s - 1] = 0;

return o;

}

//删除(根据元素)

int removeBye(int e, int arr[], int s) {

int index = 0;

for (int i = 0; i < s; i++) {

int n = arr[i];

if (n != e) {

arr[i - index] = arr[i];

} else {

index++;

}

}

return index;

}

//根据下标查找元素

int get(int index, int arr[], int s) {

if (index < 0 || index >= s) {

printf("索引位置不合法");

return NULL;

}

return arr[index];

}

//根据元素查找下标

int indexOf(int e, int arr[], int s) {

for (int i = 0; i < s; i++) {

if (arr[i] == e) {

return i;

}

}

return -1;

}

//插入元素

void insert(int index, int arr[], int s, int e) {

if (index < 0 || index > s) {

printf("插入位置不合法\n");

return ;

}

for (int i = s; i > index; i--) {

arr[i] = arr[i - 1];

}

arr[index] = e;

}

int main() {

int arr[len] = {0};

int size = 0;

while (1) {

printf("添加单个元素->101\n");

printf("根据下标删除单个元素->201\n");

printf("根据元素删除->202\n");

printf("根据下标查找单个元素->301\n");

printf("根据元素查找下标->302\n");

printf("根据下表插入元素->401\n");

printf("结束程序->999");

printf("请输入功能编号:\n");

int id = 0;

scanf("%d", &id);

if (id == 101) {

int num = 0;

printf("请输入一个整数:\n");

scanf("%d", &num);

add(num, arr, size);

size++;

} else if (id == 201) {

int index = 0;

printf("请输入一个下标:\n");

scanf("%d", &index);

int o = remove(index, arr, size);

printf("被删除的元素是:%d", o);

size--;

} else if (id == 202) {

int e = 0;

printf("请输入一个需要被删除的元素:\n");

scanf("%d", &e);

int index = removeBye(e, arr, size);

size -= index;

} else if (id == 301) {

int index = 0;

printf("请输入一个下标:\n");

scanf("%d", &index);

int e = get(index, arr, size);

if (e != NULL) {

printf("查找到的元素是:%d\n", e);

}

} else if (id == 302) {

int e = 0;

printf("请输入一个需要查找下标的数:\n");

scanf("%d", &e);

int index = indexOf(e, arr, size);

if (index >= 0) {

printf("元素存在,当前位置是:%d\n", index);

} else {

printf("元素不存在\n");

}

} else if (id == 401) {

int index = 0;

int e = 0;

printf("请输入插入元素的坐标:\n");

scanf("%d", &index);

printf("请输入插入的元素:\n");

scanf("%d", &e);

insert(index, arr, size, e);

size++;

} else if (id == 999) {

exit(999);

} else {

printf("输入不合法,请输入正确的编号~\n");

}

printf("现有的元素: \n");

for (int i = 0; i < size; i++) {

printf("%d ", arr[i]);

}

printf("\n");

}

}

## 使用说明

程序提供交互式菜单,支持以下操作:

  1. 添加元素 (101)

  2. 按下标删除 (201)

  3. 按值删除 (202)

  4. 按下标查找 (301)

  5. 按值查找 (302)

  6. 插入元素 (401)

  7. 退出程序 (999)

相关推荐
梵刹古音5 分钟前
【C语言】 指针与数据结构操作
c语言·数据结构·算法
AI视觉网奇28 分钟前
3d数字人 ue blender 绑定衣服对齐 2026
学习·ue5
Nan_Shu_61433 分钟前
学习: Blender 基础篇
学习·blender
刘琦沛在进步1 小时前
【C / C++】引用和函数重载的介绍
c语言·开发语言·c++
奶茶精Gaaa1 小时前
工具分享--json在线转换工具
学习
爱敲代码的TOM2 小时前
数据结构总结
数据结构
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [drivers][I2C]I2C
linux·笔记·学习
VekiSon2 小时前
Linux内核驱动——杂项设备驱动与内核模块编译
linux·c语言·arm开发·嵌入式硬件
盐焗西兰花2 小时前
鸿蒙学习实战之路-Reader Kit自定义字体最佳实践
学习·华为·harmonyos
2的n次方_2 小时前
CANN Ascend C 编程语言深度解析:异构并行架构、显式存储层级与指令级精细化控制机制
c语言·开发语言·架构