结合hash表和位运算做个小项目

这是一个模拟游客旅游目的地信息登记的小项目,主要运用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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值