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

我负责小组里处理冲突。用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!='
#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;
}
') { 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!='
#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;
}
') { 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; }

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

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