#include <iostream>
#include <fstream>
#include <stdlib.h>
#define compEQ(a,b) (a == b)
typedef int T;
typedef int hashTableIndex;
using namespace std;
typedef struct Node_
{
T data;
struct Node_ *next;
} Node;
Node* hashTable[128];
int hashTableSize = 128;
hashTableIndex myhash(T data);
Node *insertNode(T data);
void deleteNode(T data);
Node *findNode (T data);
hashTableIndex myhash(T data)
{
return (data % hashTableSize);
}
Node *insertNode(T data)
{
Node *p, *p0;
hashTableIndex bucket;
bucket = myhash(data);
if ((p = new Node) == 0)
{
cout<<"no mem"<<endl;
exit(1);
}
p0 = hashTable[bucket];
hashTable[bucket] = p;
p->next = p0;
p->data = data;
return p;
}
void deleteNode(T data)
{
Node *p0, *p;
hashTableIndex bucket;
p0 = 0;
bucket = myhash(data);
p = hashTable[bucket];
while (p && !compEQ(p->data, data))
{
p0 = p;
p = p->next;
}
if (!p)
return;
if (p0)
p0->next = p->next;
else
hashTable[bucket] = p->next;
free(p);
}
Node *findNode (T data)
{
Node *p;
p = hashTable[myhash(data)];
while (p && !compEQ(p->data, data))
p = p->next;
return p;
}
int main()
{
for (int i = 10; i < 20; i++)
{
insertNode(i);
}
for (int i = 0; i < 30; i++)
{
std::cout << ((findNode(i) != NULL) ? "+" : "-");
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2RlZmluZSBjb21wRVEoYSxiKSAoYSA9PSBiKQoKdHlwZWRlZiBpbnQgVDsKdHlwZWRlZiBpbnQgaGFzaFRhYmxlSW5kZXg7Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdHlwZWRlZiBzdHJ1Y3QgTm9kZV8KewogICAgVCBkYXRhOwogICAgc3RydWN0IE5vZGVfICpuZXh0Owp9IE5vZGU7CgpOb2RlKiBoYXNoVGFibGVbMTI4XTsKaW50IGhhc2hUYWJsZVNpemUgPSAxMjg7CgpoYXNoVGFibGVJbmRleCBteWhhc2goVCBkYXRhKTsKTm9kZSAqaW5zZXJ0Tm9kZShUIGRhdGEpOwp2b2lkIGRlbGV0ZU5vZGUoVCBkYXRhKTsKTm9kZSAqZmluZE5vZGUgKFQgZGF0YSk7CgpoYXNoVGFibGVJbmRleCBteWhhc2goVCBkYXRhKQp7CiAgICByZXR1cm4gKGRhdGEgJSBoYXNoVGFibGVTaXplKTsKfQoKTm9kZSAqaW5zZXJ0Tm9kZShUIGRhdGEpCnsKICAgIE5vZGUgKnAsICpwMDsKICAgIGhhc2hUYWJsZUluZGV4IGJ1Y2tldDsKICAgIGJ1Y2tldCA9IG15aGFzaChkYXRhKTsKCiAgICBpZiAoKHAgPSBuZXcgTm9kZSkgPT0gMCkKICAgIHsKICAgICAgICBjb3V0PDwibm8gbWVtIjw8ZW5kbDsKICAgICAgICBleGl0KDEpOwogICAgfQoKICAgIHAwID0gaGFzaFRhYmxlW2J1Y2tldF07CiAgICBoYXNoVGFibGVbYnVja2V0XSA9IHA7CgogICAgcC0+bmV4dCA9IHAwOwogICAgcC0+ZGF0YSA9IGRhdGE7CgogICAgcmV0dXJuIHA7Cn0KCnZvaWQgZGVsZXRlTm9kZShUIGRhdGEpCnsKICAgIE5vZGUgKnAwLCAqcDsKICAgIGhhc2hUYWJsZUluZGV4IGJ1Y2tldDsKCiAgICBwMCA9IDA7CiAgICBidWNrZXQgPSBteWhhc2goZGF0YSk7CiAgICBwID0gaGFzaFRhYmxlW2J1Y2tldF07CgogICAgd2hpbGUgKHAgJiYgIWNvbXBFUShwLT5kYXRhLCBkYXRhKSkKICAgIHsKICAgICAgICBwMCA9IHA7CiAgICAgICAgcCA9IHAtPm5leHQ7CiAgICB9CgogICAgaWYgKCFwKQogICAgICAgIHJldHVybjsKCiAgICBpZiAocDApCiAgICAgICAgcDAtPm5leHQgPSBwLT5uZXh0OwogICAgZWxzZQogICAgICAgIGhhc2hUYWJsZVtidWNrZXRdID0gcC0+bmV4dDsKICAgIAogICAgZnJlZShwKTsKfQoKCk5vZGUgKmZpbmROb2RlIChUIGRhdGEpCnsKICAgIE5vZGUgKnA7CiAgICBwID0gaGFzaFRhYmxlW215aGFzaChkYXRhKV07CiAgICAKICAgIHdoaWxlIChwICYmICFjb21wRVEocC0+ZGF0YSwgZGF0YSkpCiAgICAgICAgcCA9IHAtPm5leHQ7CiAgICAKICAgIHJldHVybiBwOwp9CgoKaW50IG1haW4oKQp7CiAgICBmb3IgKGludCBpID0gMTA7IGkgPCAyMDsgaSsrKQogICAgewogICAgICAgIGluc2VydE5vZGUoaSk7CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMDsgaSsrKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAoKGZpbmROb2RlKGkpICE9IE5VTEwpID8gIisiIDogIi0iKTsKICAgIH0KfQo=