C语言入门:数组的常见操作算法
一、常规操作
1.添加元素
1)按位置区分:头添加、尾添加、指定下标输入
// 添加单个元素
//尾添加
void add(int e, int arr[], int s) {arr[s] = e;
}//指定位置添加
void addByI(int index, int arr[], int s, int sta) {if (index < 0 || index >= s) {printf("输入的下标不在合理范围内\n");return;}if (sta == NULL) {printf("请输入元素\n");return;}for (int i = s; i > index; i--) {arr[i] = arr[i - 1];}arr[index] = sta;
}
2)按数量区分:添加单个、添加另一个数组/数据结构中的所有元素
2.查找元素
1)根据下标查找:返回元素
// 根据下标查找元素
//函数结构: 返回值类型 函数名 参数列表 : 不要相信参数 一定要验证处理
int get(int index, int arr[], int s) {if (index < 0 || index >= s) {printf("索引的位置不合法");return NULL;}return arr[index];
}
2)根据区间下标查找
3)根据元素查找:返回下标
// 根据元素查找下标
int indexOf(int e, int arr[], int s) {for (int i = 0; i < s; i++) {if (arr[i] == e) {return i;}}return -1;
}
3.删除元素
1)根据下标删除、根据区间下标删除、根据集合删除
// 删除
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;
}
2)根据元素删除、删除多个
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;
}
4.替换元素
1)根据下标替换
//修改某个位置的元素
int change(int e, int arr[], int s, int sta) {if (e < 0 || e >= s) {printf("输入的下标不在合理范围内\n");return 0;}if (sta == NULL) {printf("请输入元素\n");}arr[e] = sta;
}
2)根据元素替换、多个替换
//修改指定元素
int changeB(int e, int arr[], int s, int sta) {for (int i = 0; i < s; i++) {if (arr[i] == e) {arr[i] == sta;}}return 0;
}
5.整体实现
#include <stdio.h>
#include <stdlib.h>
// 使用常规数组实现
#define len 100// 添加单个元素
void add(int e, int arr[], int s) {arr[s] = e;
}void addByI(int index, int arr[], int s, int sta) {if (index < 0 || index >= s) {printf("输入的下标不在合理范围内\n");return;}if (sta == NULL) {printf("请输入元素\n");return;}for (int i = s; i > index; i--) {arr[i] = arr[i - 1];}arr[index] = sta;
}// 删除
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;
}//修改某个位置的元素
int change(int e, int arr[], int s, int sta) {if (e < 0 || e >= s) {printf("输入的下标不在合理范围内\n");return 0;}if (sta == NULL) {printf("请输入元素\n");}arr[e] = sta;
}//修改指定元素
int changeB(int e, int arr[], int s, int sta) {for (int i = 0; i < s; i++) {if (arr[i] == e) {arr[i] == sta;}}return 0;
}int main() {char str[50] = "(2*5)+1.2+3.4*3"; // 解析字符串的题
//将这个算式 计算出结果
// 通过 + 号 区分裁切出两个字符串
// 将前后两个字符串 转为 数字类型变量
// 根据运算符判断 是什么运算int arr[len] = {1, 2, 3, 4, 5, 6, 1, 1, 1, 2, 3, 4, 5, 6, 1, 1, 1, 2, 1};int size = 19;while (1) {printf("添加单个元素到末尾->101\n");printf("添加单个元素到指定位置->102\n");printf("根据下标删除单个元素->201\n");printf("根据元素删除->202\n");printf("根据下标查找单个元素->301\n");printf("根据元素查找下标->302\n");printf("修改指定位置元素->401\n");printf("批量修改指定元素->402\n");printf("输入999结束程序\n");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 == 102) {int index = 0;int sta = NULL;printf("请输入一个要添加的元素:\n");scanf("%d", &sta);printf("请输入一个下标:\n");scanf("%d", &index);addByI(index, arr, size, sta);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 indx = indexOf(e, arr, size);if (indx >= 0) {printf("元素存在,当前位置是:%d\n", indx);} else {printf("元素不存在\n");}} else if (id == 401) {int sta = NULL;int e = 0;printf("请输入需要修改的元素的下标:\n");scanf("%d", &e);printf("请输入要修改为的元素:\n");scanf("%d", &sta);change(e, arr, size, sta);} else if (id == 402) {int e = 0;int sta = 0;printf("请输入需要修改的元素:\n");scanf("%d", &e);printf("请输入要修改为的元素:\n");change(e, arr, size, sta);scanf("%d", &sta);} else if (id == 999) {exit(999);} else {printf("输入不合法,请输入正确的编号~\n");}printf("现有的元素:");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");}
}
二、排序算法:冒泡、选择、快速排序
暂略,写法可参考我之前发的Java数组专题里的描述(有时间会补)