用C来写,我有136次循环,136个数,每次循环里面进行一次删除操作,要保证每次删除的数都不一样,怎么操作
时间: 2024-09-19 12:16:20 浏览: 31
在C语言中,如果你有一个包含136个不同元素的数组,想要在每次循环中删除不同的元素并保持数组有序(假设数组是升序排列),你可以使用以下策略:
1. **使用栈**:
- 创建一个大小大于136的栈,用于存储待删除的元素。
- 从数组的第一个元素开始遍历。
- 对于每个元素,如果它比栈顶元素大,则将栈顶元素弹出并替换当前数组的位置,这样保证了每次删除的是比之前更大的数。
```c
#include <stdio.h>
#include <stdlib.h>
void delete_unique_sorted(int arr[], int n, int stack[], int top) {
for (int i = 0; i < n && top > 0; ++i) {
if (arr[i] > stack[top]) {
// 如果arr[i]更大,交换位置
int temp = arr[i];
arr[i] = stack[top];
stack[top] = temp;
--top;
}
}
}
int main() {
int arr[] = { /* 填充136个初始值 */ };
int n = sizeof(arr) / sizeof(arr[0]);
int stack[n * 2]; // 大于数组长度的栈
int top = 0;
// 初始化栈
for (int i = 0; i < n; ++i)
stack[top++] = arr[i];
delete_unique_sorted(arr, n, stack, top);
return 0;
}
```
2. **使用辅助数组**:
- 可以创建一个辅助数组来保存已经访问过的元素,避免重复删除。
```c
#include <stdbool.h>
bool visited[n]; // 假设n是数组长度
void delete_unique_sorted(int arr[], int n) {
for (int i = 0, j = 0; i < n; ++i) {
if (!visited[i]) {
// 如果元素未访问过,移动到新位置
while (j < n && arr[j] < arr[i])
visited[j++] = true;
memmove(&arr[j], &arr[j + 1], (n - j - 1) * sizeof(arr[0]));
visited[i] = true;
++j;
}
}
}
```
在这个示例中,`memmove()`函数用于移动数组元素以消除已删除元素的影响。
阅读全文