📌  相关文章
📜  C程序来计算数组中每个元素的频率(1)

📅  最后修改于: 2023-12-03 15:00:13.170000             🧑  作者: Mango

C程序:计算数组中每个元素的频率

本程序旨在计算给定数组中每个元素的频率。它将数组作为输入,并返回一个包含每个元素及其频率的子数组。

实现思路

下面是计算数组中每个元素的频率的实现思路:

  1. 创建一个空的哈希表(HashMap),用于存储每个元素和其对应的频率。
  2. 遍历数组,对于每个元素:
    • 在哈希表中检查该元素是否存在。
    • 如果存在,将该元素的频率加1。
    • 如果不存在,将该元素添加到哈希表中,并设置其频率为1。
  3. 将哈希表转换为子数组,其中每个元素是一个键值对,键是数组中的元素,值是该元素的频率。
C代码

以下是用C语言实现计算数组中每个元素频率的代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int key;
    int value;
} KeyValue;

// 哈希表存储每个元素及其频率
KeyValue* hashMap = NULL;
int hashMapSize = 0;

void addToHashMap(int elem) {
    if (hashMap == NULL) {
        hashMap = (KeyValue*)malloc(sizeof(KeyValue));
    } else {
        hashMap = (KeyValue*)realloc(hashMap, (hashMapSize + 1) * sizeof(KeyValue));
    }
    
    hashMap[hashMapSize].key = elem;
    hashMap[hashMapSize].value = 1;
    hashMapSize++;
}

int findInHashMap(int elem) {
    for (int i = 0; i < hashMapSize; i++) {
        if (hashMap[i].key == elem) {
            return i;
        }
    }
    return -1;
}

void calculateFrequency(int* arr, int size) {
    for (int i = 0; i < size; i++) {
        int index = findInHashMap(arr[i]);
        if (index != -1) {
            hashMap[index].value++;
        } else {
            addToHashMap(arr[i]);
        }
    }
}

void printFrequencies() {
    printf("|Element | Frequency |\n");
    printf("|--------|-----------|\n");
    
    for (int i = 0; i < hashMapSize; i++) {
        printf("|   %d    |     %d     |\n", hashMap[i].key, hashMap[i].value);
    }
}

void freeHashMap() {
    free(hashMap);
}

int main() {
    int arr[] = {1, 2, 1, 3, 4, 2, 3, 2, 1};
    int size = sizeof(arr) / sizeof(arr[0]);

    calculateFrequency(arr, size);
    printFrequencies();
    freeHashMap();

    return 0;
}
使用说明

此程序假设输入数组中的元素为整数。您可以根据需要更改int到适合的数据类型。在main()函数中定义输入数组arr和其大小,然后调用calculateFrequency()函数计算频率,并使用printFrequencies()函数打印结果。

输出示例

以下是使用示例数组{1, 2, 1, 3, 4, 2, 3, 2, 1}运行程序的输出示例:

| Element | Frequency | |---------|-----------| | 1 | 3 | | 2 | 3 | | 3 | 2 | | 4 | 1 |