fork download
  1. /*
  2.   [ プログラム ] C/C++の宿題片付けます 163代目
  3.   http://t...content-available-to-author-only...h.net/test/read.cgi/tech/1361082416/302
  4.   302 名前:デフォルトの名無しさん []: 2013/02/24(日) 17:22:25.08
  5.   [1] 授業単元: プログラミング
  6.   [2] 問題文(含コード&リンク):
  7.   ハッシュ法を用いて作成してください。
  8.   1.追加 2.削除 3.探索 4.ダンプ 5.終了
  9.   処理を入力してください。:
  10.   仕様
  11.   表は00~12までです。
  12.   宜しくお願いします
  13.   [3.3] 言語: C
  14.   [4] 期限: 2013年2月25日まで]
  15. */
  16. /*
  17.   [ プログラム ] C/C++の宿題片付けます 163代目
  18.   http://t...content-available-to-author-only...h.net/test/read.cgi/tech/1361082416/335
  19.   335 名前:デフォルトの名無しさん []: 2013/02/24(日) 20:17:28.55
  20.   >>305
  21.   うまくいかないところは
  22.   ・探索
  23.   ・削除
  24.   15を追加すると3に入る。
  25.   削除したいときに、”何番を削除しますか?”で15ではなく3で削除できるようにすること
  26.   宜しくお願いします。
  27. */
  28. #include <stdio.h>
  29. #include <stdlib.h>
  30. #include <string.h>
  31. #define NO 1
  32. #define NAME 2
  33.  
  34. typedef enum {
  35. Occupied, Empty, Deleted
  36. } Status;
  37.  
  38. typedef struct {
  39. int no;
  40. char name[10];
  41. } Data;
  42.  
  43. typedef struct {
  44. Data data;
  45. Status stat;
  46. } Bucket;
  47.  
  48. typedef struct {
  49. int size;
  50. Bucket *table;
  51. } Hash;
  52.  
  53. int hash(int key)
  54. {
  55. return (key % 13);
  56. }
  57.  
  58. int rehash(int key)
  59. {
  60. return ((key + 1) % 13);
  61. }
  62.  
  63. void SetBucket(Bucket * n, Data x, Status stat)
  64. {
  65. n->data = x;
  66. n->stat = stat;
  67. }
  68.  
  69. int InitHash(Hash * h, int size)
  70. {
  71. int i;
  72. h->size = 0;
  73. if ((h->table = calloc(size, sizeof(Bucket))) == NULL) {
  74. return 0;
  75. }
  76. h->size = size;
  77. for (i = 0; i < size; i++) {
  78. h->table[i].stat = Empty;
  79. }
  80. return 1;
  81. }
  82.  
  83. void TermHash(Hash * h)
  84. {
  85. free(h->table);
  86. }
  87.  
  88. Bucket *SearchBucket(Hash * h, Data * x)
  89. {
  90. int i;
  91. int key = hash(x->no);
  92. Bucket *p = &h->table[key];
  93. for (i = 0; p->stat != Empty && i < h->size; i++) {
  94. if (p->stat == Occupied && p->data.no == x->no)
  95. return p;
  96. key = rehash(key);
  97. p = &h->table[key];
  98. }
  99. int InsertBucket(Hash * h, Data * x) {
  100. int i;
  101. int key = hash(x->no);
  102. Bucket *p = &h->table[key];
  103. if (SearchBucket(h, x))
  104. return 1;
  105. for (i = 0; i < h->size; i++) {
  106. if (p->stat == Empty || p->stat == Deleted) {
  107. SetBucket(p, *x, Occupied);
  108. return 0;
  109. }
  110. key = rehash(key);
  111. p = &h->table[key];
  112. }
  113. return 2;
  114. }
  115. return NULL;
  116. }
  117.  
  118. int DeleteBucket(Hash * h, Data * x)
  119. {
  120. Bucket *p = SearchBucket(h, x);
  121. if (p == NULL)
  122. return 1;
  123. p->stat = Deleted;
  124. return 0;
  125. }
  126.  
  127. void DumpHash(Hash * h)
  128. {
  129. int i;
  130. for (i = 0; i < h->size; i++) {
  131. printf("%02d :", i);
  132. switch (h->table[i].stat) {
  133. case Occupied:
  134. printf("%d (%s)\n", h->table[i].data.no, h->table[i].data.name);
  135. break;
  136. case Empty:
  137. printf("--未登録--\n");
  138. break;
  139. case Deleted:
  140. printf("--削除済--\n");
  141. break;
  142. }
  143. }
  144. }
  145.  
  146. void PrintData(Data x)
  147. {
  148. printf("%d %s\n", x.no, x.name);
  149. }
  150.  
  151. Data Read(char *message, int sw)
  152. {
  153. }
  154.  
  155. int main()
  156. {
  157. int i, result, flag = 0;
  158. Hash hash;
  159. Data x;
  160. Bucket *temp;
  161. InitHash(&hash, 13);
  162. while (flag != 1) {
  163. printf("1.追加 2.削除 3.探索 4.ダンプ 5.終了\n");
  164. printf("処理を選択してください");
  165. scanf("%d", &i);
  166. switch (i) {
  167. case 1:
  168. printf("追加するデータを入力してください\n");
  169. printf("番号");
  170. scanf("%d", &x.no);
  171. printf("名前");
  172. scanf("%s", x.name);
  173. result = InsertBucket(&hash, &x);
  174. if (result != 0) {
  175. printf("追加に失敗しました(%s) \n", (result == 1) ? "登録済み" : "満杯");
  176. }
  177. break;
  178. case 2:
  179. printf("削除するデータを入力してください\n");
  180. printf("番号");
  181. scanf("%d", &x.no);
  182. result = DeleteBucket(&hash, &x);
  183. if (result == 1) {
  184. printf("その番号はありません\n");
  185. }
  186. break;
  187. case 3:
  188. printf("番号");
  189. scanf("%d", &x.no);
  190. result = DeleteBucket(&hash, &x);
  191. if (temp == NULL) {
  192. printf("探査に失敗しました\n");
  193. } else {
  194. printf("探査に成功しました\n");
  195. PrintData(temp->data);
  196. }
  197. break;
  198. case 4:
  199. DumpHash(&hash);
  200. break;
  201. case 5:
  202. flag = 1;
  203. break;
  204. default:
  205. printf("正しい数値を入力してください\n");
  206. break;
  207. }
  208. }
  209. TermHash(&hash);
  210. return 0;
  211. }
  212.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty