您的位置:首页 > 理论基础 > 数据结构算法

数据结构课程设计:哈希表的设计

2017-03-16 13:42 706 查看




我负责小组里处理冲突。





用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构