#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<xstring>
#include<string>
using namespace std;
struct hashlian//定义hash表的结点存储结构
{
int key;//存储关键字
hashlian*next;//地址指针
int Score;//分数
int age;
string xingbie;
string name;
};
void main()
{
int m=0;//
int i=0;//
int j=0;//辅助变量
int weizhi=0;//记录元素对应的结点位置
int find=0;//记录待查找的元素
hashlian *data;//存储要操作的数据
hashlian*p1=NULL;
hashlian*p2=NULL;//指向结点的辅助指针
hashlian*hash=NULL;
cout<<"输入最大数据个数";
cin>>m;//输入hash表长
hash=new hashlian[m];//存储hash表
data=new hashlian[m];//动态开辟存储空间
for(int ii=0;ii<m;ii++)//对hash表进行初始化
{
hash[ii].key=-1;
hash[ii].next=NULL;
}
cout<<"输入数据(退出输入-1)!"<<endl;
cout<<"第一个:";
cout<<"请分别输入分数,年龄,性别,姓名"<<endl;
cin>>data[i].Score>>data[i].age>>data[i].xingbie>>data[i].name;
while(data[i].Score!=-1)//循环输入待操作的数据
{
if(i<=m-1)
{
i++;
cout<<"第"<<i+1<<"个:";
cin>>data[i].Score>>data[i].age>>data[i].xingbie>>data[i].name;
}
else
{
cout<<"越界了!"<<endl;
}
}
j=i;
for(i=0;i<j;i++)//链地址法处理冲突建立hash表
{
weizhi=data[i].Score%m;//定位存储位置
if(hash[weizhi].key=-1)//若当前无元素直接存储
{
hash[weizhi].key=data[i].Score;
hash[weizhi].age=data[i].age;
hash[weizhi].xingbie=data[i].xingbie;
hash[weizhi].name=data[weizhi].name;
}
else
{
p1=&hash[weizhi];
p2=p1->next;
while(p2!=NULL)//控制p2始终指向最后一个结点的下一位
{
p1=p2;
p2=p2->next;
}
p2=new hashlian;
p2->key=data[i].Score;//动态申请空间进行存储后再插入
p2->age=data[i].age;
p2->name=data[i].xingbie;
p2->name=data[i].name;
p2->next=NULL;
p1->next=p2;
}
}
cout<<"输入查找的数据:";cin>>find;
weizhi=find%m;//定位待查找数据的应存储位置
p1=&hash[weizhi];
while(p1!=NULL)//从第一个位置开始循环查找直到最后一个结点的下一位
{
if(p1->key==find)
{
cout<<"查找成功!"<<endl;
break;
}
p1=p1->next;
}
if(p1==NULL)//全部查找后仍没有则查找失败
{
cout<<"查找失败!"<<endl;
}
}
老师说要用数组链表发解决冲突,要有增加,删除,查找的功能,每次准备用类或结构体写,思路总是理不清楚、、、、