//下面给出哈希表的实现、插入以及打印代码: #include #include #include #include using namespace std; #define DEFAULT_TABLE_LENGTH 7 // 哈希表默认表长 #define $ -1 // 默认初始化的值 #define ElemType nos_msg // 值类型 typedef struct nos_msg // 执行体消息 { // 构造函数 nos_msg(int nodId,String msg) { this->nodId=nodId; strcpy(this->msg, msg); }; int nodId; string msg; }nos_msg; typedef struct bucket_node // 节点类型 { ElemType data[3]; struct bucket_node *next; // 每个节点能存放3个数据和一个指向另一个节点的指针 }bucket_node; typedef bucket_node hash_table[P]; // 定义哈希表(实际就是一个数组) /*初始化哈希表(数组)元素 */ void init_bucket_node(hash_table &ht, int i) { memset(&ht[i], $, sizeof(ElemType)*3); memset ht[i].next = 0; } /* 初始化哈希表 */ void init_hash_table(hash_table &ht) { for(int i = 0; inext) { // 节点指针p 指向ht[index]节点 if(NULL != p->next) // 如果p->next == NULL,说明p所指节点的三个数据已经插满 continue; // 则p指向下一个节点 for(int i = 0; i<3; ++i) { if($ == p->data[i]) // 如果某个位置等于$,说明该位置为空,把x插入并返回 { p->data[i] = x; return 0; } } } if(NULL == p) // 如果 p == NULL,说明最后一个节点刚好插满,需要另外开辟一个节点的内存 { bucket_node * s = new bucket_node; memset(s, $, sizeof(ElemType)*3); // 初始化刚开辟的内存 s->next = NULL; s->data[0] = x; // x 放入该节点的第一个位置 q->next = s; // 把s 挂到最后一个节点的下面 return 0; } return -1; // 如果没有在现有节点下找到位置,并且开辟节点也失败的话,x 就真的不能插入了 } /* 打印哈希表 */ void show_hash_table(hash_table &ht) { bucket_node* p = NULL; for(int i = 0; inext) // 打印下标为i的哈希表元素及该位置所链接的节点 { for( int k = 0; 3>k && $!=p->data[k]; ++k) // p->data[k] != $ ,说明该位置不空,则打印 { cout<data[k]<<" "; } } cout<