MsgCommonInfo& common = p_node->GetCommonInfo(); SPUserInfo& sp_user_info = p_node->GetUserInfo(); uint64_t imsi = sp_user_info->GetIMSI(); if(common.eci == 0) { common.eci = sp_user_info->GetEci(); } uint16_t tmp_enbid = common.tac; uint64_t imei = common.imei;请根据以上信息用C语言实现一个函数,要求维护一组key、value的关系。 key:imsi value:imsi、imei、common.eci、common.tac、last_time 要求,imsi相同时,以最后一条记录的value内容为准进行保存。
时间: 2024-03-25 13:36:22 浏览: 149
以下是一个简单的实现,使用了链表和哈希表来维护key-value的关系:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#define MAX_IMSI_LEN 16
typedef struct {
uint64_t imsi;
uint64_t imei;
uint32_t eci;
uint16_t tac;
time_t last_time;
} Value;
typedef struct Node {
char key[MAX_IMSI_LEN];
Value value;
struct Node* next;
} Node;
#define HASH_SIZE 1000 // 哈希表大小
Node* hash_table[HASH_SIZE];
// 计算哈希值
unsigned int hash(const char* key) {
unsigned int h = 0;
for (int i = 0; i < strlen(key); i++) {
h = 31 * h + key[i];
}
return h;
}
// 查找结点
Node* find_node(const char* key) {
unsigned int h = hash(key) % HASH_SIZE;
Node* p = hash_table[h];
while (p) {
if (strcmp(p->key, key) == 0) {
return p;
}
p = p->next;
}
return NULL;
}
// 插入或更新结点
void insert_node(const char* key, const Value* value) {
unsigned int h = hash(key) % HASH_SIZE;
Node* p = find_node(key);
if (p) {
p->value = *value;
p->value.last_time = time(NULL);
} else {
Node* new_node = (Node*)malloc(sizeof(Node));
strcpy(new_node->key, key);
new_node->value = *value;
new_node->value.last_time = time(NULL);
new_node->next = hash_table[h];
hash_table[h] = new_node;
}
}
// 打印所有结点
void print_nodes() {
for (int i = 0; i < HASH_SIZE; i++) {
Node* p = hash_table[i];
while (p) {
printf("key: %s, imsi: %llu, imei: %llu, eci: %u, tac: %u, last_time: %ld\n",
p->key, p->value.imsi, p->value.imei, p->value.eci, p->value.tac, p->value.last_time);
p = p->next;
}
}
}
int main() {
Value v1 = {123456789012345, 123456789012345, 123, 456, 0};
Value v2 = {123456789012345, 987654321098765, 456, 789, 0};
Value v3 = {234567890123456, 987654321098765, 789, 123, 0};
insert_node("123456789012345", &v1);
insert_node("123456789012345", &v2);
insert_node("234567890123456", &v3);
print_nodes();
return 0;
}
```
说明:
1. Value 结构体定义了需要保存的信息,包括 imsi、imei、eci、tac 和 last_time。
2. Node 结构体定义了哈希表中的结点,包括 key 和 value,以及指向下一个结点的指针 next。
3. hash_table 是哈希表的数组,每个元素是一个指向 Node 结构体的指针,初始值为 NULL。通过哈希函数将 key 转换为哈希值,在对应的链表中查找或插入结点。
4. find_node 函数根据 key 查找结点,如果找到了就返回结点指针,否则返回 NULL。
5. insert_node 函数根据 key 插入或更新结点,如果已经存在就更新 value 和 last_time,否则就创建新的结点。
6. print_nodes 函数遍历整个哈希表,打印所有结点的信息。
7. 在 main 函数中创建了三个 Value 结构体,分别对应不同的 imsi、imei、eci 和 tac 值,然后调用 insert_node 函数插入到哈希表中,并调用 print_nodes 函数打印出来。
阅读全文