k==last_node->x && j==last_node->y,修改爲兩個必須有一個不相等
时间: 2024-03-12 17:48:47 浏览: 140
如果您想将 `k==last_node->x && j==last_node->y` 的条件修改为至少有一个不相等,您可以使用逻辑运算符 `||`,如下所示:
```
if ((k == last_node->x && j != last_node->y) || (k != last_node->x && j == last_node->y))
```
这个条件表达式会在 `k` 与 `last_node->x` 不相等或 `j` 与 `last_node->y` 不相等时返回 `true`,即表示至少有一个不相等。
相关问题
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内容为准进行保存。
以下是一个简单的实现,使用了链表和哈希表来维护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 函数打印出来。
void S1mmeSession::CuOutputNode(S1APNode* p_node, uint8_t worker_id,bool timeout) { bool output_ue_release = true, out_put_pdn_connect = true; time_t last_kqi_sec = 0; for (std::vector<CuKqiInfo_T>::iterator it = p_node->cu_kqi_.begin(); it != p_node->cu_kqi_.end();) { CuOutputKqi(p_node, it->msg_type, it->ebi, last_kqi_sec, output_ue_release,worker_id); it = p_node->cu_kqi_.erase(it); } S1MMEKQI* kqi_main = p_node->FindKqi(kS1mmeProcTypeERABModification); if(kqi_main){ CuEncodeErabModification(kqi_main, p_node->GetCommonInfo(), p_node->GetUserInfo(), current_time_.tv_sec,worker_id); } kqi_main = p_node->FindKqi(kS1mmeProcTypeSecondaryRatDataUsage); if(kqi_main){ CuEncodeSecondaryRatDataUsageReport(kqi_main, p_node->GetCommonInfo(), p_node->GetUserInfo(), current_time_.tv_sec,worker_id); } kqi_main = p_node->FindKqi(kS1mmeProcTypeAttach); if (kqi_main && ((timeout && nas_default_encrypt_alg_) || (!timeout))) { S1MMEKQI* kqi_ue_release = p_node->FindKqi(kS1mmeProcTypeUEContextRelease); S1MMEKQI* kqi_pdn_connect = p_node->FindKqi(kS1mmeProcTypePdnConnect, 5); if (1) { for (uint8_t i=0; i<1; i++) { //KQIBearer* p_bearer = kqi_initial_context->GetBearer(i); //if (p_bearer == NULL) break; //p_node->GetUserInfo()->FillKQIBearer(p_bearer->ebi, p_bearer); } } CuEncodeAttach(kqi_main, p_node->GetCommonInfo(), p_node->GetUserInfo(), current_time_.tv_sec,worker_id,kqi_ue_release,kqi_pdn_connect); //output attach if (output_ue_release && kqi_ue_release && kqi_ue_release->complete_time_.tv_sec - kqi_main->complete_time_.tv_sec > 15) { //output UEContextRelease; CuEncodeUEContextRelease(kqi_ue_release,p_node->GetCommonInfo(),p_node->GetUserInfo(),current_time_.tv_sec,worker_id); output_ue_release = false; } out_put_pdn_connect = false; }什么意思
这段代码主要是将S1APNode的信息输出到CU(Control Unit)中。首先,它会遍历p_node->cu_kqi_中的每个CuKqiInfo_T对象,并调用CuOutputKqi()函数将KQI信息编码并输出到CU中。接着,它会查找S1MMEKQI对象,并调用CuEncodeErabModification()、CuEncodeSecondaryRatDataUsageReport()和CuEncodeAttach()函数将ERAB Modification、Secondary RAT Data Usage Report和Attach信息编码并输出到CU中。如果timeout为true且nas_default_encrypt_alg_不为空,还会调用CuEncodeUEContextRelease()函数将UE Context Release信息编码并输出到CU中。在输出Attach信息时,如果output_ue_release为true且kqi_ue_release不为空,且kqi_ue_release已完成的时间与kqi_main已完成的时间相差大于15秒,则会调用CuEncodeUEContextRelease()函数将UE Context Release信息编码并输出到CU中。最后,将out_put_pdn_connect设置为false。