#include<string.h>
#include<ctype.h>
#include<malloc.h>
#include<limits.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define HASHSIZE 41
#define NULLKEY "\0"
typedef int KeyType;
typedef struct{
KeyType key;
char pinyin[20];
char name[10];
char song[50];
}DataType;
typedef struct{
DataType *data;
int count;
int sizeindex;
}HashItem,HashTable[HASHSIZE];
Status InitHashTable(HashTable &ht)// 操作结果: 构造一个空的哈希表
{ int i;
ht.count=0; // 当前元素个数为0
ht.sizeindex=0; // 初始存储容量为hashsize[0]
m=HASHSIZE;
ht.data=(ElemType*)malloc(m*sizeof(ElemType));
if(!ht.data)
exit(OVERFLOW); // 存储分配失败
for(i=0;i<m;i++)
ht.data[i].key=NULLKEY; // 未填记录的标志
return OK;
}
unsigned Hash(KeyType key)// 一个简单的哈希函数(m为表长,全局变量)
{ return key%m;
}
void collision(int &p,int d) // 线性探测再散列
{
p=(p+d)%m;// 开放定址法处理冲突
void CreateHash(HashTable*ht, int items[],int n){
int i;
for(i=0;i<HASHSIZE;i++){
ht[i]data.key=NULL;
ht[i].time=0;
}
for(i=0;i<n;i++)
HashInsert(ht,items[i]);
}
int HashInsert(HashTable*ht,DataType x){
int addr;
addr=Hashsearch(ht,x);
if(addr>0) return 0;
ht[-addr].data=key;
ht[-addr].times=1;
return 1;
}
int Hashsearch(HashTable*ht,DataType x){
int addr;
addr=HashFunc(x.key);
while(ht[addr].data.key!=NULL&&ht[addr].data.key!=x.key)
addr = Collision(addr);
if(ht[addr].data.key==x.key) return addr;
else
return -addr;
}
void CreateBoard(HashTable ht,char filename[]){
//建立哈希表, 为文件
DataType items(filename,items);
int n=0;
n=ReadBoard(filename,items);
CraeteHash(ht,items,n) ;
}
void Vote(HashTable ht,char filename[],DataType x){
//x为歌手
DataType items[HASHSIZE];
int addr;
addr=Hashsearch(ht,x);
if(addr>0){
ht[addr].data.key++;
x=ht[addr].data;
}
else{
addr=-addr;
ht[addr].data=x;
}
WriteBoard(filename,x,addr);
printf("\n Ok \n\n");
}
void DispVote(HashTable ht,DataType x){
//x为歌手
int addr;
addr=Hashsearch(ht,x);
if(addr>=0);
printf("\n\n歌手%S的票数为[%d]\n\n",ht[addr].data.name,ht[addr].data.key);
else printf("\n没有你查找的歌手") ;
}
void DispSong(HashTable ht,DataType x){
//x 歌手
int addr= Hashsearch(ht,x);
if(addr>=0)
printf("\n\n歌手%S的票数为[%s]\n\n",ht[addr].data.name,ht[addr].data.song);
else printf("\n没有你查找的歌手");
}
int HashFunc(char key[]){
//k歌手
int addr=0,i=0;
while(key[][i]!='\0'){addr=(int)key[i];i++;
}
return addr%HASHSIZE;
}
int ReadBoard(char filename[],DataType items[]){
//items为返回读取内容
FILE*fp;
int n=0;
HashItem hi[HASHSIZE] ;
fp=fopen(filename,"rb");
if(fp==NULL){printf("不能打开文件");return-1;
}
while(!feof(fp)){
fread(&hi[n],sizeof(HashItem),1,fp);
itemsn[n]=hi[n].data;
n++;
}
fclose(fp);
return n;
}
int WriteBoard(char filename[],DataType x,long offset){
//x为文件写入内容,off为文件的偏移量
FILE*fp;
HashItem item;
item.data=x;
fp=fopen(filename,"r+b");
if(fp==NULL){printf("不能打开"); return 0;
}
fseek(fp,offset*sizeof(HashItem),1,fp);
fcolse(fp);
return 1;
}
int Hashsearch(HashTable ht,DataType x){
int addr;
addr=HashFunc(x.pinyin);
while(strcmp(ht[addr].data.pinyin,)) return addr;
else return -addr;
}
int main(int argc,char*argv[]){
HashTable ht;
int choice=0;
DataType x;
char filename[]=文件地址;
CreateBoard(ht,filename) ;
do{
printf("****************************************\n");
printf("* 流行歌手排行榜 *\n");
printf("*--------------------------------------*\n");
printf("* 1.为喜欢的歌手投票 *\n");
printf("* 2.查看上榜歌手的主打歌 *\n");
printf("* 3.查查看歌手票数 *\n");
printf("* 0.退出 *\n");
printf("****************************************\n");
printf("输入选择序号(0.1.2.3): ");
scanf("%d",&num);
if(num<0||num>3) continue;
switch(num){
case1:
//投票
flushall();
printf("\n请输入歌手名:"); gets(x.nmae);
printf("\输入歌手拼音名"); gets(x.song); x.key=1;
Vote(ht,filename,x); brak;
case2:
//查看歌曲
flushall();
printf("\输入歌手拼音名"); gets(x.pinyin);
DispSong(ht,x); break;
case3:
//查看票数
printf("\输入歌手拼音名"); gets(x.pinyin);
DispVote(ht,x); break;
case0:
exit(0) ;
}
}while(1);
return 0;
}