数据结构的学生信息哈希表的建立与查找

设有若干个学生的考试成绩,采用除留余数求哈希地址,将学生的信息存储到该地址空间,并且采用线性探测法解决冲突问题。



#include <iostream.h>

#include <conio.h>

#include <iomanip.h>

#include <string.h>

//---------------------------------------------------------------------------

typedef int KeyType;       // 关键字的类型

const int MAXSIZE=100;     // 数组的容量

struct ElemType            //学生的记录信息

  
{ KeyType  key ;        //学号

    
char name[8];         //姓名

    
int english;          //成绩

    
int math;             //成绩

    
int dataStructure;      //成绩

  
} ;

class SqHash

 
{ private:

     
ElemType *ht;     // 哈希表数组

     
int length;       // 哈希表容量

     
KeyType   p;      // 除留余数法的大质数

   
public:

     
SqHash( int n1,int p1);

     
~SqHash(){delete []ht; 
length=0;};

     
int  find( KeyType K );

     
void  creat_hash();

     
void PrintOut();

};

//-------------------------------------------------------------

SqHash::SqHash(int n1,int p1)

 { length=n1; 
p=p1;

  
ht=new ElemType[length];

  
for(int i=0;i<length;i++)ht[i].key=0;

 
}

void 
SqHash::creat_hash()

 { int i,j,K,en,ma,da;char na[8];

  
cout<<"\n  请逐一输入各个学号(关键字值)(-1结束):"; cin>>K;

   
while(K!=-1)

   
{     i=find(K);

          if(i==-32767) {

                        cout<<"\n   成功查找到,不再重复插入!";

                            cout<<"\n  请逐一输入各个学号(关键字值)(-1结束):";
cin>>K;

 

                }

          else 
if(i!=32767){

                  cout<<"\n  请输入学生的姓名,英语成绩、高数成绩和数据结构成绩:";   

cin>>na>>en>>ma>>da;

                  ht[i].key=K;

                  strcpy(ht[i].name,na);     //用串拷贝赋值

                  ht[i].english=en;

                  ht[i].math=ma; 

                  ht[i].dataStructure =da;            

 
// 插入学生记录K

                  cout<<"\n   插入成功!" ;

                  cout<<"\n  请逐一输入各个学号(关键字值)(-1结束):";
cin>>K;

                }

                else {

                       cout<<"Hash表已满"<<endl;

                       break;

                }

       }

}

/将此成员函数补充完整,使得程序能够正确运行

int 
SqHash::find( KeyType K )//查找函数

{

       KeyType  key ; 

       int
c; //冲突次数

       int
i=K%p; //取元素的散列函数值

       

       while
((c<MAXSIZE) &&(ht[i].key!=0 && ht[i].key!=K))//做while循环条件/当冲突次数小于散列表长度且查找位置有元素且不等于K,将i放入哈希地址

 

   
i=(i+1)%MAXSIZE;//这个就是做运算放入数的地址,解决冲突,遇到冲突次数加一

 

       if(ht[i].key
== K)//如果输入的k所在的哈希地址等于k,则执行将学生的信息存储到该地址空间

       {

              cout<<"\n
i="<<i<<"学号是:"<<setw(3)<<ht[i].key 

                     <<"姓名是:"<<setw(3)<<ht[i].name


                     <<"英语成绩是:"<<setw(3)<<ht[i].english


                     <<"高数成绩是:"<<setw(3)<<ht[i].math


                     <<"数据结构成绩是:"<<setw(3)<<ht[i].dataStructure
;

              return
-32767;//上述插入函数定义

       }

       else

       return
i;//查找成功

}

}

void 
SqHash::PrintOut()

{ int i,j;

 
for (i=0;i<length; i++)

   
cout<<"\n 
i="<<i<<"   学号:"<<setw(3)<<ht[i].key<<"   姓"<<setw(3)<<ht[i].name

 
<<"   英语成绩:"<<setw(3)<<ht[i].english<<"   高数成绩:"<<setw(3)<<ht[i].math   <<"数据结构成绩:"<<setw(3)<<ht[i]. dataStructure;

}

int main()

{ 
int p0,n0;

  
cout<<"\n  请输入n值(n值应是记录总数的1.3-1.5倍)"; cin>>n0;

  
cout<<"\n  请输入P值(应是不大于n 的大质数):";
cin>>p0;

  
SqHash  ha(n0,p0);  ElemType a;

  
int k; char ch;

  
do { cout<<"\n\n\n";

        cout<<"\n       1. 建立哈希表(开放地址法)  ";

        cout<<"\n       2. 在哈希表中查找某位学生 ";

        cout<<"\n       3. 输出哈希表";

        cout<<"\n       4. 结束";

       
cout<<"\n=======================================";

        cout<<"\n       输入您的选择(1,2,3,4):"; cin>>k;

       switch(k)

                { case 1:{  ha.creat_hash();

                     }  break;

                 case 2:{  cout<<"\n  请输入待查找的学生学号:";  cin>>a.key;

                    int i=ha.find(a.key);

                    if(i!=-32767)
cout<<"\n  此学生"<<a.key<<"  不存在!" ;

                    }   break;

                case 3:{ ha.PrintOut(); }  break;

                }

    
}while(k>=1&&k<=3);

  
_getch();        return 0;

}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值