void insert_node(Node *p){
Node *tmp;
tmp = new Node;
tmp = p;
if(first == NULL){
status ++;
tmp->next = NULL;
first = tmp;
}
else{
status ++;
tmp->next = first;
first = tmp;
}
}
void Resize_content(){
if( status2 >= 7*space/10){
Entry *tmp;
tmp = new Entry[2*space];
for(int i=0;i<space;i++){
Node *paux;
paux = content[i].first;
while(paux){
//Node &caux = *paux;
tmp[paux->hash_index%(2*space)].insert_node(paux);
paux = paux ->next;
}
}
delete[] content;
content = new Entry[2*space];
content = tmp;
space = 2*space;
}
}
content
是一个大小为space的向量列表。一旦元素的数量超过空间的70%,就必须将元素移动到不同的位置。问题是元素形成相同的列表,因为在insert_node之后的pax ->next变为NULL并且没有移动
如果我正确理解了你的意图,这应该是解决方案:
void insert_node(Node *p){
if(first == NULL){
status ++;
//make p the start of a new 1-member list
p->next = NULL;
first = p;
}
else{
status ++;
// prepend p to existing list
p->next = first;
first = p;
}
}
void Resize_content(){
if( status2 >= 7*space/10){
Entry *tmp;
tmp = new Entry[2*space];
for(int i=0;i<space;i++){
Node *paux;
paux = content[i].first;
while(paux){
Node *caux = paux; //store current node's address
paux = paux ->next; // remember next node to process
tmp[paux->hash_index%(2*space)].insert_node(caux); //move current node
}
}
delete[] content;
content = tmp;
space = 2*space;
}
}
是否有一个特殊的原因,为什么你这样做,而不是使用std::vector
, std::list
(或std::forward_list
)和/或std::unordered_map
(为整个哈希)?