帮我看看,我说不哪错了,主要是标记那里
程序代码:
#include"stdio.h" #include"stdlib.h" #define defaultSize 11 typedef enum KindOfState { Active, Blank, Deleted }KindOfState; typedef int KeyType; typedef struct{ KeyType key; }HElemType; typedef struct{ int divisor;//除数 int n,m;//已用地址数 ,最大地址数 HElemType *data;//散列表存储数组 KindOfState *state;//状态数组 int *cout;//探索次数数组 }HashTable; void initHashTable(HashTable *HT,int d) // d为不要大于m 但是接近于m的质数 { int i=0; HT->divisor=d; HT->m=defaultSize; HT->n=0; HT->data=(HElemType*)malloc(HT->m*sizeof(HElemType)); HT->state=(KindOfState*)malloc(HT->m*sizeof(KindOfState)); HT->cout=(int*)malloc(HT->m*sizeof(int)); for(i=0;i<HT->m;i++) { HT->state[i]=Blank; HT->cout[i]=0; } } //可加入 LInearProde 文件 int FindPos(HashTable &HT,KeyType x,int &i,int &num) { i=x%HT.divisor;num=0;//num表示探索次数 if(HT.state[i]==Active&&HT.data[i].key==x) { num++; return 1; } else { int j=i; do{ num++; if(HT.state[i]!=Active) { return 1; } else if(HT.state[i]!=Active) { return 0;//找到空位 } i=(i+1)%HT.m;//向后探索 ,这种方式 能够最大程度的利用表 }while(j!=i);//i===j表满 i=-1; return 0; } } int Insert(HashTable &HT,HElemType elem) { int i,num,flag; flag=FindPos(HT,elem.key,i,num); if(flag) { printf("表中已有此元素,不能插入\n"); return 0; } else if(i==-1) { printf("表已满\n"); return 0; } HT.data[i]=elem; HT.state[i]=Active; HT.cout[i]=num; HT.n++; } void CreatrHashTable(HashTable &HT,KeyType A[],int n)//这里(1) { int i; HElemType Elem; for(i=0;i<n;i++) { Elem.key=A[i]; Insert(HT,Elem); } } void PrintfHashTable(HashTable&HT) { int i; for(i=0;i<HT.m;i++) if(HT.state[i]==Active) printf("[%d]%d[%d]\n",i,HT.data[i].key,HT.cout[i]); } int main() { KeyType A[8]={37,25,14,36,48,68,57,11}; HashTable t; initHashTable(&t,11); CreatrHashTable(&t,A,8); //这里 (2) return 0; }