一些关于哈希表的问题------插队买票
问题就是我把哈希表里面的元素拿出来的时候为什么空的字符会是??就是排队的人那里
程序代码:#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define max 100
#define null_key -1
#define del_key -2
typedef struct Hashtable
{
char key;
int count;
int frd;
} hashtable[max];
//查找元素
int search(hashtable ha, int p, char k)
{
int i=0, adr;
adr=k%p;
while(ha[adr].key!=null_key && ha[adr].key!=k)
{
i++;
adr=(adr+1)%p;
}
if(ha[adr].key==k)
return adr;
else
return -1;
}
//插入元素
void insert(hashtable ha, int &n, char k, int p, int f)
{
int i,adr;
adr=k%p;
if(ha[adr].key==null_key || ha[adr].key==del_key)
{
ha[adr].key=k;
ha[adr].count=1;
ha[adr].frd=f;
}
else
{
i=1;
do
{
adr=(adr+1)%p;
i++;
} while(ha[adr].key!=null_key && ha[adr].key!=del_key);
ha[adr].key=k;
ha[adr].count=i;
ha[adr].frd=f;
}
n++;
}
//建表
void create(hashtable ha, char x[], int n, int m, int p,int f[])
{
int i,n1=0;
for(i=0; i<m; i++)
{
ha[i].key=null_key;
ha[i].count=0;
ha[i].frd=0;
}
for(i=0; i<n; i++)
{
insert(ha,n1,x[i],p,f[i]);
}
}
//输出元素
void disp(hashtable ha,int m)
{
int i;
printf("排队的序列:\t");
for (i=0;i<m;i++)
printf(" %3d",i);
printf("\n排队的人:\t");
for (i=0;i<m;i++)
if (ha[i].key==null_key || ha[i].key==del_key)
printf(" ");
else
printf(" %3c",ha[i].key);
printf("\n排队人的关系:\t");
for (i=0;i<m;i++)
if (ha[i].key==null_key || ha[i].key==del_key)
printf(" ");
else
printf(" %3d",ha[i].frd);
printf(" \n");
}
void main()
{
int n=10; //n表示元素个数
int m=13; //m表示数组空间
int p=13; //求余的除数
int r=1; //r表示朋友关系
char k='n'; //插入的朋友
int a[max][2]; //用来排队的数组
int len=0; //记录排队的人数
int adr=0; //记录查找后返回的地址
int tmp; //记录找到朋友的位置
int i;
char x[]={'a','b','c','d','e','f','g','h','i','j'};
int f[]={1,1,2,3,4,4,4,4,5,5};
hashtable ha;
struct Hashtable *q=ha;
create(ha, x, n, m, p, f);
disp(ha, m);
//一开始的排队
for (i=0; i<m; i++)
{
if(ha[i].key!=null_key )
{
a[i][0]=ha[i].key;
a[i][1]=ha[i].frd;
len++;
}
}
printf("排队的人数 %d\n", len);
for(i=0; i<13; i++)
{
printf("排队的人 %c ", a[i][0]);
}
printf("\n");
//开始插队
insert(ha, n, k, p, r); //先把插队的人放进哈希表里面
adr=search(ha, p, k); //找到插队的人
printf("在哈希表的地址为 %d\n", adr);
for(i=0; i<len; i++) //在队伍中找到朋友的位置
{
if(a[i][1]==ha[adr].frd && a[i+1][1]!=ha[adr].frd)
break;
}
tmp=i;
for(i=13; i>tmp; i--) //找到朋友后朋友后移
{
a[i][0]=a[i-1][0];
a[i][1]=a[i-1][1];
}
a[tmp+1][0]=k;
a[tmp+1][1]=r;
len++;
for(i=0; i<14; i++)
{
printf("%c ", a[i][0]);
}
printf("\n");
//出队
for(i=0; i<12; i++)
{
a[i][0]=a[i+1][0];
a[i][1]=a[i+1][1];
}
a[13][0]=null_key;
a[13][1]=null_key;
a[12][0]=null_key;
a[12][1]=null_key;
for(i=0; i<13; i++)
{
printf("%c ", a[i][0]);
}
}






