给定一个长度为n的整数数组,统计每个元素出现的次数,并输出每个元素出现的所有位置即数组中的索引位置,用C语言完成
时间: 2024-12-15 08:20:53 浏览: 10
在C语言中,你可以使用一个哈希表(如数组+偏移量的方式或者使用`std::map`等数据结构)来存储每个元素及其对应的索引列表。这里提供一种简单的基于数组的解决方案:
```c
#include <stdio.h>
#define SIZE 100 // 根据实际数组大小调整
// 结构体表示元素及其出现次数和位置
typedef struct {
int value;
int count;
int positions[SIZE]; // 存储位置的数组,初始化为-1表示未找到
} Element;
void printPositions(Element arr[], int n) {
for (int i = 0; i < n; i++) {
if (arr[i].count > 0) { // 只打印非零计数值的元素
printf("元素 %d 出现了 %d 次,位置有:", arr[i].value, arr[i].count);
for (int j = 0; j < arr[i].count; j++) {
printf("%d ", (i + arr[i].positions[j]) % n); // 如果索引超出了范围,则对数组长度取模
}
printf("\n");
}
}
}
int main() {
int arr[SIZE];
// 初始化数组和读入数据
// ...
for (int i = 0; i < n; i++) {
Element *elem = &arr[i]; // 访问当前元素信息
elem->value = arr[i]; // 元素值
elem->count = 1; // 初始计数为1
// 更新元素的位置数组(如果遇到相同的元素)
for (int j = i + 1; j < n; j++) {
if (arr[j] == arr[i]) {
elem->count++;
elem->positions[elem->count - 1] = j; // 增加计数并添加新位置
} else {
break; // 遇到不同元素,结束搜索
}
}
}
printPositions(arr, n);
return 0;
}
```
这个程序首先遍历整个数组,然后对于每个元素,它会更新其出现的次数和位置列表。注意,在处理位置时,我们需要对数组长度取模以适应可能出现的超出数组范围的情况。
阅读全文