顺序表基本运算算法(seqlist.cpp)
#include <stdio.h>
#define MAXL 100
typedef int KeyType;
typedef char InfoType;
typedef struct
{ KeyType key;
InfoType data;
} RecType;
void CreateList(RecType R[],KeyType keys[],int n)
{
for (int i=0;i<n;i++)
R[i].key=keys[i];
}
void DispList(RecType R[],int n)
{
for (int i=0;i<n;i++)
printf("%d ",R[i].key);
printf("\n");
}
顺序查找算法
#include "seqlist.cpp"
int SeqSearch(RecType R[],int n,KeyType k)
{
int i=0;
while (i<n && R[i].key!=k)
i++;
if (i>=n)
return 0;
else
return i+1;
}
int SeqSearch1(RecType R[],int n,KeyType k)
{
int i=0;
R[n].key=k;
while (R[i].key!=k)
i++;
if (i==n)
return 0;
else
return i+1;
}
int main()
{
int n=10;
RecType R[MAXL];
KeyType a[]={2,3,1,8,5,4,9,0,7,6},k=9;
CreateList(R,a,n);
printf("查找表:"); DispList(R,n);
printf("R[%d]=%d\n",SeqSearch(R,n,k),k);
return 1;
}
开放地址法构造的哈希表的运算算法
#include <stdio.h>
#define MaxSize 100
#define NULLKEY -1
#define DELKEY -2
typedef int KeyType;
typedef struct
{
KeyType key;
int count;
} HashTable;
void InsertHT(HashTable ha[],int &n,int m,int p,KeyType k)
{
int i,adr;
adr=k % p;
if (ha[adr].key==NULLKEY || ha[adr].key==DELKEY)
{
ha[adr].key=k;
ha[adr].count=1;
}
else
{
i=1;
do
{
adr=(adr+1) % m;
i++;
} while (ha[adr].key!=NULLKEY && ha[adr].key!=DELKEY);
ha[adr].key=k;
ha[adr].count=i;
}
n++;
}
void CreateHT(HashTable ha[],int &n,int m,int p,KeyType keys[],int n1)
{
for (int i=0;i<m;i++)
{
ha[i].key=NULLKEY;
ha[i].count=0;
}
n=0;
for (i=0;i<n1;i++)
InsertHT(ha,n,m,p,keys[i]);
}
void SearchHT(HashTable ha[],int m,int p,KeyType k)
{
int i=1,adr;
adr=k % p;
while (ha[adr].key!=NULLKEY && ha[adr].key!=k)
{
i++;
adr=(adr+1) % m;
}
if (ha[adr].key==k)
printf("成功:关键字%d,比较%d次\n",k,i);
else
printf("失败:关键字%d,比较%d次\n",k,i);
}
bool DeleteHT(HashTable ha[],int &n,int m,int p,KeyType k)
{
int adr;
adr=k % p;
while (ha[adr].key!=NULLKEY && ha[adr].key!=k)
adr=(adr+1) % m;
if (ha[adr].key==k)
{
ha[adr].key=DELKEY;
return true;
}
else
return false;
}
void ASL(HashTable ha[],int n,int m,int p)
{
int i,j;
int succ=0,unsucc=0,s;
for (i=0;i<m;i++)
if (ha[i].key!=NULLKEY)
succ+=ha[i].count;
printf(" 成功情况下ASL(%d)=%g\n",n,succ*1.0/n);
for (i=0;i<p;i++)
{
s=1; j=i;
while (ha[j].key!=NULLKEY)
{
s++;
j=(j+1) % m;
}
unsucc+=s;
}
printf(" 不成功情况下ASL(%d)=%g\n",n,unsucc*1.0/p);
}
void DispHT(HashTable ha[],int n,int m,int p)
{
int i,j;
int succ=0,unsucc=0,s;
printf("哈希表:\n");
printf(" 哈希表地址:\t");
for (i=0;i<m;i++)
printf(" %3d",i);
printf(" \n");
printf(" 哈希表关键字:\t");
for (i=0;i<m;i++)
if (ha[i].key==NULLKEY)
printf(" ");
else
printf(" %3d",ha[i].key);
printf(" \n");
printf(" 探测次数:\t");
for (i=0;i<m;i++)
if (ha[i].key==NULLKEY)
printf(" ");
else
printf(" %3d",ha[i].count);
printf(" \n");
ASL(ha,n,m,p);
}
int main()
{
int keys[]={16,74,60,43,54,90,46,31,29,88,77};
int n,m=13,p=13,k;
HashTable ha[MaxSize];
printf("(1)创建哈希表\n"); CreateHT(ha,n,m,p,keys,11);
printf("(2)显示哈希表:\n"); DispHT(ha,n,m,p);
k=29;
printf("(3)查找"); SearchHT(ha,m,p,k);
k=31;
printf("(4)删除:关键字%d\n",k);
DeleteHT(ha,n,m,p,k);
printf("(5)显示哈希表:\n"); DispHT(ha,n,m,p);
printf("(6)查找"); SearchHT(ha,m,p,k);
printf("(7)插入:关键字%d\n",k);
InsertHT(ha,n,m,p,k);
printf("(8)显示哈希表:\n"); DispHT(ha,n,m,p);
printf("\n");
return 1;
}
拉链法构造的哈希表的运算算法
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef int KeyType;
typedef struct node
{
KeyType key;
struct node *next;
} NodeType;
typedef struct
{
NodeType *firstp;
} HashTable;
void InsertHT(HashTable ha[],int &n,int p,KeyType k)
{
int adr;
adr=k % p;
NodeType *q;
q=(NodeType *)malloc(sizeof(NodeType));
q->key=k;
q->next=NULL;
if (ha[adr].firstp==NULL)
ha[adr].firstp=q;
else
{
q->next=ha[adr].firstp;
ha[adr].firstp=q;
}
n++;
}
void CreateHT(HashTable ha[],int &n,int m,int p,KeyType keys[],int n1)
{
for (int i=0;i<m;i++)
ha[i].firstp=NULL;
n=0;
for (i=0;i<n1;i++)
InsertHT(ha,n,p,keys[i]);
}
void SearchHT(HashTable ha[],int p,KeyType k)
{
int i=0,adr;
adr=k % p;
NodeType *q;
q=ha[adr].firstp;
while (q!=NULL)
{
i++;
if (q->key==k)
break;
q=q->next;
}
if (q!=NULL)
printf("成功:关键字%d,比较%d次\n",k,i);
else
printf("失败:关键字%d,比较%d次\n",k,i);
}
bool DeleteHT(HashTable ha[],int &n,int m,int p,KeyType k)
{
int adr;
adr=k % p;
NodeType *q,*preq;
q=ha[adr].firstp;
if (q==NULL)
return false;
if (q->key==k)
{
ha[adr].firstp=q->next;
free(q);
n--;
return true;
}
preq=q; q=q->next;
while (q!=NULL)
{
if (q->key==k)
break;
q=q->next;
}
if (q!=NULL)
{
preq->next=q->next;
free(q);
n--;
return true;
}
else return false;
}
void ASL(HashTable ha[],int n,int m)
{
int succ=0,unsucc=0,s;
NodeType *q;
for (int i=0;i<m;i++)
{
s=0;
q=ha[i].firstp;
while (q!=NULL)
{
q=q->next;
s++;
succ+=s;
}
unsucc+=s;
}
printf(" 成功情况下ASL(%d)=%g\n",n,succ*1.0/n);
printf(" 不成功情况下ASL(%d)=%g\n",n,unsucc*1.0/m);
}
void DispHT(HashTable ha[],int n,int m)
{
int succ=0,unsucc=0,s;
NodeType *q;
for (int i=0;i<m;i++)
{
s=0;
printf(" %3d:\t",i);
q=ha[i].firstp;
while (q!=NULL)
{
printf("%4d",q->key);
q=q->next;
s++;
succ+=s;
}
unsucc+=s;
printf("\n");
}
printf(" 成功情况下ASL(%d)=%g\n",n,succ*1.0/n);
printf(" 不成功情况下ASL(%d)=%g\n",n,unsucc*1.0/m);
}
void DestroyHT(HashTable ha[],int m)
{
int i;
NodeType *q,*preq;
for (i=0;i<m;i++)
{
q=ha[i].firstp;
while (q!=NULL)
{
preq=q; q=q->next;
free(preq);
}
}
}
int main()
{
int keys[]={16,74,60,43,54,90,46,31,29,88,77};
int n,m=13,p=13,k=29;
HashTable ha[MaxSize];
printf("(1)创建哈希表\n"); CreateHT(ha,n,m,p,keys,11);
printf("(2)显示哈希表:\n"); DispHT(ha,n,m);
printf("(3)查找"); SearchHT(ha,p,k);
k=77;
printf("(4)删除:关键字%d\n",k);
DeleteHT(ha,n,m,p,k);
printf("(5)显示哈希表:\n"); DispHT(ha,n,m);
printf("(6)查找"); SearchHT(ha,p,k);
printf("(7)插入:关键字%d\n",k);
InsertHT(ha,n,p,k);
printf("(8)显示哈希表:\n"); DispHT(ha,n,m);
printf("\n");
DestroyHT(ha, m);
return 1;
}