IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构__哈希表 -> 正文阅读

[数据结构与算法]数据结构__哈希表

本篇文章记录哈希表的一些基本操作:

代码以及解释如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 97

typedef struct P{
	char id[12];
	char name[7];
	char sex[3];
	char grade[10]; 
} HashTable[M];//结构体构建,用于存数据使用 

int hash(char id[])//哈希函数,计算关键字的下标,这里使用的是数据分析法和除留余数法 
{
	int d;
	d=((id[8]-'0')*100+(id[9]-'0')*10+(id[10]-'0'))%97;//留最后的三位进行分析和计算 
	return d;
}

void hashTable(HashTable HT,char *filename)//建立哈希表的函数 
{
	int i;
	int d;//哈希值 
	int di;//线性探测法增量序列 
	int Hi;//线性探测法得到的地址Hi 
	FILE *fp;
	char id[12];
	char name[7];
	char sex[3];
	char grade[10];
	for(i=0;i<M;i++)//初始化表中的数据全部为空 
	{
		strcpy(HT[i].id,"");//strcpy函数的作用就是将逗号后面的内容复制到逗号前面 
		strcpy(HT[i].name,"");
		strcpy(HT[i].sex,"");
		strcpy(HT[i].grade,"");
	}
	if((fp=fopen(filename,"r"))==NULL)//判断输入的文件路径里是否有文件 
	{
		printf("文件%s不存在",filename);
		exit(0);
	}
	while(!feof(fp))//当有文件的时候进行输入 
	{
		fscanf(fp,"%s%s%s%s",id,name,sex,grade);
		d=hash(id);
		if(strcmp(HT[d].id,"")==0)
		{
			strcpy(HT[d].id,id);
			strcpy(HT[d].name,name);
			strcpy(HT[d].sex,sex);
			strcpy(HT[d].grade,grade);
		}
		else
		{
			for(di=1;di<M;di++)//这一部分是处理冲突,利用的是线性分析法 
			{
				Hi=(d+di)%M;
				if(strcmp(HT[Hi].id,"")==0)
				{
					strcpy(HT[Hi].id,id);
					strcpy(HT[Hi].name,name);
					strcpy(HT[Hi].sex,sex);
					strcpy(HT[Hi].grade,grade);
					break;
				}
			}
		}
	}
}

int serch(HashTable HT,char id[])//查找函数 
{
	int d;
	int di;
	int Hi;
	d=hash(id);
	if(strcmp(id,HT[d].id)==0)
        return d;//说明此位置找到了 
    else if(strcmp(HT[d].id,"")==0) 
        return -1;//说明在此位置没有找到,但是并不是代表没有,可能是之前冲突处理了 
    else{
    	for(di=1;di<M;di++)//所以这里要线性查找 
    	{
    		Hi=(d+di)%M;
    		if(strcmp(id,HT[Hi].id)==0)
    		    return Hi;
    		else if(strcmp(HT[Hi].id,"")==0)
    		    return -1;//说明真就没有找到了 
    		
    	}
    	return -1;
    }
}
void print(HashTable HT,int i)//单行打印数据函数 
{
	printf("姓名:%-10s性别:%-5s班级:%-10s\n",HT[i].name,HT[i].sex,HT[i].grade);
}
void printHT(HashTable HT)//将哈希表中的所有数据全部打印输出 
{
	int i;
	for(i=0;i<M;i++)
	{
		printf("%-3d:%-15s%-10s%-5s%-10s\n",i,HT[i].id,HT[i].name,HT[i].sex,HT[i].grade);
	}
}

int main()
{
	HashTable HT;
	int d;
	char ch;
	char filename[80],id[12];
	printf("构造哈希表,请输入信息所在的文件的名字:");
	scanf("%s",filename);
	printf("哈希表中数据为:\n");
	hashTable(HT,filename);
	
	printHT(HT);
	printf("**********哈希查找*************\n");
	printf("\n");
	while(1)
	{
		printf("请输入要查找的学生学号:");
		scanf("%s",id);
		fflush(stdin);
		d=serch(HT,id);
		if(d==-1)
		{
			printf("表中不存在学号为%s的学生记录,查找失败\n",id);
		}
		else
		{
			printf("学号为%s的学生记录为:\n",id);
			print(HT,d);
		}
		printf("\n");
		printf("是否继续查找,请按Y或者N\n");
		scanf("%c",&ch);
		fflush(stdin);//处理缓冲区 
		if(ch=='Y'||ch=='y')
		  continue;
		else break;
	} 
}

?其中txt文件我放在E盘中,所以路径为E:/名单.txt

?操作测试:

完结!!!!!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-14 10:09:04  更:2022-05-14 10:10:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:30:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码