当前位置:编程学习 > C/C++ >>

哈希表的实例

print?#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <conio.h>  
#define Size 11  
typedef struct{ 
 char name[30]; 
    char address[20]; 
 //float  num;  
 char num[30]; 
 int c;//统计比较次数  
}record; 
typedef struct{ 
 record data[Size]; 
 int count; 
 int size; 
}Hashtable; 
void init(Hashtable &h) 

 for(int i=0;i<Size;i++) 
 {h.data[i].num[0]=0; 
 h.data[i].c=0;}//!  
 h.size=Size; 
 h.count=0; 

int exchange(char str[]) 

 int i,n,sum=0; 
 n=strlen(str); 
 for(i=0;i<n;i++) 
  sum=sum+str[i]-'0'; 
 return sum; 

int HashSearch1(Hashtable &h,char *str,int &p) //线性探测  

 int i,j,k=exchange(str); 
 j=k%Size; 
 if(strcmp(str,h.data[j].num)==0) 
 { 
  return j; 
  h.data[j].c++;//!  
 }//没有发生冲突,比较一次查找成功  
 if(h.data[j].num[0]==0) 
 { 
  p=j; 
  return 0; 
 } 
 else 
 { 
  h.data[j].c++;//!  
  i=(j+1)%Size;//第1次解决冲突  
  while(h.data[i].num[0]!=0&&i!=j)  
  {    
   if(strcmp(str,h.data[i].num)==0) 
   { 
    h.data[j].c++;//!  
    return i; 
   }//发生冲突,比较若干次查找成功  
   i=(i+1)%Size;    //向后探测一个位置  
  } 
  if (i==j) 
   printf("溢出\n"); 
  else       
  { 
   p=i; 
   h.data[j].c++;//!  
   return 0;//查找不成功  
  } 
 } 

int HashSearch2(Hashtable &h,char *str,int &p) 

 int i,j,t=1,d=1; 
 int k=exchange(str); 
 j=k%Size; 
 if(strcmp(str,h.data[j].num)==0) 
 {  
  h.data[j].c++;//!  
     return j; 
 }  //没有发生冲突,比较一次查找成功  
 if(h.data[j].num[0]==0) 
 { 
  p=j; 
  return 0; 
 } 
 else 
 { 
  i=(j+d)%Size;//第1次解决冲突  
  while(h.data[i].num[0]!=0&&i!=j)  
  {   
      if(strcmp(str,h.data[i].num)==0) 
   { 
        h.data[j].c++;//!  
        return i; 
   } 
   if(t>0) 
    t=-1*d*d; 
   else 
   { 
    d=d+1; 
    t=-1*d*d ; 
   } 
   i=(j+t+Size)%Size;    //探测一个新的位置  
   while(i<0) 
   { 
    h.data[j].c++;//!  
    i=(i+Size)%Size;      
  } } 
      if (i==j) 
       printf("溢出\n"); 
      else 
   { 
       p=i; 
       h.data[j].c++;//!  
       return 0;//查找不成功时插入  
   } 
   
 } 

void disp(Hashtable h) 

 printf("电话簿中所有电话记录如下:\n"); 
 for(int i=0;i<Size;i++) 
 { 
  if(h.data[i].num[0]) 
   printf("-.%7s s     %s\n",i,h.data[i].name,h.data[i].address,h.data[i].num); 
 } 

//  
int compasl(Hashtable h) 

 int sum=0; 
 for(int i=0;i<Size;i++) 
  sum+=h.data[i].c; 
 return sum; 

int menu() 

 int num; 
 while(1) 
 { 
  system("cls"); 
  printf("\n---------电话管理系统模拟(哈希表实现)---------\n"); 
  printf("\n**********************************************\n"); 
  printf("\n  0.退出电话簿             1.已存在的电话记录  \n"); 
  printf("\n  2.添加记录到电话簿1      3.添加记录到电话簿2 \n"); 
  printf("\n  4.查找电话簿1通讯人      5.查找电话簿2通讯人 \n"); 
  printf("\n  6.电话簿1查找ASL         7.电话簿2查找ASL    \n"); 
  printf("\n**********************************************\n"); 
  printf("\n----------------------------------------------\n"); 
  printf("\n请您选择操作(0--7):\n"); 
  scanf("%d",&num); 
  if(num<0||num>7) 
   printf("您的选择有误,请重新选择!\n"); 
  break; 
 } 
 return num; 

void main() 

 Hashtable h1,h2; 
 int i,j,n,a,m,flag=1; 
 char num[30]; 
 char name[30],address[50]; 
 init(h1);init(h2); 
 while(1) 
 { 
  j=menu(); 
  switch(j){ 
  case 0:printf("(@ @) 谢谢使用,再见! (^ ^)\n"); 
   exit(0); 
   getch(); 
   break; 
  case 1: 
   if(flag){ 
   FILE *fp; 
   if((fp=fopen("1234.txt","r+"))==NULL) 
   { 
    puts("成功导入电话记录!"); 
    exit(0); 
   } 
         fscanf(fp,"%d",&n); 
         for(i=0;i<n;i++) 
   { 
          fscanf(fp,"%s%s%s",name,address,num); 
             HashSearch1(h1,num,a); 
       
    

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,