数据结构 第八章 查找表 下载本文

{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