Cで辞書を使ってhackerRankチャレンジをしていましたが、K & R本からいくつかのコードを抜きました。私はどのように彼らがハッシュテーブル内のリンクリストのバケットをこれで確立しているのかわからないのですか?リンクされたリストの先頭に次のポインタをリンクしているように見えます。彼らは何らかの形でバケツを作っているのですか? npは文字列(name、defn)と次へのポインタを含む3つのメンバ構造体であり、lookupはnpが辞書に存在するかどうかを調べます。このリンクリストでK&Rは何をしていましたか?
if ((np = lookup(name)) == NULL){ // file not found
np = (struct nlist *) malloc(sizeof(*np));
if (NULL == np || (np->name = strdup(name)) == NULL){
return NULL;
}
hashval = hash(name);
np->next = hashtab[hashval]; // WHAT THE HECK ARE THEY DOING HERE?!?!
hashtab[hashval] = np;
}else{ // already there
free((void *)np->defn);
}
if((np->defn = strdup(defn)) == NULL){
return NULL;
}
return np;
次のように私はそれを動作させるためにコードを変更し、私は彼らが作るしようとしていたポイントを逃したことをしつこい感じを持っています。
if ((np = lookup(name)) == NULL) { // not found
np = (struct nlist *) malloc(sizeof(*np));
if (np == NULL || (np->name = strdup(name)) == NULL)
return NULL;
hashval = hash(name);
phE->next = NULL; //if first entry set next to NULL, MOD HERE
tmpNode = hashtab[hashval];
if (tmpNode == NULL){ // EMPTY SPOT IN HASHTABLE
hashtab[hashval] = np;
}else{ //HASH COLLISION, ADD NODE TO LIST END
while (tmpNode->next != NULL){
tmpNode = tmpNode->next;
}
tmpNode->next = np;
}
}else{
free((void *) np->defn);
}
if ((np->defn = strdup(defn)) == NULL){
return NULL;
}
return np;
リンクリストの先頭に挿入されています。 –
リンクされたリストの先頭に挿入すると、リストをトラバースして最後を検索した場合と同じように、挿入はO(n)ではなくO(1)になります。時には、end-insertionを必要とするリストは、これを避けるためにコントロールブロックに "end"ポインタも格納します。 –
@ 0xsmash0th: 'phE'は何ですか?あなたのコードのどこにも言及されていません。 – AnT