0
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是一个向量列出大小空间的条目。一旦元素的数量超过空间的 70%,则重新调整空间,它将元素移动到不同的位置。问题在于元素来自同一个列表,因为 insert_node 之后的 paux->next 变为 NULL 并且没有移动

4

1 回答 1

0

如果我正确理解您的意图,这应该是解决方案:

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(or std::forward_list) 和/或std::unordered_map(用于整个散列)?

于 2013-05-11T12:49:32.010 回答