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)

相关推荐
月夜的风吹雨4 小时前
【数据结构】:C 语言常见排序算法的实现与特性解析
c语言·数据结构·排序算法
呵呵哒( ̄▽ ̄)"4 小时前
专项智能练习(科尔伯格道德发展阶段理论)
学习
Cx330❀4 小时前
《C++ 手搓list容器底层》:从结构原理深度解析到功能实现(附源码版)
开发语言·数据结构·c++·经验分享·算法·list
仰泳的熊猫4 小时前
LeetCode:98. 验证二叉搜索树
数据结构·c++·算法·leetcode
武文斌774 小时前
项目学习总结:CAN总线、摄像头、STM32概述
linux·arm开发·stm32·单片机·嵌入式硬件·学习·c#
SPFFC189380330534 小时前
AI玩具排线专业生产与全球营销策略
人工智能·学习·智能手机·显示器·智能手表·平板·游戏机
。TAT。4 小时前
C++ - vector
开发语言·c++·学习
YJlio4 小时前
Process Monitor 学习笔记(5.7):长时间运行追踪与日志文件体积的控制
java·笔记·学习
杨福瑞4 小时前
C语言数据结构:算法复杂度(1)
c语言·开发语言·数据结构