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)