teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

13

エラーをなくしました

2021/01/12 15:05

投稿

kyapi
kyapi

スコア5

title CHANGED
File without changes
body CHANGED
@@ -137,6 +137,7 @@
137
137
  /* 削除に成功したら1を返す */
138
138
  return 1;
139
139
  }
140
+ //構造体配列の場合、ここからの文がなくても削除できる
140
141
  /* リストの二番目以降のセルについて順番にチェックする */
141
142
  for(q=&table[h],p=q->next; p!=NULL; q=p,p=p->next){
142
143
  if(key==p->key){

12

エラーをなくしました

2021/01/12 15:05

投稿

kyapi
kyapi

スコア5

title CHANGED
File without changes
body CHANGED
@@ -4,14 +4,10 @@
4
4
  検索する関数とエラー関数で以下のエラーメッセージが発生しました。
5
5
 
6
6
  ### 発生している問題・エラーメッセージ
7
- ```ここに言語を入力
8
- コード
9
7
 
10
8
 
11
9
  ### 該当のソースコード
12
10
  ```ここに言語を入力
13
-
14
- コード
15
11
  #include <stdio.h>
16
12
  #include <stdlib.h>
17
13
 
@@ -247,6 +243,7 @@
247
243
  return 0;
248
244
  }
249
245
  ```
246
+
250
247
  3つの警告と1つのエラーが出ています
251
248
  ### 補足情報(FW/ツールのバージョンなど)
252
249
 

11

エラー処理をしました

2021/01/12 14:51

投稿

kyapi
kyapi

スコア5

title CHANGED
File without changes
body CHANGED
@@ -7,14 +7,6 @@
7
7
  ```ここに言語を入力
8
8
  コード
9
9
 
10
- Main.c:24:19: error: expression is not assignable
11
- &table[i] = NULL;
12
- ~~~~~~~~~ ^
13
- Main.c:130:18: error: expression is not assignable
14
- &table[h]=p->next;
15
- ~~~~~~~~~^
16
- 2 errors generated.
17
- ```
18
10
 
19
11
  ### 該当のソースコード
20
12
  ```ここに言語を入力
@@ -43,7 +35,7 @@
43
35
  /* BCKET_SIZEだけ繰り返して
44
36
  table[i]の中をNULLにして空にする */
45
37
  for(i=0; i<BUCKET_SIZE; i++)
46
- &table[i] = NULL;
38
+ table->next = NULL;
47
39
  }
48
40
 
49
41
  /* エラーメッセージをプリントしてexitする関数 */
@@ -144,7 +136,7 @@
144
136
  /* リストの先頭のセルが削除すべきデータか? */
145
137
  if(key==table[h].key){
146
138
  p=&table[h];
147
- &table[h]=p->next;
139
+ table->next=p->next;//&table[h]=p->next;
148
140
  free(p);
149
141
  /* 削除に成功したら1を返す */
150
142
  return 1;

10

エラー処理です

2021/01/12 14:50

投稿

kyapi
kyapi

スコア5

title CHANGED
File without changes
body CHANGED
@@ -84,6 +84,8 @@
84
84
  else
85
85
  /* 等しくなければ見つからないとしてNULLを返す*/
86
86
  return NULL;
87
+ }
88
+ return NULL;
87
89
  }
88
90
 
89
91
  /* insert -- ハッシュ表にデータを挿入する

9

インデント直しました

2021/01/12 14:38

投稿

kyapi
kyapi

スコア5

title CHANGED
File without changes
body CHANGED
@@ -4,7 +4,17 @@
4
4
  検索する関数とエラー関数で以下のエラーメッセージが発生しました。
5
5
 
6
6
  ### 発生している問題・エラーメッセージ
7
+ ```ここに言語を入力
8
+ コード
7
9
 
10
+ Main.c:24:19: error: expression is not assignable
11
+ &table[i] = NULL;
12
+ ~~~~~~~~~ ^
13
+ Main.c:130:18: error: expression is not assignable
14
+ &table[h]=p->next;
15
+ ~~~~~~~~~^
16
+ 2 errors generated.
17
+ ```
8
18
 
9
19
  ### 該当のソースコード
10
20
  ```ここに言語を入力
@@ -21,7 +31,7 @@
21
31
  double data;
22
32
  struct cell *next;
23
33
  } CELL;
24
- /* ハッシュ表の本体は構造体配列配列 */
34
+ /* ハッシュ表の本体はCELL型ポインタの配列として実現している */
25
35
  CELL table[BUCKET_SIZE];
26
36
 
27
37
  /* init --ハッシュ表を初期化する
@@ -33,7 +43,7 @@
33
43
  /* BCKET_SIZEだけ繰り返して
34
44
  table[i]の中をNULLにして空にする */
35
45
  for(i=0; i<BUCKET_SIZE; i++)
36
- table[i]=NULL;
46
+ &table[i] = NULL;
37
47
  }
38
48
 
39
49
  /* エラーメッセージをプリントしてexitする関数 */
@@ -48,10 +58,10 @@
48
58
  /* ハッシュ値を計算する関数
49
59
  パラメータとしてキーを与えると
50
60
  そのキーに対するハッシュ値(int型)を返す*/
51
- int hash(int s)
61
+ int hash(int s) //修正
52
62
  {
53
63
  /* キーの値を二乗してその中央値をとることで均等にしている */
54
- return(s % BUCKET_SIZE);
64
+   return(s % BUCKET_SIZE);
55
65
  }
56
66
 
57
67
  /* find -- ハッシュ表を探索する
@@ -66,11 +76,11 @@
66
76
  /* p=table[hash(key)]でそのキーが所属しているべきバケットから
67
77
  連結リストへのポインタを取り出している
68
78
  for文本体では連結リストをたどりながら線形探索する */
69
- for(p=table[hash(key)]; p!=NULL; p=p->next)
79
+ for(p=&table[hash(key)]; p!=NULL; p=p->next)
70
80
  /* もし2つのキーが等しければ成功 */
71
81
  if(key==p->key)
72
82
  /* キーを持つDATAへのポインタを返す */
73
- return p; //&p->data;
83
+ return p;//&p->data;
74
84
  else
75
85
  /* 等しくなければ見つからないとしてNULLを返す*/
76
86
  return NULL;
@@ -106,9 +116,9 @@
106
116
  キーの値に対応するバケットに連結する*/
107
117
  h=hash(key);
108
118
  p->key=key;
109
- p->data=data;
119
+ p->data=data;//*dataだった
110
- p->next=table[h];
120
+ p->next=&table[h];
111
- table[h]=p;
121
+ table[h]=*p;
112
122
  return 1;
113
123
  }
114
124
 
@@ -127,18 +137,18 @@
127
137
 
128
138
  h=hash(key);
129
139
  /* そのバケットは空か */
130
- if(table[h] == NULL)
140
+ if(&table[h] == NULL)
131
141
  return 0;
132
142
  /* リストの先頭のセルが削除すべきデータか? */
133
- if(key==table[h]->key){
143
+ if(key==table[h].key){
134
- p=table[h];
144
+ p=&table[h];
135
- table[h]=p->next;
145
+ &table[h]=p->next;
136
146
  free(p);
137
147
  /* 削除に成功したら1を返す */
138
148
  return 1;
139
149
  }
140
150
  /* リストの二番目以降のセルについて順番にチェックする */
141
- for(q=table[h],p=q->next; p!=NULL; q=p,p=p->next){
151
+ for(q=&table[h],p=q->next; p!=NULL; q=p,p=p->next){
142
152
  if(key==p->key){
143
153
  q->next=p->next;
144
154
  free(p);
@@ -159,10 +169,10 @@
159
169
  CELL *current = NULL;
160
170
  /* バケットの数だけ繰り返す */
161
171
  for(i = 0; i < BUCKET_SIZE; i++){
162
- if(table[i] != NULL){
172
+ if(&table[i] != NULL){
163
173
  printf("table[%d]",i);
164
174
  /* currentをi番目にしておく */
165
- current = table[i];
175
+ current = &table[i];
166
176
  /* currentがNULLでない間、次々表示させる*/
167
177
  for(; current != NULL; current = current->next){
168
178
  printf(" key=%d", (current->key));

8

インデントを直しました

2021/01/12 11:02

投稿

kyapi
kyapi

スコア5

title CHANGED
File without changes
body CHANGED
@@ -5,97 +5,75 @@
5
5
 
6
6
  ### 発生している問題・エラーメッセージ
7
7
 
8
- ```
9
- エラーメッセージ
10
- `Main.c:72:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]
11
- }
12
- ^
13
- Main.c:104:10: error: indirection requires pointer operand ('double' invalid)
14
- p->data=*data;
15
- ^~~~~
16
- Main.c:210:14: warning: incompatible pointer to integer conversion assigning to 'int' from 'double *' [-Wint-conversion]
17
- f=find(key);
18
- ^~~~~~~~~~
19
- Main.c:211:17: warning: comparison between pointer and integer ('int' and 'void *') [-Wpointer-integer-compare]
20
- if(f==NULL)
21
- ~^ ~~~~
22
- 3 warnings and 1 error generated.
23
- ``
24
8
 
25
9
  ### 該当のソースコード
26
- ```
10
+ ```ここに言語を入力
11
+
27
- ```c
12
+ コード
28
- ```#include <stdio.h>
13
+ #include <stdio.h>
29
14
  #include <stdlib.h>
30
15
 
31
16
  /* ハッシュ法の定義 */
32
17
  #define BUCKET_SIZE 10 /* ハッシュ表の大きさ */
33
18
 
34
19
  typedef struct cell{
35
- int key;
20
+ int key;
36
- double data;
21
+ double data;
37
- struct cell *next;
22
+ struct cell *next;
38
23
  } CELL;
39
- /* ハッシュ表の本体はCELL型ポインタの配列として実現している */
24
+ /* ハッシュ表の本体は構造体配列配列 */
40
- CELL *table[BUCKET_SIZE];
25
+ CELL table[BUCKET_SIZE];
41
26
 
42
27
  /* init --ハッシュ表を初期化する
43
28
  ハッシュ表に含まれる全てのパケットにNULLをセット
44
29
  ハッシュ表を使う前に必ずセットしなければならない */
45
30
  void init()
46
31
  {
47
- int i;
32
+ int i;
48
- /* BCKET_SIZEだけ繰り返して
33
+ /* BCKET_SIZEだけ繰り返して
49
- table[i]の中をNULLにして空にする */
34
+ table[i]の中をNULLにして空にする */
50
- for(i=0; i<BUCKET_SIZE; i++)
35
+ for(i=0; i<BUCKET_SIZE; i++)
51
- table[i]=NULL;
36
+ table[i]=NULL;
52
37
  }
53
38
 
54
39
  /* エラーメッセージをプリントしてexitする関数 */
55
40
  /* ポインタ(アドレス)の先のデータを読み取り専用にする */
56
41
  void fatal_error(char *s)
57
42
  {
58
- /* fprintf関数を使ってstderrで標準エラーを出力する*/
43
+ /* fprintf関数を使ってstderrで標準エラーを出力する*/
59
- fprintf(stderr,"%s\n",s);
44
+ fprintf(stderr,"%s\n",s);
60
45
  exit(1); /* 異常終了 */
61
-
46
+
62
47
  }
63
48
  /* ハッシュ値を計算する関数
64
49
  パラメータとしてキーを与えると
65
50
  そのキーに対するハッシュ値(int型)を返す*/
66
- int hash(int s)
51
+ int hash(int s)
67
52
  {
68
53
  /* キーの値を二乗してその中央値をとることで均等にしている */
69
- //int i= 0;
70
- /* *sの値が0以外の時に繰り返す
71
- C言語では、0が偽、0以外が真という意味を持つ
72
- whileは、()の中の式を見ているのではなく、その値が0かどうかだけしか見ていない。
73
- 値が0になると、偽と見なしてループを抜ける。*/
74
- //while(*s)
75
- //i += *s++;
76
- return(s % BUCKET_SIZE);
54
+ return(s % BUCKET_SIZE);
77
55
  }
78
56
 
79
- /* find -- ハッシュ表を探索する
57
+ /* find -- ハッシュ表を探索する
80
58
  探したいキーの値をパラメータとして受け取る
81
59
  成功したらキーを持つDATAへのポインタを返す
82
60
  (構造体CELL型のメンバdataへのポインタ)
83
61
  見つからなければNULLを返す */
84
-
62
+
85
- double *find(int key)
63
+ CELL *find(int key)
86
64
  {
87
- CELL *p;
65
+ CELL *p;
88
- /* p=table[hash(key)]でそのキーが所属しているべきバケットから
66
+ /* p=table[hash(key)]でそのキーが所属しているべきバケットから
89
- 連結リストへのポインタを取り出している
67
+ 連結リストへのポインタを取り出している
90
- for文本体では連結リストをたどりながら線形探索する */
68
+ for文本体では連結リストをたどりながら線形探索する */
91
- for(p=table[hash(key)]; p!=NULL; p=p->next)
69
+ for(p=table[hash(key)]; p!=NULL; p=p->next)
92
- /* もし2つのキーが等しければ成功 */
70
+ /* もし2つのキーが等しければ成功 */
93
- if(key==p->key)
71
+ if(key==p->key)
94
- /* キーを持つDATAへのポインタを返す */
72
+ /* キーを持つDATAへのポインタを返す */
95
- return &p->data;
73
+ return p; //&p->data;
96
- else
74
+ else
97
- /* 等しくなければ見つからないとしてNULLを返す*/
75
+ /* 等しくなければ見つからないとしてNULLを返す*/
98
- return NULL;
76
+ return NULL;
99
77
  }
100
78
 
101
79
  /* insert -- ハッシュ表にデータを挿入する
@@ -106,32 +84,32 @@
106
84
  キーが重複していない場合、登録に成功したら1を返す
107
85
  登録に失敗(すでに同じキーを持つデータがある)
108
86
  したら0を返す */
109
-
87
+
110
88
  int insert(int key,double data)
111
89
  {
112
- CELL *p;
90
+ CELL *p;
113
- int h;
91
+ int h;
114
-
92
+
115
- /* キーが重複していないか関数findを呼び出してチェックする
93
+ /* キーが重複していないか関数findを呼び出してチェックする
116
- 重複していたら0を返す
94
+ 重複していたら0を返す
117
- もしNULLでないなら重複していない */
95
+ もしNULLでないなら重複していない */
118
- if(find(key) != NULL)
96
+ if(find(key) != NULL)
119
- return 0;
97
+ return 0;
120
- /* もし重複していないなら関数mallocを呼び出し、
98
+ /* もし重複していないなら関数mallocを呼び出し、
121
- データを格納するセルを割り当てる */
99
+ データを格納するセルを割り当てる */
122
- if((p=malloc(sizeof(CELL))) == NULL){
100
+ if((p=malloc(sizeof(CELL))) == NULL){
123
- /* もしセルの割り当てに失敗したらプログラムの実行を中止する */
101
+ /* もしセルの割り当てに失敗したらプログラムの実行を中止する */
124
- fprintf(stderr,"out of momory\n");
102
+ fprintf(stderr,"out of momory\n");
125
- exit(2);
103
+ exit(2);
126
- }
104
+ }
127
- /* セルを割り当てたらセルにキーとデータをセットして
105
+ /* セルを割り当てたらセルにキーとデータをセットして
128
- キーの値に対応するバケットに連結する*/
106
+ キーの値に対応するバケットに連結する*/
129
- h=hash(key);
107
+ h=hash(key);
130
- p->key=key;
108
+ p->key=key;
131
- p->data=*data;
109
+ p->data=data;
132
- p->next=table[h];
110
+ p->next=table[h];
133
- table[h]=p;
111
+ table[h]=p;
134
- return 1;
112
+ return 1;
135
113
  }
136
114
 
137
115
  /* delete -- ハッシュ表から削除する
@@ -141,54 +119,54 @@
141
119
  該当するキーを持ったデータが見つからなければ何もしないで、
142
120
  0を返す */
143
121
  /* 最初にバケットを決め、
144
- そのバケットに属する連結リストに対して削除の処理を行う */
122
+ そのバケットに属する連結リストに対して削除の処理を行う */
145
123
  int delete(int key)
146
124
  {
147
- int h;
125
+ int h;
148
- CELL *p,*q;
126
+ CELL *p,*q;
149
-
127
+
150
- h=hash(key);
128
+ h=hash(key);
151
- /* そのバケットは空か */
129
+ /* そのバケットは空か */
152
- if(table[h] == NULL)
130
+ if(table[h] == NULL)
153
- return 0;
131
+ return 0;
154
- /* リストの先頭のセルが削除すべきデータか? */
132
+ /* リストの先頭のセルが削除すべきデータか? */
155
- if(key==table[h]->key){
133
+ if(key==table[h]->key){
156
- p=table[h];
134
+ p=table[h];
157
- table[h]=p->next;
135
+ table[h]=p->next;
158
- free(p);
136
+ free(p);
159
- /* 削除に成功したら1を返す */
137
+ /* 削除に成功したら1を返す */
160
- return 1;
138
+ return 1;
161
- }
139
+ }
162
- /* リストの二番目以降のセルについて順番にチェックする */
140
+ /* リストの二番目以降のセルについて順番にチェックする */
163
- for(q=table[h],p=q->next; p!=NULL; q=p,p=p->next){
141
+ for(q=table[h],p=q->next; p!=NULL; q=p,p=p->next){
164
- if(key==p->key){
142
+ if(key==p->key){
165
- q->next=p->next;
143
+ q->next=p->next;
166
- free(p);
144
+ free(p);
167
- /* 削除に成功したら1を返す */
145
+ /* 削除に成功したら1を返す */
168
- return 1;
146
+ return 1;
169
- }
147
+ }
170
- }
148
+ }
171
- /* 該当するキーを持ったデータが見つからなければ
149
+ /* 該当するキーを持ったデータが見つからなければ
172
- 削除に失敗したとして0を返す */
150
+ 削除に失敗したとして0を返す */
173
- return 0;
151
+ return 0;
174
152
  }
175
153
 
176
154
 
177
155
 
178
- static void hash_print(double data)
156
+ static void hash_print(void)
179
157
  {
180
158
  int i;
181
- struct cell *current = NULL;
159
+ CELL *current = NULL;
182
160
  /* バケットの数だけ繰り返す */
183
161
  for(i = 0; i < BUCKET_SIZE; i++){
184
162
  if(table[i] != NULL){
185
- printf("%d番目",i);
163
+ printf("table[%d]",i);
186
164
  /* currentをi番目にしておく */
187
165
  current = table[i];
188
166
  /* currentがNULLでない間、次々表示させる*/
189
- for(current=table[i]; current!= NULL; current = current->next){
167
+ for(; current != NULL; current = current->next){
190
168
  printf(" key=%d", (current->key));
191
- printf(" data=%lf", (current->data));
169
+ printf(" data=%f", (current->data));
192
170
  }
193
171
  printf("\n");
194
172
  }
@@ -197,84 +175,74 @@
197
175
 
198
176
  int main(void)
199
177
  {
178
+ /* ハッシュ表を初期化する */
179
+ init();
200
- int key; /* 数字を入力するための配列変数 */
180
+ int key; /* 数字を入力するための配列変数 */
201
- double data;
181
+ double data;
202
- int hashval; /* hash関数のハッシュ値を受け取る変数 */
182
+ int hashval; /* hash関数のハッシュ値を受け取る変数 */
203
- int mn=0; /* メニュー選択の数字を入れる変数 */
183
+ int mn=0; /* メニュー選択の数字を入れる変数 */
204
- int a; /* insert関数の戻り値を受け取る変数 */
184
+ int a; /* insert関数の戻り値を受け取る変数 */
205
- int c; /* delete関数の戻り値を受け取る変数 */
185
+ int c; /* delete関数の戻り値を受け取る変数 */
206
- //int p; /* hash_print関数の戻り値を受け取る変数 */
207
- int f; /* find関数の戻り値を受け取る変数 */
186
+ CELL *fp; /* find関数の戻り値を受け取る変数 */
208
-
209
- /* ハッシュ表を初期化する */
187
+
210
- init();
211
-
212
- printf("チェイン法をします\n");
188
+ printf("チェイン法をします\n");
213
- do{
189
+ do{
214
- printf("メニューを選んでください\n1=追加 2=検索 3=削除 4=ひょうじ 9=終了\n");
190
+ printf("メニューを選んでください\n1=追加 2=検索 3=削除 4=ひょうじ 9=終了\n");
215
- scanf("%d",&mn);
191
+ scanf("%d",&mn);
216
192
  switch(mn){
217
-
193
+
218
- case 1:
194
+ case 1:
219
- printf("8桁の数字を入力してください\n");
195
+ printf("8桁の数字を入力してください\n");
220
- scanf("%d",&key);
196
+ scanf("%d",&key);
221
- printf("データを入力してください\n");
197
+ printf("データを入力してください\n");
222
- scanf("%lf",&data);
198
+ scanf("%lf",&data);
223
-
224
- /* ハッシュ値を得る */
199
+ /* ハッシュ値を得る */
225
- hashval=hash(key);
200
+ hashval=hash(key);
226
- printf("数字=%d ハッシュ値=%d\n",n,hashval);
201
+ printf("数字=%d ハッシュ値=%d\n",key,hashval);
227
- a=insert(key,data);
202
+ a=insert(key,data);
228
- if(a==1)
203
+ if(a==1)
229
- printf("Done\n");
204
+ printf("Done\n");
230
- else
205
+ else
231
- printf("AlreadyExsits\n");
206
+ printf("AlreadyExsits\n");
232
- break;
207
+ break;
233
-
208
+
234
- case 2:
209
+ case 2:
235
- printf("検索する8桁の数字を入力してください\n");
210
+ printf("検索する8桁の数字を入力してください\n");
236
- scanf("%d",&key);
211
+ scanf("%d",&key);
237
- f=find(key);
212
+ fp=find(key);
238
- if(f==NULL)
213
+ if(fp==NULL)
239
- printf("NotExsits\n");
214
+ printf("NotExsits\n");
240
- else
215
+ else
241
- printf("検索した値=%d\n",f);
216
+ printf("key=%d 検索した値=%f\n",fp->key,fp->data);
242
217
  break;
243
-
218
+
244
219
  case 3:
245
220
  printf("削除する8桁数字を入力してください\n");
246
- scanf("%d",&key);
221
+ scanf("%d",&key);
247
- c=delete(key);
222
+ c=delete(key);
248
- if(c==1)
223
+ if(c==1)
249
- printf("Done\n");
224
+ printf("Done\n");
250
- else
225
+ else
251
- printf("NotExsits\n");
226
+ printf("NotExsits\n");
252
- break;
227
+ break;
253
-
228
+
254
- case 4:
229
+ case 4:
255
- printf("ひょうじします\n");
230
+ printf("ひょうじします\n");
256
- /* リストの要素の値を表示する */
231
+ /* リストの要素の値を表示する */
257
- hash_print(data);
232
+ hash_print();
258
233
  break;
259
-
234
+
260
- case 9:
235
+ case 9:
261
- printf("終了します\n");
236
+ printf("終了します\n");
262
- break;
237
+ break;
263
-
238
+
264
- default:
239
+ default:
265
- printf("エラー:メニューの中の数字を入力してください\n");
240
+ printf("エラー:メニューの中の数字を入力してください\n");
266
241
  }
267
242
  }while (mn !=9);
268
-
269
243
  return 0;
270
244
  }
271
-
272
- コード
273
- ```c
274
-
275
- コード
276
245
  ```
277
-
278
246
  3つの警告と1つのエラーが出ています
279
247
  ### 補足情報(FW/ツールのバージョンなど)
280
248
 

7

インデントをなおしました

2021/01/12 10:41

投稿

kyapi
kyapi

スコア5

title CHANGED
File without changes
body CHANGED
@@ -23,8 +23,9 @@
23
23
  ``
24
24
 
25
25
  ### 該当のソースコード
26
- c言語です```ここに言語を入力
26
+ ```
27
+ ```c
27
- #include <stdio.h>
28
+ ```#include <stdio.h>
28
29
  #include <stdlib.h>
29
30
 
30
31
  /* ハッシュ法の定義 */
@@ -268,7 +269,10 @@
268
269
  return 0;
269
270
  }
270
271
 
272
+ コード
273
+ ```c
271
274
 
275
+ コード
272
276
  ```
273
277
 
274
278
  3つの警告と1つのエラーが出ています

6

ソースコードの書き方を見直しました

2021/01/10 05:21

投稿

kyapi
kyapi

スコア5

title CHANGED
File without changes
body CHANGED
@@ -23,10 +23,7 @@
23
23
  ``
24
24
 
25
25
  ### 該当のソースコード
26
- c言語です
27
- ```ここに言語を入力
26
+ c言語です```ここに言語を入力
28
- ソースコード
29
- ソースコード
30
27
  #include <stdio.h>
31
28
  #include <stdlib.h>
32
29
 
@@ -256,8 +253,8 @@
256
253
  case 4:
257
254
  printf("ひょうじします\n");
258
255
  /* リストの要素の値を表示する */
259
-   hash_print(data);
256
+ hash_print(data);
260
-    break;
257
+ break;
261
258
 
262
259
  case 9:
263
260
  printf("終了します\n");
@@ -271,11 +268,9 @@
271
268
  return 0;
272
269
  }
273
270
 
271
+
274
272
  ```
275
273
 
276
- ### 試したこと
277
- エラー関数の書き方を直しました
278
-
279
274
  3つの警告と1つのエラーが出ています
280
275
  ### 補足情報(FW/ツールのバージョンなど)
281
276
 

5

エラーを減らしました

2021/01/10 05:03

投稿

kyapi
kyapi

スコア5

title CHANGED
File without changes
body CHANGED
@@ -7,21 +7,21 @@
7
7
 
8
8
  ```
9
9
  エラーメッセージ
10
- Main.c:32:20: warning: format string is not a string literal (potentially insecure) [-Wformat-security]
10
+ `Main.c:72:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]
11
- fprintf(stderr,s);
11
+ }
12
- ^
12
+ ^
13
- Main.c:32:20: note: treat the string as an argument to avoid this
13
+ Main.c:104:10: error: indirection requires pointer operand ('double' invalid)
14
+ p->data=*data;
15
+ ^~~~~
16
+ Main.c:210:14: warning: incompatible pointer to integer conversion assigning to 'int' from 'double *' [-Wint-conversion]
14
- fprintf(stderr,s);
17
+ f=find(key);
15
- ^
16
- "%s",
18
+ ^~~~~~~~~~
17
- Main.c:58:12: error: expected ';' after top level declarator
19
+ Main.c:211:17: warning: comparison between pointer and integer ('int' and 'void *') [-Wpointer-integer-compare]
18
- double data *find(int key)
20
+ if(f==NULL)
19
- ^
21
+ ~^ ~~~~
20
- ;
21
- 1 warning and 1 error generated.
22
+ 3 warnings and 1 error generated.
23
+ ``
22
24
 
23
- ```
24
-
25
25
  ### 該当のソースコード
26
26
  c言語です
27
27
  ```ここに言語名を入力
@@ -34,9 +34,9 @@
34
34
  #define BUCKET_SIZE 10 /* ハッシュ表の大きさ */
35
35
 
36
36
  typedef struct cell{
37
- int key;
37
+ int key;
38
- double data;
38
+ double data;
39
- struct cell *next;
39
+ struct cell *next;
40
40
  } CELL;
41
41
  /* ハッシュ表の本体はCELL型ポインタの配列として実現している */
42
42
  CELL *table[BUCKET_SIZE];
@@ -46,36 +46,36 @@
46
46
  ハッシュ表を使う前に必ずセットしなければならない */
47
47
  void init()
48
48
  {
49
- int i;
49
+ int i;
50
- /* BCKET_SIZEだけ繰り返して
50
+ /* BCKET_SIZEだけ繰り返して
51
- table[i]の中をNULLにして空にする */
51
+ table[i]の中をNULLにして空にする */
52
- for(i=0; i<BUCKET_SIZE; i++)
52
+ for(i=0; i<BUCKET_SIZE; i++)
53
- table[i]=NULL;
53
+ table[i]=NULL;
54
54
  }
55
55
 
56
56
  /* エラーメッセージをプリントしてexitする関数 */
57
57
  /* ポインタ(アドレス)の先のデータを読み取り専用にする */
58
58
  void fatal_error(char *s)
59
59
  {
60
- /* fprintf関数を使ってstderrで標準エラーを出力する*/
60
+ /* fprintf関数を使ってstderrで標準エラーを出力する*/
61
- fprintf(stderr,%s,s);
61
+ fprintf(stderr,"%s\n",s);
62
62
  exit(1); /* 異常終了 */
63
-
63
+
64
64
  }
65
65
  /* ハッシュ値を計算する関数
66
66
  パラメータとしてキーを与えると
67
67
  そのキーに対するハッシュ値(int型)を返す*/
68
- int hash(int *s)
68
+ int hash(int s)
69
69
  {
70
70
  /* キーの値を二乗してその中央値をとることで均等にしている */
71
- int i= 0;
71
+ //int i= 0;
72
72
  /* *sの値が0以外の時に繰り返す
73
73
  C言語では、0が偽、0以外が真という意味を持つ
74
74
  whileは、()の中の式を見ているのではなく、その値が0かどうかだけしか見ていない。
75
75
  値が0になると、偽と見なしてループを抜ける。*/
76
- while(*s)
76
+ //while(*s)
77
- i += *s++;
77
+ //i += *s++;
78
- return(i % BUCKET_SIZE);
78
+ return(s % BUCKET_SIZE);
79
79
  }
80
80
 
81
81
  /* find -- ハッシュ表を探索する
@@ -83,21 +83,21 @@
83
83
  成功したらキーを持つDATAへのポインタを返す
84
84
  (構造体CELL型のメンバdataへのポインタ)
85
85
  見つからなければNULLを返す */
86
-
86
+
87
- double data *find(int key)
87
+ double *find(int key)
88
88
  {
89
- CELL *p;
89
+ CELL *p;
90
- /* p=table[hash(key)]でそのキーが所属しているべきバケットから
90
+ /* p=table[hash(key)]でそのキーが所属しているべきバケットから
91
- 連結リストへのポインタを取り出している
91
+ 連結リストへのポインタを取り出している
92
- for文本体では連結リストをたどりながら線形探索する */
92
+ for文本体では連結リストをたどりながら線形探索する */
93
- for(p=table[hash(key)]; p!=NULL; p=p->next)
93
+ for(p=table[hash(key)]; p!=NULL; p=p->next)
94
- /* もし2つのキーが等しければ成功 */
94
+ /* もし2つのキーが等しければ成功 */
95
- if(key==p->key)
95
+ if(key==p->key)
96
- /* キーを持つDATAへのポインタを返す */
96
+ /* キーを持つDATAへのポインタを返す */
97
- return &p->data;
97
+ return &p->data;
98
- else
98
+ else
99
- /* 等しくなければ見つからないとしてNULLを返す*/
99
+ /* 等しくなければ見つからないとしてNULLを返す*/
100
- return NULL;
100
+ return NULL;
101
101
  }
102
102
 
103
103
  /* insert -- ハッシュ表にデータを挿入する
@@ -108,32 +108,32 @@
108
108
  キーが重複していない場合、登録に成功したら1を返す
109
109
  登録に失敗(すでに同じキーを持つデータがある)
110
110
  したら0を返す */
111
-
111
+
112
112
  int insert(int key,double data)
113
113
  {
114
- CELL *p;
114
+ CELL *p;
115
- int h;
115
+ int h;
116
-
116
+
117
- /* キーが重複していないか関数findを呼び出してチェックする
117
+ /* キーが重複していないか関数findを呼び出してチェックする
118
- 重複していたら0を返す
118
+ 重複していたら0を返す
119
- もしNULLでないなら重複していない */
119
+ もしNULLでないなら重複していない */
120
- if(find(key) != NULL)
120
+ if(find(key) != NULL)
121
- return 0;
121
+ return 0;
122
- /* もし重複していないなら関数mallocを呼び出し、
122
+ /* もし重複していないなら関数mallocを呼び出し、
123
- データを格納するセルを割り当てる */
123
+ データを格納するセルを割り当てる */
124
- if((p=malloc(sizeof(CELL))) == NULL){
124
+ if((p=malloc(sizeof(CELL))) == NULL){
125
- /* もしセルの割り当てに失敗したらプログラムの実行を中止する */
125
+ /* もしセルの割り当てに失敗したらプログラムの実行を中止する */
126
- fprintf(stderr,"out of momory\n");
126
+ fprintf(stderr,"out of momory\n");
127
- exit(2);
127
+ exit(2);
128
- }
128
+ }
129
- /* セルを割り当てたらセルにキーとデータをセットして
129
+ /* セルを割り当てたらセルにキーとデータをセットして
130
- キーの値に対応するバケットに連結する*/
130
+ キーの値に対応するバケットに連結する*/
131
- h=hash(key);
131
+ h=hash(key);
132
- p->key=key;
132
+ p->key=key;
133
- p->data=*data;
133
+ p->data=*data;
134
- p->next=table[h];
134
+ p->next=table[h];
135
- table[h]=p;
135
+ table[h]=p;
136
- return 1;
136
+ return 1;
137
137
  }
138
138
 
139
139
  /* delete -- ハッシュ表から削除する
@@ -146,33 +146,33 @@
146
146
  そのバケットに属する連結リストに対して削除の処理を行う */
147
147
  int delete(int key)
148
148
  {
149
- int h;
149
+ int h;
150
- CELL *p,*q;
150
+ CELL *p,*q;
151
-
151
+
152
- h=hash(key);
152
+ h=hash(key);
153
- /* そのバケットは空か */
153
+ /* そのバケットは空か */
154
- if(table[h] == NULL)
154
+ if(table[h] == NULL)
155
- return 0;
155
+ return 0;
156
- /* リストの先頭のセルが削除すべきデータか? */
156
+ /* リストの先頭のセルが削除すべきデータか? */
157
- if(key==table[h]->key){
157
+ if(key==table[h]->key){
158
- p=table[h];
158
+ p=table[h];
159
- table[h]=p->next;
159
+ table[h]=p->next;
160
- free(p);
160
+ free(p);
161
- /* 削除に成功したら1を返す */
161
+ /* 削除に成功したら1を返す */
162
- return 1;
162
+ return 1;
163
- }
163
+ }
164
- /* リストの二番目以降のセルについて順番にチェックする */
164
+ /* リストの二番目以降のセルについて順番にチェックする */
165
- for(q==table[h],p=q->next; p!=NULL; q=p,p=p->next){
165
+ for(q=table[h],p=q->next; p!=NULL; q=p,p=p->next){
166
- if(key==p->key){
166
+ if(key==p->key){
167
- q->next=p->next;
167
+ q->next=p->next;
168
- free(p);
168
+ free(p);
169
- /* 削除に成功したら1を返す */
169
+ /* 削除に成功したら1を返す */
170
- return 1;
170
+ return 1;
171
- }
171
+ }
172
- }
172
+ }
173
- /* 該当するキーを持ったデータが見つからなければ
173
+ /* 該当するキーを持ったデータが見つからなければ
174
- 削除に失敗したとして0を返す */
174
+ 削除に失敗したとして0を返す */
175
- return 0;
175
+ return 0;
176
176
  }
177
177
 
178
178
 
@@ -180,115 +180,103 @@
180
180
  static void hash_print(double data)
181
181
  {
182
182
  int i;
183
- cell_t *current = NULL;
183
+ struct cell *current = NULL;
184
184
  /* バケットの数だけ繰り返す */
185
- for(i = 0; cnt < BUCKET_SIZE; i++){
185
+ for(i = 0; i < BUCKET_SIZE; i++){
186
186
  if(table[i] != NULL){
187
- printf("table[%s]:{",i);
187
+ printf("%d番目",i);
188
188
  /* currentをi番目にしておく */
189
189
  current = table[i];
190
190
  /* currentがNULLでない間、次々表示させる*/
191
- for(; current != NULL; current = current->next){
191
+ for(current=table[i]; current!= NULL; current = current->next){
192
- printf("{%s:", (current->key));
192
+ printf(" key=%d", (current->key));
193
- printf("%s}", (current->data));
193
+ printf(" data=%lf", (current->data));
194
194
  }
195
- printf("}\n");
195
+ printf("\n");
196
196
  }
197
197
  }
198
198
  }
199
199
 
200
200
  int main(void)
201
201
  {
202
+ int key; /* 数字を入力するための配列変数 */
203
+ double data;
204
+ int hashval; /* hash関数のハッシュ値を受け取る変数 */
205
+ int mn=0; /* メニュー選択の数字を入れる変数 */
206
+ int a; /* insert関数の戻り値を受け取る変数 */
207
+ int c; /* delete関数の戻り値を受け取る変数 */
208
+ //int p; /* hash_print関数の戻り値を受け取る変数 */
209
+ int f; /* find関数の戻り値を受け取る変数 */
210
+
202
- /* ハッシュ表を初期化する */
211
+ /* ハッシュ表を初期化する */
203
- init(table);
212
+ init();
204
- char n[9]; /* 数字を入力するための配列変数 */
213
+
205
- double data;
206
- int hashval; /* hash関数のハッシュ値を受け取る変数 */
207
- int mn=0; /* メニュー選択の数字を入れる変数 */
208
- int a; /* insert関数の戻り値を受け取る変数 */
209
- int c; /* delete関数の戻り値を受け取る変数 */
210
- int p; /* hash_print関数の戻り値を受け取る変数 */
211
- int f; /* find関数の戻り値を受け取る変数 */
212
-
213
- printf("チェイン法をします\n");
214
+ printf("チェイン法をします\n");
214
- do{
215
+ do{
215
- printf("メニューを選んでください\n1=追加 2=検索 3=削除 4=ひょうじ 9=終了\n");
216
+ printf("メニューを選んでください\n1=追加 2=検索 3=削除 4=ひょうじ 9=終了\n");
216
- scanf("%d",&mn);
217
+ scanf("%d",&mn);
217
218
  switch(mn){
218
-
219
+
219
- case 1:
220
+ case 1:
220
- printf("8桁の数字を入力してください\n");
221
+ printf("8桁の数字を入力してください\n");
221
- scanf("%s",&n);
222
+ scanf("%d",&key);
222
- printf("データを入力してください\n");
223
+ printf("データを入力してください\n");
223
- scanf("%lf",&data);
224
+ scanf("%lf",&data);
225
+
224
- /* ハッシュ値を得る */
226
+ /* ハッシュ値を得る */
225
- hashval=hash(n);
227
+ hashval=hash(key);
226
- printf("数字=%d ハッシュ値=%d\n",n,hashval);
228
+ printf("数字=%d ハッシュ値=%d\n",n,hashval);
227
- a=insert(n);
229
+ a=insert(key,data);
228
- if(a==1)
230
+ if(a==1)
229
- printf("Done\n");
231
+ printf("Done\n");
230
- else
232
+ else
231
- printf("AlreadyExsits\n");
233
+ printf("AlreadyExsits\n");
234
+ break;
235
+
236
+ case 2:
237
+ printf("検索する8桁の数字を入力してください\n");
238
+ scanf("%d",&key);
239
+ f=find(key);
240
+ if(f==NULL)
241
+ printf("NotExsits\n");
242
+ else
243
+ printf("検索した値=%d\n",f);
232
244
  break;
233
-
234
- case 2:
245
+
235
- printf("検索する8桁の数字を入力してください\n");
236
- scanf("%s",&n);
237
- f=find(n);
238
- if(f==NULL);
239
- printf("NotExsits\n");
240
- else
241
- printf("検索した値=%d\n",f);
242
- break;
243
-
244
246
  case 3:
245
247
  printf("削除する8桁数字を入力してください\n");
246
- scanf("%s",&n);
248
+ scanf("%d",&key);
247
- c=delete(n);
249
+ c=delete(key);
248
- if(c==1)
250
+ if(c==1)
249
- printf("Done\n");
251
+ printf("Done\n");
250
- else
252
+ else
251
- printf("NotExsits\n");
253
+ printf("NotExsits\n");
252
- break;
254
+ break;
253
-
255
+
254
- case 4:
256
+ case 4:
255
- printf("ひょうじします\n");
257
+ printf("ひょうじします\n");
256
- /* リストの要素の値を表示する */
258
+ /* リストの要素の値を表示する */
257
- hash_print();
259
+   hash_print(data);
258
- break;
260
+    break;
259
-
261
+
260
- case 9:
262
+ case 9:
261
- printf("終了します\n");
263
+ printf("終了します\n");
262
- break;
264
+ break;
263
-
265
+
264
- default:
266
+ default:
265
- printf("エラー:メニューの中の数字を入力してください\n");
267
+ printf("エラー:メニューの中の数字を入力してください\n");
266
268
  }
267
269
  }while (mn !=9);
270
+
268
271
  return 0;
269
272
  }
270
273
 
271
274
  ```
272
275
 
273
276
  ### 試したこと
274
- void fatal_error(char *s)
275
- {
276
- /* fprintf関数を使ってstderrで標準エラーを出力する*/
277
- fprintf(stderr,s);
278
- exit(1); /* 異常終了 */
279
-
280
- }
281
- ここでエラーがでてしまうのはなぜでしょううか、EasyIDECだとエラーが出ないのにpaizaだとエラーが出てしまいます
282
- const charとか%Sつけたりもしてみたのですがだめでした
283
- typedef struct cell{
284
- int key;
285
- double data;
286
- struct cell *next;
287
- } CELL;
288
- 宣言のところでもともとDATA data  関数の所をDATA *find
289
- だったのを double dataにかえて、find関数の宣言もどのように変更すれば良いか困惑しています
290
- アドバイスお願いいたします。
277
+ エラー関数の書き方を直しました
291
278
 
279
+ 3つの警告と1つのエラーが出ています
292
280
  ### 補足情報(FW/ツールのバージョンなど)
293
281
 
294
282
  ここにより詳細な情報を記載してください。

4

2021/01/10 04:59

投稿

kyapi
kyapi

スコア5

title CHANGED
File without changes
body CHANGED
File without changes

3

2021/01/09 06:48

投稿

kyapi
kyapi

スコア5

title CHANGED
File without changes
body CHANGED
@@ -223,7 +223,7 @@
223
223
  scanf("%lf",&data);
224
224
  /* ハッシュ値を得る */
225
225
  hashval=hash(n);
226
- printf("学籍番号=%d ハッシュ値=%d\n",n,hashval);
226
+ printf("数字=%d ハッシュ値=%d\n",n,hashval);
227
227
  a=insert(n);
228
228
  if(a==1)
229
229
  printf("Done\n");

2

2021/01/09 06:48

投稿

kyapi
kyapi

スコア5

title CHANGED
File without changes
body CHANGED
@@ -202,6 +202,7 @@
202
202
  /* ハッシュ表を初期化する */
203
203
  init(table);
204
204
  char n[9]; /* 数字を入力するための配列変数 */
205
+ double data;
205
206
  int hashval; /* hash関数のハッシュ値を受け取る変数 */
206
207
  int mn=0; /* メニュー選択の数字を入れる変数 */
207
208
  int a; /* insert関数の戻り値を受け取る変数 */
@@ -218,7 +219,8 @@
218
219
  case 1:
219
220
  printf("8桁の数字を入力してください\n");
220
221
  scanf("%s",&n);
221
-
222
+ printf("データをを入力してください\n");
223
+ scanf("%lf",&data);
222
224
  /* ハッシュ値を得る */
223
225
  hashval=hash(n);
224
226
  printf("学籍番号=%d ハッシュ値=%d\n",n,hashval);

1

エラー関数の書き方を変えました

2021/01/09 06:47

投稿

kyapi
kyapi

スコア5

title CHANGED
File without changes
body CHANGED
@@ -26,6 +26,7 @@
26
26
  c言語です
27
27
  ```ここに言語名を入力
28
28
  ソースコード
29
+ ソースコード
29
30
  #include <stdio.h>
30
31
  #include <stdlib.h>
31
32
 
@@ -33,9 +34,9 @@
33
34
  #define BUCKET_SIZE 10 /* ハッシュ表の大きさ */
34
35
 
35
36
  typedef struct cell{
36
- int key;
37
+ int key;
37
- double data;
38
+ double data;
38
- struct cell *next;
39
+ struct cell *next;
39
40
  } CELL;
40
41
  /* ハッシュ表の本体はCELL型ポインタの配列として実現している */
41
42
  CELL *table[BUCKET_SIZE];
@@ -45,21 +46,21 @@
45
46
  ハッシュ表を使う前に必ずセットしなければならない */
46
47
  void init()
47
48
  {
48
- int i;
49
+ int i;
49
- /* BCKET_SIZEだけ繰り返して
50
+ /* BCKET_SIZEだけ繰り返して
50
- table[i]の中をNULLにして空にする */
51
+ table[i]の中をNULLにして空にする */
51
- for(i=0; i<BUCKET_SIZE; i++)
52
+ for(i=0; i<BUCKET_SIZE; i++)
52
- table[i]=NULL;
53
+ table[i]=NULL;
53
54
  }
54
55
 
55
56
  /* エラーメッセージをプリントしてexitする関数 */
56
57
  /* ポインタ(アドレス)の先のデータを読み取り専用にする */
57
58
  void fatal_error(char *s)
58
59
  {
59
- /* fprintf関数を使ってstderrで標準エラーを出力する*/
60
+ /* fprintf関数を使ってstderrで標準エラーを出力する*/
60
- fprintf(stderr,s);
61
+ fprintf(stderr,%s,s);
61
62
  exit(1); /* 異常終了 */
62
-
63
+
63
64
  }
64
65
  /* ハッシュ値を計算する関数
65
66
  パラメータとしてキーを与えると
@@ -67,7 +68,7 @@
67
68
  int hash(int *s)
68
69
  {
69
70
  /* キーの値を二乗してその中央値をとることで均等にしている */
70
- int i= 0;
71
+ int i= 0;
71
72
  /* *sの値が0以外の時に繰り返す
72
73
  C言語では、0が偽、0以外が真という意味を持つ
73
74
  whileは、()の中の式を見ているのではなく、その値が0かどうかだけしか見ていない。
@@ -82,21 +83,21 @@
82
83
  成功したらキーを持つDATAへのポインタを返す
83
84
  (構造体CELL型のメンバdataへのポインタ)
84
85
  見つからなければNULLを返す */
85
-
86
+
86
87
  double data *find(int key)
87
88
  {
88
- CELL *p;
89
+ CELL *p;
89
- /* p=table[hash(key)]でそのキーが所属しているべきバケットから
90
+ /* p=table[hash(key)]でそのキーが所属しているべきバケットから
90
- 連結リストへのポインタを取り出している
91
+ 連結リストへのポインタを取り出している
91
- for文本体では連結リストをたどりながら線形探索する */
92
+ for文本体では連結リストをたどりながら線形探索する */
92
- for(p=table[hash(key)]; p!=NULL; p=p->next)
93
+ for(p=table[hash(key)]; p!=NULL; p=p->next)
93
- /* もし2つのキーが等しければ成功 */
94
+ /* もし2つのキーが等しければ成功 */
94
- if(key==p->key)
95
+ if(key==p->key)
95
- /* キーを持つDATAへのポインタを返す */
96
+ /* キーを持つDATAへのポインタを返す */
96
- return &p->data;
97
+ return &p->data;
97
- else
98
+ else
98
- /* 等しくなければ見つからないとしてNULLを返す*/
99
+ /* 等しくなければ見つからないとしてNULLを返す*/
99
- return NULL;
100
+ return NULL;
100
101
  }
101
102
 
102
103
  /* insert -- ハッシュ表にデータを挿入する
@@ -107,32 +108,32 @@
107
108
  キーが重複していない場合、登録に成功したら1を返す
108
109
  登録に失敗(すでに同じキーを持つデータがある)
109
110
  したら0を返す */
110
-
111
+
111
112
  int insert(int key,double data)
112
113
  {
113
- CELL *p;
114
+ CELL *p;
114
- int h;
115
+ int h;
115
-
116
+
116
- /* キーが重複していないか関数findを呼び出してチェックする
117
+ /* キーが重複していないか関数findを呼び出してチェックする
117
- 重複していたら0を返す
118
+ 重複していたら0を返す
118
- もしNULLでないなら重複していない */
119
+ もしNULLでないなら重複していない */
119
- if(find(key) != NULL)
120
+ if(find(key) != NULL)
120
- return 0;
121
+ return 0;
121
- /* もし重複していないなら関数mallocを呼び出し、
122
+ /* もし重複していないなら関数mallocを呼び出し、
122
- データを格納するセルを割り当てる */
123
+ データを格納するセルを割り当てる */
123
- if((p=malloc(sizeof(CELL))) == NULL){
124
+ if((p=malloc(sizeof(CELL))) == NULL){
124
- /* もしセルの割り当てに失敗したらプログラムの実行を中止する */
125
+ /* もしセルの割り当てに失敗したらプログラムの実行を中止する */
125
- fprintf(stderr,"out of momory\n");
126
+ fprintf(stderr,"out of momory\n");
126
- exit(2);
127
+ exit(2);
127
- }
128
+ }
128
- /* セルを割り当てたらセルにキーとデータをセットして
129
+ /* セルを割り当てたらセルにキーとデータをセットして
129
- キーの値に対応するバケットに連結する*/
130
+ キーの値に対応するバケットに連結する*/
130
- h=hash(key);
131
+ h=hash(key);
131
- p->key=key;
132
+ p->key=key;
132
- p->data=*data;
133
+ p->data=*data;
133
- p->next=table[h];
134
+ p->next=table[h];
134
- table[h]=p;
135
+ table[h]=p;
135
- return 1;
136
+ return 1;
136
137
  }
137
138
 
138
139
  /* delete -- ハッシュ表から削除する
@@ -145,33 +146,33 @@
145
146
  そのバケットに属する連結リストに対して削除の処理を行う */
146
147
  int delete(int key)
147
148
  {
148
- int h;
149
+ int h;
149
- CELL *p,*q;
150
+ CELL *p,*q;
150
-
151
+
151
- h=hash(key);
152
+ h=hash(key);
152
- /* そのバケットは空か */
153
+ /* そのバケットは空か */
153
- if(table[h] == NULL)
154
+ if(table[h] == NULL)
154
- return 0;
155
+ return 0;
155
- /* リストの先頭のセルが削除すべきデータか? */
156
+ /* リストの先頭のセルが削除すべきデータか? */
156
- if(key==table[h]->key){
157
+ if(key==table[h]->key){
157
- p=table[h];
158
+ p=table[h];
158
- table[h]=p->next;
159
+ table[h]=p->next;
159
- free(p);
160
+ free(p);
160
- /* 削除に成功したら1を返す */
161
+ /* 削除に成功したら1を返す */
161
- return 1;
162
+ return 1;
162
- }
163
+ }
163
- /* リストの二番目以降のセルについて順番にチェックする */
164
+ /* リストの二番目以降のセルについて順番にチェックする */
164
- for(q==table[h],p=q->next; p!=NULL; q=p,p=p->next){
165
+ for(q==table[h],p=q->next; p!=NULL; q=p,p=p->next){
165
- if(key==p->key){
166
+ if(key==p->key){
166
- q->next=p->next;
167
+ q->next=p->next;
167
- free(p);
168
+ free(p);
168
- /* 削除に成功したら1を返す */
169
+ /* 削除に成功したら1を返す */
169
- return 1;
170
+ return 1;
170
- }
171
+ }
171
- }
172
+ }
172
- /* 該当するキーを持ったデータが見つからなければ
173
+ /* 該当するキーを持ったデータが見つからなければ
173
- 削除に失敗したとして0を返す */
174
+ 削除に失敗したとして0を返す */
174
- return 0;
175
+ return 0;
175
176
  }
176
177
 
177
178
 
@@ -198,72 +199,73 @@
198
199
 
199
200
  int main(void)
200
201
  {
201
- /* ハッシュ表を初期化する */
202
+ /* ハッシュ表を初期化する */
202
- init(table);
203
+ init(table);
203
- char n[9]; /* 数字を入力するための配列変数 */
204
+ char n[9]; /* 数字を入力するための配列変数 */
204
- int hashval; /* hash関数のハッシュ値を受け取る変数 */
205
+ int hashval; /* hash関数のハッシュ値を受け取る変数 */
205
- int mn=0; /* メニュー選択の数字を入れる変数 */
206
+ int mn=0; /* メニュー選択の数字を入れる変数 */
206
- int a; /* insert関数の戻り値を受け取る変数 */
207
+ int a; /* insert関数の戻り値を受け取る変数 */
207
- int c; /* delete関数の戻り値を受け取る変数 */
208
+ int c; /* delete関数の戻り値を受け取る変数 */
208
- int p; /* hash_print関数の戻り値を受け取る変数 */
209
+ int p; /* hash_print関数の戻り値を受け取る変数 */
209
- int f; /* find関数の戻り値を受け取る変数 */
210
+ int f; /* find関数の戻り値を受け取る変数 */
210
-
211
+
211
- printf("チェイン法をします\n");
212
+ printf("チェイン法をします\n");
212
- do{
213
+ do{
213
- printf("メニューを選んでください\n1=追加 2=検索 3=削除 4=ひょうじ 9=終了\n");
214
+ printf("メニューを選んでください\n1=追加 2=検索 3=削除 4=ひょうじ 9=終了\n");
214
- scanf("%d",&mn);
215
+ scanf("%d",&mn);
215
216
  switch(mn){
216
-
217
+
217
- case 1:
218
+ case 1:
218
- printf("8桁の数字を入力してください\n");
219
+ printf("8桁の数字を入力してください\n");
219
- scanf("%s",&n);
220
+ scanf("%s",&n);
220
-
221
+
221
- /* ハッシュ値を得る */
222
+ /* ハッシュ値を得る */
222
- hashval=hash(n);
223
+ hashval=hash(n);
223
- printf("学籍番号=%d ハッシュ値=%d\n",n,hashval);
224
+ printf("学籍番号=%d ハッシュ値=%d\n",n,hashval);
224
- a=insert(n);
225
+ a=insert(n);
225
- if(a==1)
226
+ if(a==1)
226
- printf("Done\n");
227
+ printf("Done\n");
227
- else
228
+ else
228
- printf("AlreadyExsits\n");
229
+ printf("AlreadyExsits\n");
229
- break;
230
-
231
- case 2:
232
- printf("検索する8桁の数字を入力してください\n");
233
- scanf("%s",&n);
234
- f=find(n);
235
- if(f==NULL);
236
- printf("NotExsits\n");
237
- else
238
- printf("検索した値=%d\n",f);
239
230
  break;
231
+
240
-
232
+ case 2:
233
+ printf("検索する8桁の数字を入力してください\n");
234
+ scanf("%s",&n);
235
+ f=find(n);
236
+ if(f==NULL);
237
+ printf("NotExsits\n");
238
+ else
239
+ printf("検索した値=%d\n",f);
240
+ break;
241
+
241
242
  case 3:
242
243
  printf("削除する8桁数字を入力してください\n");
243
- scanf("%s",&n);
244
+ scanf("%s",&n);
244
- c=delete(n);
245
+ c=delete(n);
245
- if(c==1)
246
+ if(c==1)
246
- printf("Done\n");
247
+ printf("Done\n");
247
- else
248
+ else
248
- printf("NotExsits\n");
249
+ printf("NotExsits\n");
249
- break;
250
+ break;
250
-
251
+
251
- case 4:
252
+ case 4:
252
- printf("ひょうじします\n");
253
+ printf("ひょうじします\n");
253
- /* リストの要素の値を表示する */
254
+ /* リストの要素の値を表示する */
254
255
  hash_print();
255
256
  break;
256
-
257
+
257
- case 9:
258
+ case 9:
258
- printf("終了します\n");
259
+ printf("終了します\n");
259
- break;
260
+ break;
260
-
261
+
261
- default:
262
+ default:
262
- printf("エラー:メニューの中の数字を入力してください\n");
263
+ printf("エラー:メニューの中の数字を入力してください\n");
263
264
  }
264
265
  }while (mn !=9);
265
266
  return 0;
266
267
  }
268
+
267
269
  ```
268
270
 
269
271
  ### 試したこと