一些关于哈希表的问题------插队买票
问题就是我把哈希表里面的元素拿出来的时候为什么空的字符会是??就是排队的人那里程序代码:
#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]); } }