用c写求解一个序列中出现次数最多的元素
时间: 2024-02-15 16:05:22 浏览: 20
可以使用哈希表来实现这个功能,具体步骤如下:
1. 定义一个哈希表,用来存储元素及其出现次数;
2. 遍历序列中的每一个元素,将元素作为键,在哈希表中查找该键是否存在;
3. 如果该键不存在,则在哈希表中添加该键,并将对应的值设为1;
4. 如果该键已经存在,则将对应的值加1;
5. 遍历完序列后,遍历哈希表,找到值最大的键,即为出现次数最多的元素。
下面是一个用C语言实现的例子:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct hash_node {
int key;
int value;
} HashNode;
typedef struct hash_table {
HashNode *nodes[MAX_SIZE];
} HashTable;
int hash(int key) {
return key % MAX_SIZE;
}
HashTable *create_table() {
HashTable *table = (HashTable *) malloc(sizeof(HashTable));
for (int i = 0; i < MAX_SIZE; i++) {
table->nodes[i] = NULL;
}
return table;
}
void put(HashTable *table, int key) {
int index = hash(key);
HashNode *node = table->nodes[index];
if (node == NULL) {
node = (HashNode *) malloc(sizeof(HashNode));
node->key = key;
node->value = 1;
table->nodes[index] = node;
} else {
while (node != NULL) {
if (node->key == key) {
node->value++;
break;
}
if (node->next == NULL) {
HashNode *new_node = (HashNode *) malloc(sizeof(HashNode));
new_node->key = key;
new_node->value = 1;
node->next = new_node;
break;
}
node = node->next;
}
}
}
int get_max_key(HashTable *table) {
int max_key = -1, max_value = -1;
for (int i = 0; i < MAX_SIZE; i++) {
HashNode *node = table->nodes[i];
while (node != NULL) {
if (node->value > max_value) {
max_value = node->value;
max_key = node->key;
}
node = node->next;
}
}
return max_key;
}
int main() {
int nums[] = {1, 2, 3, 2, 4, 3, 2, 5, 6, 2};
int len = sizeof(nums) / sizeof(int);
HashTable *table = create_table();
for (int i = 0; i < len; i++) {
put(table, nums[i]);
}
int max_key = get_max_key(table);
printf("出现次数最多的元素是:%d\n", max_key);
return 0;
}
```
这个例子中,我们使用了一个链表解决哈希冲突的问题。同时,为了简化代码,我们只考虑了整型元素。如果要支持其他类型的元素,可以将哈希函数和哈希表中的节点类型进行修改。