使用链接的散列 table 存在问题
There is a problem with the hash table using chaining
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int value;
struct Hashnode* next;
} Hashnode;
void add(int value);
void print();
Hashnode Hash[11];
int main() {
add(12);
add(44);
add(13);
add(88);
add(23);
add(94);
add(11);
add(39);
add(20);
add(16);
add(5);
print();
return 0;
}
void add(int value) {
int hashIndex = value % 11;
Hashnode* newNode = (Hashnode*)malloc(sizeof(Hashnode));
newNode->next = NULL;
newNode->value = value;
if (Hash[hashIndex].value == NULL) { //firstValue
Hash[hashIndex].next = newNode;
}
else { // if have a value starting chaining
Hashnode* temp = Hash[hashIndex].next;
while (temp != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
}
void print() {
Hashnode* temp;
for (int i = 0; i < 11; i++) {
temp = Hash[i].next;
while (temp->next != NULL) {
printf("%d, %d\n", i, temp->value);
temp = temp->next;
}
}
}
我使用链接创建了一个散列 table,但是有一个问题。
如果按照main函数进入并打印结果值,则不会出现被视为碰撞的部分。
请告诉我是输入功能还是打印功能的问题。
#include <stdio.h>
#include <stdlib.h>
struct Hashnode{
int value;
struct Hashnode* next;
};
void add(int value);
void print();
struct Hashnode* Hash[11];
int main() {
add(12);
add(44);
add(13);
add(88);
add(23);
add(94);
add(11);
add(39);
add(20);
add(16);
add(5);
print();
return 0;
}
void add(int value) {
int hashIndex = value % 11;
struct Hashnode* newNode = (struct Hashnode*)malloc(sizeof(struct Hashnode));
newNode->next = NULL;
newNode->value = value;
if (Hash[hashIndex] == NULL) { //firstValue
Hash[hashIndex] = newNode;
}
else { // if have a value starting chaining
struct Hashnode* temp = Hash[hashIndex];
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
}
void print() {
struct Hashnode* temp;
for (int i = 0; i < 11; i++) {
temp = Hash[i];
while (temp != NULL) {
printf("%d, %d\n", i, temp->value);
temp = temp->next;
}
}
}
你必须做这样的事情。使用地址存储而不是 Hashnode 作为数组。感谢 Eugene Sh.
他指出了你所有的错误。
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int value;
struct Hashnode* next;
} Hashnode;
void add(int value);
void print();
Hashnode Hash[11];
int main() {
add(12);
add(44);
add(13);
add(88);
add(23);
add(94);
add(11);
add(39);
add(20);
add(16);
add(5);
print();
return 0;
}
void add(int value) {
int hashIndex = value % 11;
Hashnode* newNode = (Hashnode*)malloc(sizeof(Hashnode));
newNode->next = NULL;
newNode->value = value;
if (Hash[hashIndex].value == NULL) { //firstValue
Hash[hashIndex].next = newNode;
}
else { // if have a value starting chaining
Hashnode* temp = Hash[hashIndex].next;
while (temp != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
}
void print() {
Hashnode* temp;
for (int i = 0; i < 11; i++) {
temp = Hash[i].next;
while (temp->next != NULL) {
printf("%d, %d\n", i, temp->value);
temp = temp->next;
}
}
}
我使用链接创建了一个散列 table,但是有一个问题。 如果按照main函数进入并打印结果值,则不会出现被视为碰撞的部分。 请告诉我是输入功能还是打印功能的问题。
#include <stdio.h>
#include <stdlib.h>
struct Hashnode{
int value;
struct Hashnode* next;
};
void add(int value);
void print();
struct Hashnode* Hash[11];
int main() {
add(12);
add(44);
add(13);
add(88);
add(23);
add(94);
add(11);
add(39);
add(20);
add(16);
add(5);
print();
return 0;
}
void add(int value) {
int hashIndex = value % 11;
struct Hashnode* newNode = (struct Hashnode*)malloc(sizeof(struct Hashnode));
newNode->next = NULL;
newNode->value = value;
if (Hash[hashIndex] == NULL) { //firstValue
Hash[hashIndex] = newNode;
}
else { // if have a value starting chaining
struct Hashnode* temp = Hash[hashIndex];
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
}
void print() {
struct Hashnode* temp;
for (int i = 0; i < 11; i++) {
temp = Hash[i];
while (temp != NULL) {
printf("%d, %d\n", i, temp->value);
temp = temp->next;
}
}
}
你必须做这样的事情。使用地址存储而不是 Hashnode 作为数组。感谢 Eugene Sh.
他指出了你所有的错误。