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)

相关推荐
晓梦林11 小时前
stitch靶场学习笔记
笔记·学习
z2005093011 小时前
【linux学习】linux的一些奇怪知识,方便日常使用
学习
番茄灭世神11 小时前
PN学堂GD32教程第21篇——WiFiIOT
c语言·stm32·单片机·嵌入式·gd32
小羊在睡觉11 小时前
力扣239. 滑动窗口最大值
数据结构·后端·算法·leetcode·go
我还记得那天11 小时前
C语言递归实现汉诺塔问题
c语言·开发语言
魔法阵维护师11 小时前
从零开发游戏需要学习的c#模块,第十三章(rpg小游戏入门,下篇,地图敌人与战斗触发)
学习·游戏·c#
. . . . .11 小时前
业务知识学习
学习
我星期八休息11 小时前
Linux系统编程—库制作与原理
linux·运维·服务器·数据结构·人工智能·python·散列表
_Evan_Yao11 小时前
如何搭建属于自己的技术博客(CSDN / GitHub Pages)
后端·学习·github
炽烈小老头11 小时前
【每天学习一点算法 2026/05/21】课程表
学习·算法