用c语言帮我写上面那个问题的代码
时间: 2024-12-02 10:28:21 浏览: 12
当然可以,这里是一个简单的C语言程序,用于解决这个问题:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int value;
struct Node* next;
} Node;
// 插入节点并保持排序
void insert(Node** head, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->value = value;
newNode->next = NULL;
if (*head == NULL || value <= (*head)->value) {
newNode->next = *head;
*head = newNode;
} else {
Node* current = *head;
while (current->next != NULL && current->next->value > value) {
current = current->next;
}
newNode->next = current->next;
current->next = newNode;
}
}
// 使用哈希表存储重复元素
void countDuplicates(Node* head) {
int hash[10001] = {0}; // 假设元素范围在0-10000之间
Node* current = head;
while (current != NULL) {
hash[current->value]++;
current = current->next;
}
for (int i = 0; i < 10001; i++) {
if (hash[i] > 1) {
printf("%d appears %d times\n", i, hash[i]);
}
}
}
int main() {
int input[] = {1, 2, 3, 4, 4, 4, 5};
Node* head = NULL;
// 插入所有元素
for (int i = 0; i < sizeof(input) / sizeof(input[0]); i++) {
insert(&head, input[i]);
}
// 输出重复元素及次数
countDuplicates(head);
return 0;
}
```
这个程序首先定义了一个链表节点结构,然后实现了插入功能,保证链表有序。接着创建一个哈希表来记录元素的重复情况。最后,在`main`函数中处理输入数组并输出结果。
注意,由于实际需求可能会有不同,例如元素范围扩大或使用动态大小的哈希表,上述代码可能需要调整。此外,此示例假设输入范围内不会有超过10000的元素,实际应用时需根据实际情况修改哈希表的大小。
阅读全文