c 语言数组基本操作(查找,修改,删除,插入)

写在前面:

自己写了一遍,不够精简,又借鉴了别人的例子,最后得出这个版本。
恐怕既不是最简单的,也不是最精妙的,但是我目前能实现的比较清晰简洁的一版。
还是先把‘‘见怪不怪’’给大牛写在前面。。。

好了开始吧~

第一个查找:

这个没什么好说的
就按值查找并返回下标
就看吧~

int ArrayFindByValue(int* p, int len, int value, int begin)
{
 if (begin <= 0)
 {
  begin = 0;    //最少也是从第0个开始找
 }
 while (begin < len)
 {
  if (p[begin] == value)
  {
   return begin;  //找到则返回下标
  }
  ++begin;
 }
 return -1;     //找不到则返回-1
}

第二个修改:

emmm…
因为建立在查找函数的基础上所以简洁了好多
也是按值操作的,一次性修改所有满足条件元素

void ArrayModifyByValue(int* p, int len, int oldvalue, int newvalue)
{
 int index = 0;
 while ((index = ArrayFindByValue(p, len, oldvalue, index))!=-1)
 {//只要查找的值不是-1,就把对应下标值赋给index
  p[index] = newvalue;
  ++index;   //下一次从index的下一个开始找
 }
}

第三个删除:

删除要考虑到数组长度变短的问题,所以还要有个指针去“戳”长度变量
╮(╯▽╰)╭ ~~
为了尽量降低时间复杂度,我用的是这个两个(ji)下(you)标版
j 是每次都要自加的,但 i 只有在 j 没遇到value时自加
每次把 j 对应的值赋给 i
这样就跳过了所以等于目标值value的元素
最后再让数组长度等于 i

void ArrayDeleteByValue(int* p, int* len, int value)
{
 int i, j;      //i,j看作两个下标
 for (i = 0, j = 0; j < *len; ++j)
 {        
  if (p[j] != value)   //跳过所有应删元素
  {
   p[i] = p[j];
   i++;     //i一共加了(len-应删元素个数)次
  }
 }
 *len = i;      //此时下标i就是新的数组长度
}

第四个插入:

插入也要考虑到数组长度变短的问题,所以也要有个指针去“戳”长度变量
1.
先上个我写的版本,就是后缀simple这个…
其实也不错,对吧。
好吧,说实在的,这是一个比较差的版本
一次只能插入一个元素,也就是说要插入n个数的话 …
时间复杂度这匹野马就脱了缰绳了 …╮(╯▽╰)╭
还有就是前面俩 if 对插入位置index做了控制

void ArrayInsertByIndex_simple (int* p, int* len, int index, int value)
{
 if (index <= 0)
 {
  index = 0;       //index小于0默认加到第0个前面
 }
 if (index >= *len)
 {
  p[*len] = value;     //index大于等于数组长度默认放到最后
  (*len)++;
  return;
 }
 for (int i = 0; i <= *len - index - 1; ++i)
 {
  p[*len - i] = p[*len - i - 1];  //将index后面元素依次后移一位
 }
 (*len)++;        //数组长度+1
 p[index] = value;
}

2.
下面这个是借鉴别人之后,(ban)(chao)(ban)(xie)修改出的版本
不管插入几个,只遍历一遍数组,爽吧~
这里以隔十个元素插入为例
因为有插入操作前面的计数操作,所以连对index的控制也省了…
(不知道注释写的清不清楚)

void ArrayInsertByIndex(int* p, int* len, int index, int value)
{
 int count = 0;
 for (int i = 0; i < *len; ++i)
 {
  if (i%10 == index)
  {
   count++;   //计算要插入元素个数
  }
 }
 int oldindex, newindex;  //两个下标变量
 oldindex = *len - 1;  //old放到最后一个元素
 newindex = *len + count - 1;//new放到old后第count个
 while (oldindex >= 0)
 {
  p[newindex] = p[oldindex];//每次都把old赋给new
  if (oldindex%10 == index)
  {
   newindex--;   //如果找到对应位置让new靠近old一个下标
   p[newindex] = value;
  }
  oldindex--;    //每次两下标值-1
  newindex--;
 }
 *len += count;    //数组增加了count个元素
}

就这样吧,谢观!~

  • 9
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 好的,我会尽力回答您的问题。 以下是用C语言实现一个顺序表的基本操作: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 // 定义顺序表的最大容量 typedef struct { int data[MAX_SIZE]; // 顺序表的数据存储数组 int length; // 顺序表当前长度 } SeqList; // 初始化顺序表 void init(SeqList *list) { list->length = 0; } // 插入元素 int insert(SeqList *list, int index, int value) { if (index < 0 || index > list->length || list->length == MAX_SIZE) { return 0; // 插入位置无效或顺序表已满,插入失败 } // 将插入位置之后的元素依次后移 for (int i = list->length - 1; i >= index; i--) { list->data[i + 1] = list->data[i]; } // 在插入位置插入新元素 list->data[index] = value; list->length++; return 1; // 插入成功 } // 删除元素 int delete(SeqList *list, int index) { if (index < 0 || index >= list->length) { return 0; // 删除位置无效,删除失败 } // 将删除位置之后的元素依次前移 for (int i = index; i < list->length - 1; i++) { list->data[i] = list->data[i + 1]; } list->length--; return 1; // 删除成功 } // 修改元素 int update(SeqList *list, int index, int value) { if (index < 0 || index >= list->length) { return 0; // 修改位置无效,修改失败 } list->data[index] = value; return 1; // 修改成功 } // 查找元素 int search(SeqList *list, int value) { for (int i = 0; i < list->length; i++) { if (list->data[i] == value) { return i; // 找到元素,返回位置下标 } } return -1; // 没有找到元素,返回-1 } // 打印顺序表中的所有元素 void print(SeqList *list) { for (int i = 0; i < list->length; i++) { printf("%d ", list->data[i]); } printf("\n"); } int main() { SeqList list; init(&list); // 初始化顺序表 insert(&list, 0, 1); insert(&list, 1, 2); insert(&list, 2, 3); print(&list); // 输出:1 2 3 delete(&list, 1); print(&list); // 输出:1 3 update(&list, 1, 4); print(&list); // 输出:1 4 printf("%d\n", search(&list, 4)); // 输出:1 return 0; } ``` 以上就是用 ### 回答2: 顺序表是一种常用的数据结构,可以用数组来实现。以下是使用C语言实现顺序表的基本操作的示例代码: ```c #include <stdio.h> #define MAX_SIZE 100 // 定义顺序表结构体 typedef struct { int data[MAX_SIZE]; // 用数组存储数据元素 int length; // 当前顺序表的长度 } SeqList; // 初始化顺序表 void initSeqList(SeqList *list) { list->length = 0; } // 创建顺序表 void createSeqList(SeqList *list, int arr[], int n) { for (int i = 0; i < n; i++) { list->data[i] = arr[i]; } list->length = n; } // 在指定位置插入元素 void insertElement(SeqList *list, int position, int element) { if (position < 0 || position > list->length) { printf("插入位置超出范围\n"); return; } if (list->length >= MAX_SIZE) { printf("顺序表已满,无法插入\n"); return; } for (int i = list->length - 1; i >= position; i--) { list->data[i + 1] = list->data[i]; } list->data[position] = element; list->length++; } // 删除指定位置的元素 void deleteElement(SeqList *list, int position) { if (position < 0 || position >= list->length) { printf("删除位置超出范围\n"); return; } for (int i = position; i < list->length - 1; i++) { list->data[i] = list->data[i + 1]; } list->length--; } // 修改指定位置的元素 void modifyElement(SeqList *list, int position, int element) { if (position < 0 || position >= list->length) { printf("修改位置超出范围\n"); return; } list->data[position] = element; } // 查找元素的位置 int findElement(SeqList list, int element) { for (int i = 0; i < list.length; i++) { if (list.data[i] == element) { return i; } } return -1; } // 打印顺序表中的元素 void printSeqList(SeqList list) { for (int i = 0; i < list.length; i++) { printf("%d ", list.data[i]); } printf("\n"); } int main() { SeqList list; int arr[] = {2, 4, 6, 8, 10}; int n = sizeof(arr) / sizeof(arr[0]); // 初始化顺序表 initSeqList(&list); // 创建顺序表 createSeqList(&list, arr, n); // 打印顺序表 printf("创建的顺序表:"); printSeqList(list); // 在位置2插入元素12 insertElement(&list, 2, 12); printf("插入元素后的顺序表:"); printSeqList(list); // 删除位置3的元素 deleteElement(&list, 3); printf("删除元素后的顺序表:"); printSeqList(list); // 修改位置4的元素为15 modifyElement(&list, 4, 15); printf("修改元素后的顺序表:"); printSeqList(list); // 查找元素6的位置 int position = findElement(list, 6); if (position != -1) { printf("元素6的位置是:%d\n", position); } else { printf("元素6不存在\n"); } return 0; } ``` 以上代码实现了顺序表的创建、删除插入修改查找操作。运行程序后,会输出相应操作后的顺序表内容及结果。 ### 回答3: 顺序表(也称为动态数组)是一种使用连续的物理内存空间来存储数据的数据结构,可以动态地增加或减少元素。下面是一个用 C 语言实现的简单顺序表,包含创建、删除插入修改查找操作。 ```c #include <stdio.h> #include <stdlib.h> // 定义顺序表结构体 typedef struct { int* data; // 用于存储数据 int length; // 当前元素个数 int capacity; // 当前容量 } SeqList; // 初始化顺序表 void init(SeqList* list, int capacity) { list->data = (int*)malloc(capacity * sizeof(int)); list->length = 0; list->capacity = capacity; } // 在指定位置插入元素 void insert(SeqList* list, int index, int value) { // 判断是否超出容量 if (index < 0 || index > list->length || list->length == list->capacity) { printf("插入位置无效或表已满"); return; } // 将插入位置及之后的元素后移 for (int i = list->length - 1; i >= index; i--) { list->data[i + 1] = list->data[i]; } list->data[index] = value; list->length++; } // 删除指定位置的元素 void remove(SeqList* list, int index) { // 判断是否越界 if (index < 0 || index >= list->length) { printf("删除位置无效"); return; } // 将删除位置后的元素前移 for (int i = index; i < list->length - 1; i++) { list->data[i] = list->data[i + 1]; } list->length--; } // 修改指定位置的元素 void update(SeqList* list, int index, int value) { // 判断是否越界 if (index < 0 || index >= list->length) { printf("修改位置无效"); return; } list->data[index] = value; } // 在顺序表中查找指定元素,并返回其位置 int search(SeqList* list, int value) { for (int i = 0; i < list->length; i++) { if (list->data[i] == value) { return i; } } return -1; // 表示未找到 } // 打印顺序表中的元素 void print(SeqList* list) { for (int i = 0; i < list->length; i++) { printf("%d ", list->data[i]); } printf("\n"); } // 释放顺序表的内存 void destroy(SeqList* list) { free(list->data); list->data = NULL; list->length = 0; list->capacity = 0; } int main() { SeqList list; init(&list, 10); insert(&list, 0, 1); insert(&list, 1, 2); insert(&list, 2, 3); print(&list); // 输出:1 2 3 remove(&list, 1); print(&list); // 输出:1 3 update(&list, 0, 0); print(&list); // 输出:0 3 int index = search(&list, 3); printf("元素 3 的位置:%d\n", index); // 输出:元素 3 的位置:1 destroy(&list); return 0; } ``` 以上是一个简单的顺序表的实现,包含了创建、删除插入修改查找操作。这些操作可以根据实际需求进行调用,从而实现对顺序表的灵活操作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值