用c语言实现输入一组无序的整数,编写程序按照整数出现次数由多到少输出整数及其出现次数,若出现次数相同,则按照输入顺序输出。
时间: 2023-06-08 20:08:33 浏览: 113
好的,我已经明白你的要求。针对你的问题,我们可以使用一个哈希表来记录每个整数的出现次数,并用一个数组来保存输入的整数。接下来,我们可以根据哈希表中每个整数的出现次数从大到小进行排序,并按照输入顺序输出整数及其出现次数。
具体的实现细节如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100 // 数组的最大长度
/* 哈希表节点 */
typedef struct _hash_node {
int key;
int value;
struct _hash_node* next;
} hash_node;
/* 哈希表 */
typedef struct _hash_map {
hash_node** table;
int size;
} hash_map;
/* 初始化哈希表 */
void init_hash_map(hash_map* hmap) {
hmap->table = (hash_node**)malloc(sizeof(hash_node*) * MAXSIZE);
memset(hmap->table, 0, sizeof(hash_node*) * MAXSIZE);
hmap->size = 0;
}
/* 插入哈希表 */
void insert_hash_map(hash_map* hmap, int key) {
int index = (key % MAXSIZE + MAXSIZE) % MAXSIZE; // 计算哈希值
hash_node* node = hmap->table[index];
while (node != NULL && node->key != key) { // 查找节点
node = node->next;
}
if (node == NULL) { // 未找到节点,插入新节点
node = (hash_node*)malloc(sizeof(hash_node));
node->key = key;
node->value = 1;
node->next = hmap->table[index];
hmap->table[index] = node;
hmap->size++;
} else { // 找到节点,将节点值加一
node->value++;
}
}
/* 按照出现次数从大到小排序 */
int cmp(const void* a, const void* b) {
hash_node* nd1 = *((hash_node**)a);
hash_node* nd2 = *((hash_node**)b);
if (nd1->value != nd2->value) {
return nd2->value - nd1->value;
} else {
return nd1->key - nd2->key;
}
}
/* 输出结果 */
void print_result(hash_map* hmap, int* nums, int len) {
hash_node** nodes = (hash_node**)malloc(sizeof(hash_node*) * hmap->size);
int cnt = 0;
for (int i = 0; i < MAXSIZE; i++) {
hash_node* node = hmap->table[i];
while (node != NULL) {
nodes[cnt++] = node;
node = node->next;
}
}
qsort(nodes, hmap->size, sizeof(hash_node*), cmp);
for (int i = 0; i < hmap->size; i++) {
int key = nodes[i]->key;
int value = nodes[i]->value;
for (int j = 0; j < len; j++) { // 查找输入顺序
if (nums[j] == key) {
printf("%d %d\n", key, value);
break;
}
}
}
free(nodes);
}
/* 主函数 */
int main() {
hash_map hmap;
init_hash_map(&hmap);
int nums[MAXSIZE];
int len = 0;
printf("请输入一组无序整数,以空格分隔:\n");
char s[100];
gets(s);
char* p = strtok(s, " ");
while (p != NULL) { // 解析输入字符串
int num = atoi(p);
nums[len++] = num;
insert_hash_map(&hmap, num);
p = strtok(NULL, " ");
}
print_result(&hmap, nums, len);
return 0;
}
```
这样就实现了按照整数出现次数排序输出的功能。希望能对你有所帮助。如果还有其他问题,请随时提出。
阅读全文