这是一个模拟游客旅游目的地信息登记的小项目,主要运用hash表和位运算,用hash表,主要是方便姓名查找,而采用位运算方法记录地址,方便对比,而且可以降低内存。
#include <stdio.h>
#include <string.h>
typedef struct visitor
{
int number;
char *name;
char *telephone;
int add; //采用二进制位记录(去过的地方)
struct visitor *next;
}VISITOR;
enum
{
address = 255,
beijin = 01,
shanghai = 02,
shenzhen = 04,
hongkong = 010,
hainan = 020,
kunming = 040,
lasha = 0100,
sichuan = 0200
};
#define BITS 32
#define HASHSIZE 10
static VISITOR *hash[HASHSIZE];
char *int_to_bits(int x); //将数值转化为二进制
void select(void); //选项表
void save(void); //保存数据
VISITOR *find(char *name); //查找数据
void print(VISITOR *p);
int hash_value(char *name);
char *strdup(char *name);
void mode(int *add);
main()
{
int num;
char name[20];
VISITOR *p;
select();
printf("please operate:");
scanf("%d", &num);
while (num != 3)
{
if (num == 1)
{
printf("please input name:\n");
scanf("%s", name);
p = find(name);
if (p != NULL)
print(p);
else
{
printf("it's not the information!\n");
}
}
else if(num == 2)
save();
printf("==============>next select:");
scanf("%d", &num);
}
return 0;
}
char *int_to_bits(int x)
{
int i;
char s[BITS + 1];
for (i = BITS - 1; x != 0; i-- )
{
s[i] = x % 2 + '0';
x /= 2;
}
while (i)
{
s[i--] = '0';
}
s[0] = '0';
s[BITS] = '\0';
return s;
}
void select(void)
{
printf("\n\n");
printf(" _______________________________________\n");
printf(" | |\n");
printf(" | ===========Main select: |\n");
printf(" | 1. find visitor’t information |\n");
printf(" | 2. insert visitor’t information |\n");
printf(" | 3. exit |\n");
printf(" |_______________________________________|\n");
printf("\n\n");
}
int hash_value(char *name) //hash值转换
{
int i;
unsigned hash;
for (hash = 0, i = 0; name[i] != '\0'; i++)
{
hash = hash + name[i] * 13;
}
return hash % HASHSIZE;
}
VISITOR *find(char *name) //查找数据
{
unsigned hashv;
VISITOR *p;
hashv = hash_value(name);
for (p = hash[hashv]; p != NULL; p = p->next)
{
if (strcmp(p->name, name) == 0)
return p;
}
return NULL;
}
void save(void) //保存数据
{
int num;
char name[20] = “star”;
char tel[20];
int add;
VISITOR *sit;
int hashv;
printf("please input news visitor't information:\n");
printf("enter number:");
scanf("%d", &num);
printf("enter name:");
scanf("%s", name);
printf("enter telephone:");
scanf("%s", tel);
printf("enter add mode:");
mode(&add);
if ((sit = find(name)) == NULL)
{
hashv = hash_value(name);
if ((sit = (VISITOR *)malloc(sizeof(VISITOR))) == NULL\
|| (sit->name = strdup(name)) == NULL
|| (sit->telephone = strdup(tel)) == NULL)
{
printf("it's not have enough memory!\n");
return;
}
sit->number = num;
sit->add = add;
sit->next = hash[hashv];
hash[hashv] = sit;
}
else
{
printf("the visitor already have\n");
}
}
char *strdup(char *name)
{
char *p;
if ((p = (char *)malloc(sizeof(strlen(name) + 1))) == NULL)
{
printf("strdup: it't not have enough memory!\n");
return NULL;
}
strcpy(p, name);
return p;
}
void print(VISITOR *p)
{
printf(“number: %d name: %s telephone: %s address: %d\n”, p->number,p->name, p->telephone, p->add);
printf(“address:\n”);
if (p->add & 255 & beijin)
printf(“beijin\n”);
if (p->add & 255 & shanghai)
printf(“shanghai\n”);
if (p->add & 255 & shenzhen)
printf(“shenzhen\n”);
if (p->add & 255 & hongkong)
printf(“hongkong\n”);
if (p->add & 255 & hainan)
printf(“hainan\n”);
if (p->add & 255 & kunming)
printf(“kunming\n”);
if (p->add & 255 & lasha)
printf(“lasha\n”);
if (p->add & 255 & sichuan)
printf(“sichuan\n”);
}
void mode(int *add)
{
int n = 0, i = 0, count = 0;
printf("\n\n");
printf(" ____________________________________\n");
printf(" | ============ select ============= |\n");
printf(" | 1.Beijin 2.shanghai |\n");
printf(" | 3.shenzhen 4.hongkong |\n");
printf(" | 5.hainan 6.kunming |\n");
printf(" | 7.lasha 8.sichuan |\n");
printf(" | 9.eixt! |\n");
printf(" |___________________________________|");
printf("\n\n");
printf("please select the number:\n");
while (i != 9)
{
count++;
printf("NO%d:", count);
scanf("%d", &i);
switch(i)
{
case 1:
n |= beijin;
break;
case 2:
n |= shanghai;
break;
case 3:
n |= shenzhen;
break;
case 4:
n |= hongkong;
break;
case 5:
n |= hainan;
break;
case 6:
n |= kunming;
break;
case 7:
n |= lasha;
break;
case 8:
n |= sichuan;
break;
default:
break;
}
}
*add = n;
}