Hash programming think twice

本文介绍了一个基于哈希表的数据管理系统实现,包括初始化、地址计算、数据读取及搜索等功能。通过具体代码示例展示了如何使用哈希表进行学生信息的存储与查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "Hash.h" 

int MathAscii(char * Mathparnter) {
	int backnumber = 0;
	char * move = Mathparnter;

	if (!Mathparnter) return 0;

	while (*move != '/0') {
		backnumber += *move;

		++move;
	}
	return backnumber;
}

#include "Hash.h"

int MathAddress(char (*hashname)[CHNUMBER],int *hashrand,
	Name ** haskeytype) {
		int i ,j;
		int MathAddresscount = 0;
		int pladdress = 0;

		for (i = 0 ;i <= (*haskeytype)[0].length;++i) {

			//math the ascii here
			pladdress = MathAscii(hashname[i]);

			pladdress %= LENGTH;
			j = 0;
			while (!(*haskeytype)[pladdress].flag) {
				pladdress = (pladdress + hashrand[j]) % LENGTH;
				++j;
			}	
			memcpy((*haskeytype)[pladdress].name,hashname[i],CHNUMBER);
			(*haskeytype)[pladdress].flag = 1;

		}
		return 0;
}

#include "Hash.h"


int main(int argc , char * argv[]) {
	
	char orderecieve;
	char store[LENGTH][CHNUMBER];
	int rdnumber[LENGTH];
	Name *hashstore;
	

	// clear the array named store

	memset(store,0,LENGTH*CHNUMBER);
	printf("Do you really wanna to start the program?/n");
	printf("if you really wanna to do that, you should type 'y' or 'Y'/n");
	printf("Please input a order to computer./n");
	orderecieve = getchar();
	fflush(stdin);

	/*
	**program init here
	*/
	Init(store,rdnumber,&hashstore);

	while (orderecieve == 'Y' || orderecieve == 'y') {
		SearchInfo(hashstore,rdnumber);
		orderecieve = getchar();
		fflush(stdin);
		if (orderecieve != 'Y' || orderecieve != 'y') {
			printf("Do you really wanna to exit the program./n");
			orderecieve = getchar();
		}
	}
	free(hashstore);
	return 0;
}

#include "Hash.h"

int Init(char (*hashname)[CHNUMBER],int *hashrand,Name ** hashkeytype) {

	*hashkeytype = (Name *)malloc(sizeof(Name) * LENGTH);
	if (!*hashkeytype) exit(-1);
	memset(*hashkeytype,0,LENGTH);
	(*hashkeytype)[0].length = ReadData(hashname);

	//init the random number

	RandNumber(hashrand);

	//math the address where is 

	MathAddress(hashname,hashrand,hashkeytype);
	return 0;
}

#include "Hash.h"

int SearchInfo(Name * hashkeytype,int * hashrandom) {
	int i = 0,j;
	int sum;
	char custominput[CHNUMBER];

	printf("Please input the student'name you wanna to find./n");
	scanf("%s",custominput);

	sum = MathAscii(custominput);
	do{
		sum %= LENGTH;
		if (hashkeytype[sum].flag && 
			!strcmp(custominput,hashkeytype[sum].name)) {
				printf("result: find the student whose/'card is %d",sum);
				break;
		}
		else if (hashkeytype[sum].flag) {
			j = 0;
			sum = (sum + hashrandom[j]) % LENGTH;
		}
		else {
			printf("^_^!,no this person.");
			break;
		}
	}while (i < LENGTH);


	return 0;
}

#include "Hash.h"


int ReadData(char (*temp)[CHNUMBER]) {
	int i  , j;
	FILE * pf;
	pf = fopen("test.txt","r");
	if (!pf) exit(-1);
	for (j = 0; j < LENGTH; ++j) {
		fscanf(pf,"%s",temp[j]);
		if (feof(pf))
			break;
	}
	for (i = 0;i <= j; ++i) {
		printf("%s/n",temp[i]);
	}
	return j;
}
#include "Hash.h"

int RandNumber (int * hashrandnumber) {
	int * move = hashrandnumber;
	srand((unsigned)time(NULL));
	for (; move <&hashrandnumber[LENGTH]; ++move) {

		*move = (int)(100.0 * (rand()/(RAND_MAX + 1.0)));
	}
#ifdef _DEBUG
	move = hashrandnumber;
	for (; move < &hashrandnumber[LENGTH]; ++move) {
		printf("%d/n",*move);

	}
#endif // _DEBUG
	return 0;
}
During programming , I find that these are several programs ,during I’am doing some programming .
for example , while I make the data struct in the this field,I also realize that I miss the length 
 
Now ,I think I should better find the most meta of the object. 
 
and the program also have some problem like this:
1.the function of functions is not one poupose .
for example ,in SearchInfo function,the judging person’s code is in the array or not .I think you could also use function.
 
finally , I last say that using the adding programming thought is a good idea!

 
时间限制:1000ms 内存限制:512MB 输入文件名:s.in 输出文件名:s.out 题目描述: 给定一个长度为 N 的只含小写字母的字符串 S,每次操作可以选择一个位置 1 ≤ x ≤ N 和一个小写字母 c,接着把 Sₓ 改为 c。 你需要操作若干次,使得操作结束后,每相邻 K 个字符都不同,求最少的操作次数。保证 1 ≤ K ≤ 13。 输入格式: 第一行一个整数 T,表示测试数据组数。 接下来 T 组测试数据,对于每组测试数据: 第一行两个整数 N, K,分别表示字符串长度和子串的长度。 第二行一个长度为 N 的字符串 S。 输出格式: 对于每组测试数据,输出一行一个整数表示最少的操作次数。 样例输入 1(input1): 5 6 3 abaaba 5 2 hooch 8 3 cherykid 9 3 abbabbaba 9 3 aabbaabba 样例输出 1(output1): 2 1 0 3 4 样例 #1 解释: 对于第一组数据,可以用 2 次操作把 S 改为 abcabc,每相邻三个字符组成的字符串分别是 abc、bca、cab、abc,都满足包含的字符互不相同。 对于第三组数据,请注意可以不进行操作。 数据范围: 对于所有数据,保证 1 ≤ T ≤ 10⁵,1 ≤ ∑N ≤ 10⁶,1 ≤ K ≤ 13,S 中只含有小写字符。 子任务说明: 子任务 1:∑N ≤ 10,K ≤ 10,分值 10 子任务 2:∑N ≤ 100,K ≤ 10,分值 10 子任务 3:∑N ≤ 10³,K ≤ 13,分值 10 子任务 4:∑N ≤ 10⁵,K ≤ 3,分值 20 子任务 5:∑N ≤ 10⁵,K ≤ 13,分值 20 子任务 6:∑N ≤ 10⁶,K ≤ 13,分值 30 用C++ 14 With O2的语言写一段代码,不要超时,不要注释,用万能头,变量名用一个字母表示,最终代码写好后随便写5组边缘样例测试一下刚刚写的代码(把代码放进编译器输出检查),然后根据刚刚的代码测试修改代码,将这两段代码里的变量名用一个字母替代。代码加上空格,使代码有可读性(实在拿不到全分,也可以拿部分分,尽量多拿!)注意加上文件读写!!!!!!!!!!
07-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值