fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define NO 1
  5. #define NAME 2
  6.  
  7. typedef enum{
  8. Occupied,Empty,Deleted
  9. } Status;
  10.  
  11. typedef struct{
  12. int no;
  13. char name[10];
  14. }Data;
  15.  
  16. typedef struct{
  17. Data data;
  18. Status stat;
  19. } Bucket;
  20.  
  21. typedef struct{
  22. int size;
  23. Bucket *table;
  24. } Hash;
  25.  
  26. int hash(int key){
  27. return(key%13);
  28. }
  29.  
  30. int rehash(int key){
  31. return((key+1)%13);
  32. }
  33.  
  34. void SetBucket(Bucket *n, Data x, Status stat){
  35. n->data=x;
  36. n->stat=stat;
  37. }
  38.  
  39. int InitHash(Hash *h,int size){
  40. int i;
  41. h->size = 0;
  42. if ((h->table = calloc(size, sizeof(Bucket))) == NULL) {
  43. return 0;
  44. }
  45. h->size = size;
  46. for (i = 0; i < size; i++) {
  47. h->table[i].stat = Empty;
  48. }
  49. return 1;
  50. }
  51.  
  52. void TermHash(Hash *h){
  53. free(h->table);
  54. }
  55.  
  56. Bucket *SearchBucket(Hash *h, Data *x){
  57. int i;
  58. int key = hash(x->no);
  59. Bucket *p = &h->table[key];
  60. for (i = 0; p->stat != Empty && i < h->size; i++) {
  61. if (p->stat == Occupied && p->data.no == x->no)
  62. return p;
  63. key = rehash(key);
  64. p = &h->table[key];
  65. }
  66. return NULL;
  67. }
  68.  
  69. int InsertBucket(Hash *h, Data *x){
  70. int i;
  71. int key = hash(x->no);
  72. Bucket *p = &h->table[key];
  73. if (SearchBucket(h, x))
  74. return 1;
  75. for (i = 0; i < h->size; i++) {
  76. if (p->stat == Empty || p->stat == Deleted){
  77. SetBucket(p, *x, Occupied);
  78. return 0;
  79. }
  80. key = rehash(key);
  81. p = &h->table[key];
  82. }
  83. return 2;
  84. }
  85.  
  86. int DeleteBucket(Hash *h,Data *x){
  87. Bucket *p = SearchBucket(h, x);
  88. if (p == NULL)
  89. return 1;
  90. p->stat = Deleted;
  91. return 0;
  92. }
  93.  
  94. void PrintData(Data x){
  95. printf("%d (%s)\n", x.no, x.name);
  96. }
  97.  
  98. void DumpHash(Hash *h){
  99. int i;
  100. for (i = 0; i < h->size; i++) {
  101. printf("%02d :", i);
  102. switch (h->table[i].stat) {
  103. case Occupied : PrintData(h->table[i].data);break;//////////////////
  104. case Empty : printf("--未登録--\n");break;
  105. case Deleted : printf("--削除済--\n");break;
  106. }
  107. }
  108. }
  109.  
  110. //Data Read(char *message,int sw){//////////////////
  111. //} //////////////////
  112.  
  113. int main(){
  114. int i, result, flag = 0;
  115. Hash hash;
  116. Data x;
  117. Bucket *temp;
  118. InitHash(&hash, 13);
  119. while(flag != 1) {
  120. printf("1.追加 2.削除 3.探索 4.ダンプ 5.終了\n");
  121. printf("処理を選択してください");
  122. scanf("%d", &i);
  123. switch (i) {
  124. case 1:
  125. printf("追加するデータを入力してください\n");
  126. printf("番号");
  127. scanf("%d",&x.no);
  128. printf("名前");
  129. scanf("%s", x.name);
  130. result=InsertBucket(&hash, &x);
  131.  
  132. if (result != 0) {
  133. printf("追加に失敗しました(%s) \n",(result==1) ? "登録済み":"満杯");
  134. }
  135. break;
  136. case 2:
  137. printf("削除するデータを入力してください\n");
  138. printf("番号");
  139. scanf("%d", &x.no);
  140. result = DeleteBucket(&hash,&x);
  141. if(result == 1) {
  142. printf("その番号はありません\n");
  143. }
  144. break;
  145. case 3:
  146. printf("番号");
  147. scanf("%d", &x.no);
  148. temp = SearchBucket(&hash, &x);//////////////////
  149. if (temp == NULL){
  150. printf("探査に失敗しました\n");
  151. } else {
  152. printf("探査に成功しました\n");
  153. PrintData(temp->data);
  154. }
  155. break;
  156. case 4:
  157. DumpHash(&hash);
  158. break;
  159. case 5:
  160. flag = 1;
  161. break;
  162. default:
  163. printf("正しい数値を入力してください\n");
  164. break;
  165. }
  166. }
  167. TermHash(&hash);
  168. return 0;
  169. }
  170.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty