#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* 第四週:
1. 新增一含 5 elements 的 Hash Table
2. 請將之前你們新增的十個 list entries 均勻的加入此 Hash Table
3. 請將此 Hash Table 的內容印出, 並藉由印出的方式證明你是均勻的 Hash 入 Hash Table
*/
int mod = 5;
struct data {
char name[16];
unsigned long height;
unsigned short index;
struct data *next;
}stu,*hash[10], *current, *previous, *tmp;;
typedef struct data Node;
void insert_hash(int n, char *arr, unsigned long *arr1, unsigned short *arr2);
void print_hash();
int main()
{
struct data stu = {"Kerwin", 177, 77};
Node *first, *node;
char *arr[] = {"Ariza", "Bryant", "Clarkson", "Divac", "Ennis", "Fisher", "Gasol", "Horry", "Ingram", "Johnson"};
unsigned long arr1[] = {203, 198, 196, 216, 191, 185, 213, 206, 206, 206};
unsigned short arr2[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int i = 0;
for(i=0; i<10; i++)
insert_hash(i+1, arr[i], arr1[i], arr2[i]);
print_hash();
return 0;
}
void insert_hash(int n, char *arr, unsigned long *arr1, unsigned short *arr2)
{
int m = n % mod;
if (hash[m] == NULL) {
current
= (struct data
*)malloc(sizeof(struct data
)); current->height = arr1;
current->index = arr2;
current->next = NULL;
hash[m] = current;
return;
}
tmp = hash[m], previous = NULL;
while(tmp->index <= arr2) {
if(tmp->index == arr2)
return;
if(tmp->next != NULL)
previous = tmp, tmp = tmp->next;
else {
current
= (struct data
*)malloc(sizeof(struct data
)); current->index = arr2;
current->height = arr1;
current->next = NULL;
tmp->next = current;
return;
}
}
if(previous != NULL) {
current
= (struct data
*)malloc(sizeof(struct data
)); current->index = arr2;
previous->next = current, current->next = tmp;
}
else {
current
= (struct data
*)malloc(sizeof(struct data
)); current->index = arr2;
hash[m] = current, current->next = tmp;
}
return;
}
void print_hash()
{
int a;
for(a = 0; a < mod; a++) {
current = hash[a];
while(current != NULL) {
printf("%2d\t%8s\t%3d", current
->index
, current
->name
, current
->height
); current = current->next;
}
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKLyog56ys5Zub6YCxOgogCiAgIDEuIOaWsOWinuS4gOWQqyA1IGVsZW1lbnRzIOeahCBIYXNoIFRhYmxlCiAgIAogICAyLiDoq4vlsIfkuYvliY3kvaDlgJHmlrDlop7nmoTljYHlgIsgbGlzdCBlbnRyaWVzIOWdh+WLu+eahOWKoOWFpeatpCBIYXNoIFRhYmxlCiAgIAogICAzLiDoq4vlsIfmraQgSGFzaCBUYWJsZSDnmoTlhaflrrnljbDlh7osIOS4puiXieeUseWNsOWHuueahOaWueW8j+itieaYjuS9oOaYr+Wdh+WLu+eahCBIYXNoIOWFpSBIYXNoIFRhYmxlCgoqLwppbnQgbW9kID0gNTsKc3RydWN0IGRhdGEgewoJY2hhciBuYW1lWzE2XTsKCXVuc2lnbmVkIGxvbmcgaGVpZ2h0OwoJdW5zaWduZWQgc2hvcnQgaW5kZXg7CglzdHJ1Y3QgZGF0YSAqbmV4dDsKfXN0dSwqaGFzaFsxMF0sICpjdXJyZW50LCAqcHJldmlvdXMsICp0bXA7OwogCiAKdHlwZWRlZiBzdHJ1Y3QgZGF0YSBOb2RlOwoKdm9pZCBpbnNlcnRfaGFzaChpbnQgbiwgY2hhciAqYXJyLCB1bnNpZ25lZCBsb25nICphcnIxLCB1bnNpZ25lZCBzaG9ydCAqYXJyMik7CnZvaWQgcHJpbnRfaGFzaCgpOwogCmludCBtYWluKCkKewogCglzdHJ1Y3QgZGF0YSBzdHUgPSB7IktlcndpbiIsIDE3NywgNzd9OwogCglOb2RlICpmaXJzdCwgKm5vZGU7CgljaGFyICphcnJbXSA9IHsiQXJpemEiLCAiQnJ5YW50IiwgIkNsYXJrc29uIiwgIkRpdmFjIiwgIkVubmlzIiwgIkZpc2hlciIsICJHYXNvbCIsICJIb3JyeSIsICJJbmdyYW0iLCAiSm9obnNvbiJ9OwoJdW5zaWduZWQgbG9uZyBhcnIxW10gPSB7MjAzLCAxOTgsIDE5NiwgMjE2LCAxOTEsIDE4NSwgMjEzLCAyMDYsIDIwNiwgMjA2fTsKCXVuc2lnbmVkIHNob3J0IGFycjJbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMH07CglpbnQgaSA9IDA7CgkKCWZvcihpPTA7IGk8MTA7IGkrKykKCSAgICBpbnNlcnRfaGFzaChpKzEsIGFycltpXSwgYXJyMVtpXSwgYXJyMltpXSk7CgoJcHJpbnRfaGFzaCgpOwoKCXN5c3RlbSgicGF1c2UiKTsKCXJldHVybiAwOwp9CgoKCnZvaWQgaW5zZXJ0X2hhc2goaW50IG4sIGNoYXIgKmFyciwgdW5zaWduZWQgbG9uZyAqYXJyMSwgdW5zaWduZWQgc2hvcnQgKmFycjIpCnsKICAgIGludCBtID0gbiAlIG1vZDsKICAgIGlmIChoYXNoW21dID09IE5VTEwpIHsKICAgICAgICBjdXJyZW50ID0gKHN0cnVjdCBkYXRhICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGF0YSkpOwogICAgICAgIHN0cmNweShjdXJyZW50LT5uYW1lLCBhcnIpOwogICAgICAgIGN1cnJlbnQtPmhlaWdodCA9IGFycjE7CiAgICAgICAgY3VycmVudC0+aW5kZXggPSBhcnIyOwogICAgICAgIGN1cnJlbnQtPm5leHQgPSBOVUxMOwogICAgICAgIGhhc2hbbV0gPSBjdXJyZW50OwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHRtcCA9IGhhc2hbbV0sIHByZXZpb3VzID0gTlVMTDsKICAgIHdoaWxlKHRtcC0+aW5kZXggPD0gYXJyMikgewogICAgICAgIGlmKHRtcC0+aW5kZXggPT0gYXJyMikKCXJldHVybjsKICAgICAgICBpZih0bXAtPm5leHQgIT0gTlVMTCkKICAgICAgICAgICAgcHJldmlvdXMgPSB0bXAsIHRtcCA9IHRtcC0+bmV4dDsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY3VycmVudCA9IChzdHJ1Y3QgZGF0YSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGRhdGEpKTsKCWN1cnJlbnQtPmluZGV4ID0gYXJyMjsKCXN0cmNweShjdXJyZW50LT5uYW1lLCBhcnIpOwoJY3VycmVudC0+aGVpZ2h0ID0gYXJyMTsKCWN1cnJlbnQtPm5leHQgPSBOVUxMOwogICAgICAgICAgICB0bXAtPm5leHQgPSBjdXJyZW50OwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYocHJldmlvdXMgIT0gTlVMTCkgewogICAgICAgIGN1cnJlbnQgPSAoc3RydWN0IGRhdGEgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBkYXRhKSk7CiAgICAgICAgY3VycmVudC0+aW5kZXggPSBhcnIyOwogICAgICAgIHByZXZpb3VzLT5uZXh0ID0gY3VycmVudCwgY3VycmVudC0+bmV4dCA9IHRtcDsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGN1cnJlbnQgPSAoc3RydWN0IGRhdGEgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBkYXRhKSk7CiAgICAgICAgY3VycmVudC0+aW5kZXggPSBhcnIyOwogICAgICAgIGhhc2hbbV0gPSBjdXJyZW50LCBjdXJyZW50LT5uZXh0ID0gdG1wOwogICAgfQogICAgcmV0dXJuOwp9CgoKdm9pZCBwcmludF9oYXNoKCkKewogICAgaW50IGE7CiAgICBmb3IoYSA9IDA7IGEgPCBtb2Q7IGErKykgewogICAgICAgIHByaW50ZigiWyUwM2RdOiIsIGEpOwogICAgICAgIGN1cnJlbnQgPSBoYXNoW2FdOwogICAgICAgIHdoaWxlKGN1cnJlbnQgIT0gTlVMTCkgewogICAgICAgICAgICBwcmludGYoIiUyZFx0JThzXHQlM2QiLCBjdXJyZW50LT5pbmRleCwgY3VycmVudC0+bmFtZSwgY3VycmVudC0+aGVpZ2h0KTsKICAgICAgICAgICAgcHJpbnRmKCJcbiAgICAgICIpOwogICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dDsKICAgICAgICB9CiAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgfQp9Cg==