{j=1;printf(“\\n”);
while(h[j]!=null) // 设哈希表初始值为null
{if(ord(h[j])==i)// ord()取关键字第一字母在字母表中的序号 printf(“%s”,h[j]);j=(j+1)% n; }}}
(2)int ASLHash(rectype h[ ])
// 求链地址解决冲突的哈希表查找不成功时的平均查找长度 {int i,j;count=0;//记查找不成功的总的次数
LinkedList p; for(i=0;i≤26;i++)
{p=h[i];j=1;//按我们约定,查找不成功指到空指针为止。 while(p!=null){j++;p=p->next;} count+=j; }
return (count/26.0); }
24.[题目分析]非零元素个数是100,负载因子取0.8,表长125左右,取p为127,散列地址为0到126。哈希函数用H(k)=(3*i+2*j) % 127,i,j为行值和列值。 #define m 127 typedef struct
{int i,j;datatype v;}triple; void CreatHT(triple H[m])
//100个非零元素生成稀疏矩阵的哈希表,表中元素值均初始化为0。 {for(k=0;k<100;k++)
{scanf(&i,&j,&val);//设元素值为整型 h=(3*i+2*j)% m; //计算哈希地址
while(HT[h].v!=0)) h=(h+1) % m; //线性探测哈希地址 HT[h].i=i;HT[h].j=j;HT[h].v=val; //非零元素存入哈希表 }
}//算法CreatHT结束
datatype Search(triple HT[m],int i,int j)
//在哈希表中查找下标为i,j的非零元素,查找成功返回非零元素,否则返回零值。 {int h=(3*i+2*j) % m;
while ((HT[h].i!=i || HT[h].j!=j) && HT[h].v!=0) h=(h+1)% m; return (HT[h].v); }//Search
25.[题目分析] 本题哈希函数H(key),用线性探测解决冲突,空单元用EMPTY,删除标记用DELETED,占用单元用INUSE,其它均符合哈希表标准操作。 (1)int Search(rectype HT[],int m,datatype key)
//在长度为m的哈希表HT中查找关键字key,若查找成功,返回true,否则返回false。
{i=H(key); // 计算哈希地址
if(HT[i]==EMPTY)return (false); //查找失败 else if(HT[i]== key)return (true); else {j=(i+1)% m; //形成探测序列 while(j!=i) //至多循环哈希表长
{if(HT[j]==key) return (true); //查找成功 else if(HT[j]==EMPTY)return (false);//查找失败
j=(j+1)% m;
}
return (false);//查遍哈希表,未查到给定关键字key
}//else
//结束Search
(2)int Insert(rectype HT[],int m,datatype key) //在长为m的哈希表中插入关键字key {i=H(key);//计算哈希地址
if(HT[i]==EMPTY || HT[i]==DELETED) //若HT[i]空或删除标记。 {HT[i]=key;return (true);} //插入成功 else //探测插入元素的散列地址 {j=(i+1)% m; while(j!=i)
{if(HT[j]==EMPTY || HT[j]==DELETED)
{HT[j]=key;return (true);} //找到合适哈希地址,插入 j=(j+1)%m; }
return (false);//无空闲哈希空间,插入失败 }
}//结束Insert
(3)int Delete(rectype HT[],int m,datatype key) //在长为m的哈希表HT中,删除关键字key
{i=H(key); //计算哈希地址
if(HT[i]==key)//查到关键字为key的哈希地址
{HT[i]=DELETED;return (true);} //置删除标记。 else //形成哈希探测地址,查找关键字key
{j=(i+1)% m;
while(j!=i)
{if(HT[j]==EMPTY) return (false); //无关键字key else if(HT[j]==key){ HT[j]==DELETED ;return (true);}
j=(j+1)% m;
}
return (false);//表中无关键字key }//else
}//算法Delete结束 26.#define m 11 typedef struct node
{datatype key; //关键字
struct node *next;//链指针 }Lnode,*LinkedList;
typedef datatype int;
typedef struct node *HLK; void Creat(HLK HT[m])
//用链地址法解决冲突,构造散列表,散列函数用H(key)=key % 11
{for(i=0;i for(i=0;i p=(LNode*)malloc(sizeof (LNode)); p->key=x;p->next=HT[j];HT[j]=p;//将插入结点链入同义词表 } }//Creat 查找成功时的平均查找长度ASL=12/9。 27.[题目分析] 本题实质上是排序题,因涉及到顺序表和索引表而放在这里。顺序表无序,索引表有序。由顺序表中的关键字及其下标地址组成索引表中的一项。顺序表有m个记录,索引表应有m项。建立索引表宜采用“直接插入排序”,这样才能在顺序表有序时,算法复杂度达到最好O(m)。 #define m 顺序表中记录个数 typedef struct node {keytype key;//关键字 int adr; //该关键字在顺序表中的下标 }idxnode; //索引表的一项 typedef struct node {keytype key; //关键字 anytype other;//记录中的其它数据 }datatype void IndexT(idxnode index[m+1],datatyp seq[m+1]) //给有个m记录的顺序表seq建立索引表index {index[1].key=seq[1].key; index[1].adr=1; for (i=2,i<=m,i++) {j=i-1; index[0].key=seq[i].key; //监视哨 while(index[j].key {index[j+1]=index[j]; j--;} index[j+1].key=index[0].key; //关键字放入正确位置 index[j+1].adr=i; //第i个记录的下标 } }//IndexT