数据结构课程设计哈希表的设计与实现课程设计(数据结构哈希表查找姓名设计)

我负责小组里处理冲突。用RN【30】做随即数列。在冲突的时候使用作为随即增量。为防止重复,在赋值时做适当处理。这是处理前的代码:#include#include#include#include#include#includeusingnamespacestd;#defineMAX_NUM26typedefstructPreson//定义数

大家好,又见面了,我是你们的朋友全栈君。

数据结构课程设计哈希表的设计与实现课程设计(数据结构哈希表查找姓名设计)

数据结构课程设计哈希表的设计与实现课程设计(数据结构哈希表查找姓名设计)

我负责小组里处理冲突。

数据结构课程设计哈希表的设计与实现课程设计(数据结构哈希表查找姓名设计)

数据结构课程设计哈希表的设计与实现课程设计(数据结构哈希表查找姓名设计)

用RN【30】做随即数列。在冲突的时候使用作为随即增量。为防止重复,在赋值时做适当处理。

这是处理前的代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <conio.h>
#include<time.h>
using namespace std;

#define MAX_NUM 26

typedef struct Preson //定义数据结构 
{
	int num;
	char name[16];
	struct Preson *Link; 
}Student;

Student *Hashtab[MAX_NUM]; //定义哈希表 

int Hash(char str[])  //定义哈希函数 
{
	int val;
	char *p;
	p=str;
	while(*p!='\0')
	{
		val+=*p++;
	}
	return (val%MAX_NUM);
}

Student *cmp(Student *fir,Student *sec) // 判断两节点是否相同的函数 
{
	Student *pre; 
	pre=fir;
	while(pre!=NULL)
	{
		if(/*pre->num == sec->num || */!strcmp(pre->name,sec->name) /*允许重名存在*/)
		{
			return pre;
		}
		pre=pre->Link;
	}
	if(pre==NULL)
		return NULL;
}

void insert() //定义插入函数 
{
	Student *nodetemp;
	nodetemp = (Student *)malloc(sizeof(Student));
	nodetemp->Link=NULL;
	printf("请输入学生序号:");
	scanf("%d",&nodetemp->num);
	printf("请输入学生姓名:");
	scanf("%s",nodetemp->name);      //新节点建立完成 
	
	int index = Hash(nodetemp->name); 
	while(Hashtab[index]!=NULL)
	{
		if(strcmp((Hashtab[index]->name),nodetemp->name)==0)
		{
			printf("信息已存在\n");
			break;
		}
		else
		{   srand(time(NULL));
			index=(index+rand())%30;
		}
	}
	if(Hashtab[index]==NULL)
	{
	Hashtab[index] = nodetemp;
	printf("信息录入成功(imet)\n");
    }
	system("pause");
}

void find()
{
	Student *temp,*p;
	temp = (Student*)malloc(sizeof(Student));
	printf("请输入要查询同学的姓名:");
	scanf("%s",temp->name);
	int index = Hash(temp->name);
	p=cmp(Hashtab[index],temp);
	if(p==NULL)
		printf("记录不存在\n");
	else
	{
		printf("学号:%d,姓名:%s\n",p->num,p->name);
	}
	system("pause");
} 

void show()
{
	Student *p;
	printf("*******************************\n");
	printf("** 学号                 姓名 **\n");
	printf("*******************************\n");
	for(int i=0;i<MAX_NUM;i++)
	{
		if(Hashtab[i]!=NULL)
		{
			p=Hashtab[i];
			while(p!=NULL)
			{
				printf("** %-3d          %12s **\n",p->num,p->name);
				p=p->Link;
			}
		}
	}
	printf("*******************************\n");
	system("pause");
}

void menu()
{
	printf("************************************************\n");
	printf("**                                            **\n");
	printf("**          输入对应数字,实现对应操作        **\n");
	printf("**               1.  插入信息                 **\n");
	printf("**               2.  查找信息                 **\n");
	printf("**               3.  显示信息                 **\n");
	printf("**                                            **\n");
	printf("************************************************\n");
	int i;
	scanf("%d",&i);
	switch(i) 
	{
		case 1:
			insert();
			system("cls");
			menu();
			break; 
		case 2:
			find();
			system("cls");
			menu();
			break; 
		case 3:
			show();
			system("cls");
			menu();
			break; 
	}

} 
int main()
{
	for(int i=0;i<MAX_NUM;i++)//初始化哈希表
	{
		Hashtab[i]=NULL;
	} 
	int k=5;
	menu();
	return 0;
}

这是处理后的代码。

采用伪随机再散列处理冲突。

需要改动的地方有:

1、插入函数

2、查找函数

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <conio.h>
#include<time.h>
using namespace std;

#define MAX_NUM 30

typedef struct Preson //定义数据结构 
{
	int num;
	char name[16];
	struct Preson *Link; 
}Student;

Student *Hashtab[MAX_NUM]; //定义哈希表 
int RN[30];//随即数列 


int Hash(char str[])  //定义哈希函数 
{
	int val;
	char *p;
	p=str;
	while(*p!='\0')
	{
		val+=*p++;
	}
	return (val%MAX_NUM);
}

Student *cmp(Student *fir,Student *sec) // 判断两节点是否相同的函数 
{
	Student *pre; 
	pre=fir;
	while(pre!=NULL)
	{
		if(/*pre->num == sec->num || */!strcmp(pre->name,sec->name) /*允许重名存在*/)
		{
			return pre;
		}
		pre=pre->Link;
	}
	if(pre==NULL)
		return NULL;
}

void insert() //定义插入函数 
{
	Student *nodetemp;
	nodetemp = (Student *)malloc(sizeof(Student));
	nodetemp->Link=NULL;
	printf("请输入学生序号:");
	scanf("%d",&nodetemp->num);
	printf("请输入学生姓名:");
	scanf("%s",nodetemp->name);      //新节点建立完成  
	int index = Hash(nodetemp->name); 
	while(Hashtab[index]!=NULL)
	{   int i=0;
		if(strcmp((Hashtab[index]->name),nodetemp->name)==0)//
		{
			printf("信息已存在\n");
			break;
		}
		else //若冲突
		{  
	  		index=RN[i];
		}
	}
	if(Hashtab[index]==NULL)
	{
	Hashtab[index] = nodetemp;
	printf("信息录入成功(imet)\n");
    }
	system("pause");
}

void find()
{   Student *temp,*p;
	temp = (Student*)malloc(sizeof(Student));
	printf("请输入要查询同学的姓名:");
	scanf("%s",temp->name);
	int index = Hash(temp->name);
	int i=0;
	while(strcmp(Hashtab[index]->name,temp->name)!=0&&Hashtab[index]!=NULL) //利用随机数列继续查找,直到找到或者链表为空。
	{
		index=RN[i];
		i++;
	}
	if(Hashtab[index]==NULL)
		printf("记录不存在\n");
	else if(strcmp(Hashtab[index]->name,temp->name)==0)
	{
		printf("学号:%d,姓名:%s\n",Hashtab[index]->num,Hashtab[index]->name);
	}
	system("pause");
} 

void show()
{
	Student *p;
	printf("*******************************\n");
	printf("** 学号                 姓名 **\n");
	printf("*******************************\n");
	for(int i=0;i<MAX_NUM;i++)
	{
		if(Hashtab[i]!=NULL)
		{
			p=Hashtab[i];
			while(p!=NULL)
			{
				printf("** %-3d          %12s **\n",p->num,p->name);
				p=p->Link;
			}
		}
	}
	printf("*******************************\n");
	system("pause");
}

void menu()
{
	printf("************************************************\n");
	printf("**                                            **\n");
	printf("**          输入对应数字,实现对应操作        **\n");
	printf("**               1.  插入信息                 **\n");
	printf("**               2.  查找信息                 **\n");
	printf("**               3.  显示信息                 **\n");
	printf("**                                            **\n");
	printf("************************************************\n");
	int i;
	scanf("%d",&i);
	switch(i) 
	{
		case 1:
			insert();
			system("cls");
			menu();
			break; 
		case 2:
			find();
			system("cls");
			menu();
			break; 
		case 3:
			show();
			system("cls");
			menu();
			break; 
	}

} 
int main()
{   
   srand((int)time(0));
 for(int i=0;i<30;i++)
 {
  RN[i]=rand()%30;
  for(int j=0;j<i;j++)//这里处理,防止随机数重复。
  {
   if(RN[i]==RN[j])
   {
    i--;
   }
  }
 }
	for(int i=0;i<MAX_NUM;i++)//初始化哈希表
	{
		Hashtab[i]=NULL;
	} 
	int k=5;
	menu();
	return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128366.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 安卓设备数据转移到ios设备

    安卓设备数据转移到ios设备下载“转移到iOS”,将iPhone和安卓设备插入电源,开启安卓设备的Wi-Fi。安卓设备的数据怎么转移到iPhone设备?点击“从安卓设备转移数据”安卓设备的数据怎么转移到iPhone设备?-在安卓设备上,打开“转移到iOS”应用并轻点“继续”。阅读显示的条款和条件。轻点“同意”以继续,然后轻点“查找代码”屏幕右上角的“下一步”。-在iOS设备上,轻点“从安卓设备转移数据”屏幕…

    2022年9月18日
  • 安卓—项目中插入百度地图sdk

    安卓—项目中插入百度地图sdk

    2022年1月19日
  • XXE漏洞以及Blind XXE总结「建议收藏」

    XXE漏洞以及Blind XXE总结「建议收藏」转载请注明出处:http://blog.csdn.net/u0117215010、前言XXE漏洞是针对使用XML交互的Web应用程序的攻击方法,在XEE漏洞的基础上,发展出了BlindXXE漏洞。目前来看,XML文件作为配置文件(Spring、Struts2等)、文档结构说明文件(PDF、RSS等)、图片格式文件(SVGheader)应用比较广泛,此外,网上有一些在线XML格式…

    2022年5月10日
  • 金蝶迷你版云服务器没有响应,连接云服务器异常金蝶迷你版

    连接云服务器异常金蝶迷你版内容精选换一换云服务器列表页面显示了所有已创建的GPU加速型云服务器信息。您可以参考如下操作查看云服务器详情。云服务器详情中展示了如下信息:云服务器名称、ID、状态等。云服务器上会话的状态、当前应用、连接设备、连接用户等。VR云渲游平台中涉及的云服务器状态如表1所示。云服务器状态一览云服务器状态说明正常设备与该云服务器正在连接中。闲置处于该状态的云服务云服务器列表页面,…

    2022年4月8日
  • 【c#】验证SQL语法是否正确

    【c#】验证SQL语法是否正确【c#】验证SQL语法是否正确

    2022年4月25日
  • c求逆矩阵的代码_二维矩阵求逆

    c求逆矩阵的代码_二维矩阵求逆刷石油大刷自闭了,随便写点乱七八糟的东西放松一下。。逆矩阵=伴随矩阵除以对应行列式的值,所以分别把这两个求出来就解决了,另外为了避免产生分数,就不做进一步计算了。效果图如下。至于代码。。就是把上次写的行列式求值的博客稍微改了一下,emmm。#include<stdio.h>#include<iostream>#pragmawarning(disa…

    2022年8月21日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号