質問編集履歴

3

投稿の疑似削除

2020/07/08 06:52

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,317 +1 @@
1
- チェイン法について質問です。二つ以上のハッシュ値が一致してしまった場合、それを避けるためにリスト構造を用いて、最初はリストの末尾にNULLを生成します。その後、新たなハッシュ値が出た場合にNULLの前に新たなリストを作り、衝突を避けるようにしたいです。
2
-
3
- 今find関数を作り、今までのリストを結合した中から、同じ文字列のawayとhomeが見つかるまでループさせ、見つかったら、今現在生成されているリストを結合させないようにしたいです。つまり、違うaway homeのリストをそれぞれのハッシュテーブルに入れるようにしたいです
4
-
5
- 例えばハッシュ値が3の場合に、0番目に清水エスパルスvsガンバ大阪のリスト、一番目には鹿島アントラーズvs柏レイソルのリストはそれぞれ違うhomeとawayで且つ同じハッシュ値なので結合できます。しかし100番目に同じ清水エスパルスvsガンバ大阪の場合は今までのリストに同じ対戦相手があるので結合できなくなります。つまり衝突にカウントを加えないようになっている状態です。
6
-
7
- ```ここに言語を入力
8
-
9
- #define _CRT_SECURE_NO_WARNINGS
10
-
11
- #define HASHSIZE 17
12
-
13
- #include <stdio.h>
14
-
15
- #include <stdlib.h>
16
-
17
- #include<string.h>
18
-
19
-
20
-
21
- struct match* hashtable[HASHSIZE];
22
-
23
- int HASH[HASHSIZE];
24
-
25
- struct match_score {
26
-
27
- int year;
28
-
29
- int month;
30
-
31
- int day;
32
-
33
- int home_score;
34
-
35
- int away_score;
36
-
37
- struct match_score* next;
38
-
39
- };
40
-
41
- struct match {
42
-
43
- char *home;
44
-
45
- char *away;
46
-
47
-
48
-
49
- struct match *next;
50
-
51
- struct match_score* r;
52
-
53
- };
54
-
55
-
56
-
57
- int hash(char *home,char *away) {
58
-
59
- int hashval = 0;//ハッシュ値の値を初期化
60
-
61
-
62
-
63
- while (*home != '\0'|| *away!='\0') {//homeとawayの値がどちらも\0になるまでループする
64
-
65
-
66
-
67
- hashval += *home+*away;//アスキーコードの和を足す
68
-
69
- if(*home!= '\0')//どちらかが\0になっても全てムラなく足せるようにする
70
-
71
- home++;
72
-
73
- if (*away != '\0')
74
-
75
- away++;
76
-
77
-
78
-
79
- }
80
-
81
- return hashval % HASHSIZE;//ハッシュ値を返す。
82
-
83
-
84
-
85
-
86
-
87
- }
88
-
89
-
90
-
91
- struct match* find(char* home, char* away) {
92
-
93
- struct match* p;//match構造体のポインタ変数
94
-
95
- int hashval;
96
-
97
- hashval = hash(home, away);//ハッシュ値を返す。
98
-
99
- p = hashtable[hashval];//全体のリスト結合をpに代入させる
100
-
101
- while (p != NULL) {//pがNULLになるまでループさせる
102
-
103
- if ((strcmp(home, p->home) == 0) && (strcmp(away, p->away) == 0)) {//今のリストが探索して今までのリストのhome,awayが同じリストがあるならば今ののリストは結合させないようにしたい。
104
-
105
- printf("%s %s\n", p->home, p->away);//同じアスキーコードがあるならばその値を返す。
106
-
107
- return p;
108
-
109
-
110
-
111
- }
112
-
113
- p = p->next;//同じ、homeとawayが見つかるまで次のリストに移動させる。
114
-
115
-
116
-
117
-
118
-
119
- }
120
-
121
- }
122
-
123
-
124
-
125
-
126
-
127
-
128
-
129
-
130
-
131
-
132
-
133
- void ListKeyWord(struct match *p ,char * home,char *away,int Hash)
134
-
135
- {
136
-
137
-
138
-
139
- struct match* ptr=hashtable[Hash];
140
-
141
-
142
-
143
-
144
-
145
- // printf("home:%s away:%s ハッシュ値:%d:\n", (*p).home, (*p).away,hash((*p).home,(*p).away));
146
-
147
- // printf("home:%s away:%s ハッシュ値:%d:\n", (*ptr).home, (*ptr).away, hash((*ptr).home, (*ptr).away));
148
-
149
- }
150
-
151
-
152
-
153
-
154
-
155
-
156
-
157
-
158
-
159
- void add(int year, int month, int day, char* home_team, int home_score, int away_score, char* away_team) {
160
-
161
- int hashval;
162
-
163
- struct match* ptr;
164
-
165
- int i;
166
-
167
- hashval = hash(home_team, away_team);//homeとawayのアスキーコードの和とそれを割る素数からハッシュ値を返す。
168
-
169
-
170
-
171
- ptr = (struct match*)malloc(sizeof(struct match));//ptrの領域を確保する
172
-
173
- ptr->home = (char*)malloc(strlen(home_team) + 1);//homeの文字列+\0の長さを求める。
174
-
175
- strcpy(ptr->home, home_team);//文字列のコピー
176
-
177
- ptr->away = (char*)malloc(strlen(away_team) + 1);
178
-
179
- strcpy(ptr->away, away_team);
180
-
181
-
182
-
183
-
184
-
185
- if (hashtable[hashval] == NULL){//ハッシュ値が未登録ならば
186
-
187
- hashtable[hashval] = ptr;//最初にアドレスを登録
188
-
189
- ptr->next = NULL;//次の指すアドレスをNULLにする。
190
-
191
-
192
-
193
- }
194
-
195
-
196
-
197
- else {//ハッシュ値の中の値がNULLでなければNULLの後ろに新たなリストを生成する。
198
-
199
- struct match* ptr2;//次のリストを指定
200
-
201
- struct match* ptr3;//find関数のアドレスを返す。
202
-
203
-
204
-
205
- ptr2 = hashtable[hashval];//今現在のリストをptr2に代入する
206
-
207
- ptr3 = find(home_team, away_team);//find関数で探索をし、もし同じhomeとawayの値が見つかったらアドレスを返す
208
-
209
- while (ptr2->next != NULL ) {
210
-
211
- if ((strcmp(ptr2->home, ptr3->home) != 0) && (strcmp(ptr2->home, ptr3->home) != 0)) {//find関数で見つかったhomeとawayが今のptr2が同じならば、
212
-
213
- //同じ名前のhomeとawayはリスト結合をしないようにしたい。
1
+ ハッシュ法用いる質問をましたが都合により削除することにりました。コードは載せないようにしたいと思います
214
-
215
- ptr->next = NULL;
216
-
217
- break;
218
-
219
- }
220
-
221
- else {
222
-
223
- ptr2 = ptr2->next;
224
-
225
- HASH[hashval]++;//同じハッシュ値がぶつかった回数だけ足していきたい。ただし同じhome,awayのリストは足さないようにしたい。
226
-
227
- }
228
-
229
-
230
-
231
- }
232
-
233
- ptr2->next = ptr;//違うチーム同士をリスト結合でつないでいきたい
234
-
235
- ptr->next = NULL;//リスとの末尾にNULLを返す。リストが終わるまで、何度もNULLの値が入れ替わる。
236
-
237
-
238
-
239
-
240
-
241
-
242
-
243
- }
244
-
245
-
246
-
247
- ListKeyWord(ptr,home_team, away_team, hashval);//ハッシュ値がどうなっているか確かめる
248
-
249
-
250
-
251
-
252
-
253
-
254
-
255
-
256
-
257
- }
258
-
259
-
260
-
261
- int main() {
262
-
263
- char home_team[256], away_team[256];
264
-
265
- int home_score, away_score;
266
-
267
- int year, month, day, i, f;
268
-
269
- struct match* ptr;
270
-
271
- ptr = NULL;
272
-
273
- const char* filename = "jleague.txt";//Jリーグの過去の対戦結果のファイル
274
-
275
- FILE* fp;
276
-
277
-
278
-
279
- for (i = 0; i < HASHSIZE; i++) {
280
-
281
- hashtable[i] = NULL;//初期値をNULLにさせる。
282
-
283
- }
284
-
285
-
286
-
287
- fp = fopen(filename, "r");
288
-
289
- while ((f = fscanf(fp, "%d %d %d %s %d %d %s", &year, &month, &day, home_team, &home_score, &away_score, away_team)) != EOF) {
290
-
291
- add(year, month, day, home_team, home_score, away_score, away_team);
292
-
293
-
294
-
295
-
296
-
297
- }
298
-
299
- for(i=0;i<HASHSIZE;i++)
300
-
301
- printf("%d\n", HASH[i]); //ハッシュ値が偏りなくなっているか確かめる
302
-
303
-
304
-
305
-
306
-
307
-
308
-
309
- }
310
-
311
-
312
-
313
-
314
-
315
-
316
-
317
- ```

2

また、何度も編集したいから

2020/07/08 06:52

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,8 +1,8 @@
1
1
  チェイン法について質問です。二つ以上のハッシュ値が一致してしまった場合、それを避けるためにリスト構造を用いて、最初はリストの末尾にNULLを生成します。その後、新たなハッシュ値が出た場合にNULLの前に新たなリストを作り、衝突を避けるようにしたいです。
2
2
 
3
- そのためにadd関数内にあるelseの後の条件whileの内容を満たすようにするにはどうすればよいのでしょうか。また、同じチームのアスキーコードが同じなのにハッシュ値が異なる値が表示される場合があるのはどうしてでしょうか。
4
-
5
- 例えばhome:Sanfrecce_Hiroshima_F.C away:Urawa_Red_Diamondsとした場合にハッシュ値が一回目が11二回目が16と異なる値が表示されることがあります。何度もコンパイルした結果そうなります。ご協力お願しま
3
+ find関数を作り、今までのリストを結合した中から、同じ文字列のawayとhomeが見つかるまでループさせ、見つかったら、今現在生成されているリストを結合させないようにしたいです。つまり、違うaway homeのリストをそれぞれのハッシュテーブルに入れるようにしたい
4
+
5
+ 例えばハッシュ値が3の場合に、0番目に清水エスパルスvsガンバ大阪のリスト、一番目には鹿島アントラーズvs柏レイソルのリストはそれぞれ違うhomeとawayで且つ同じハッシュ値なので結合できます。しかし100番目に同じ清水エスパルスvsガンバ大阪の場合は今までのリストに同じ対戦相手があるので結合できなくなります。つまり衝突にカウントを加えないようになっている状態です。
6
6
 
7
7
  ```ここに言語を入力
8
8
 
@@ -20,6 +20,8 @@
20
20
 
21
21
  struct match* hashtable[HASHSIZE];
22
22
 
23
+ int HASH[HASHSIZE];
24
+
23
25
  struct match_score {
24
26
 
25
27
  int year;
@@ -52,21 +54,19 @@
52
54
 
53
55
 
54
56
 
55
-
56
-
57
57
  int hash(char *home,char *away) {
58
58
 
59
- int hashval = 0;
59
+ int hashval = 0;//ハッシュ値の値を初期化
60
-
61
-
62
-
60
+
61
+
62
+
63
- while (*home != '\0'|| *away!='\0') {
63
+ while (*home != '\0'|| *away!='\0') {//homeとawayの値がどちらも\0になるまでループする
64
64
 
65
65
 
66
66
 
67
- hashval += *home+*away;
67
+ hashval += *home+*away;//アスキーコードの和を足す
68
-
68
+
69
- if(*home!= '\0')
69
+ if(*home!= '\0')//どちらかが\0になっても全てムラなく足せるようにする
70
70
 
71
71
  home++;
72
72
 
@@ -78,29 +78,81 @@
78
78
 
79
79
  }
80
80
 
81
- return hashval % HASHSIZE;
81
+ return hashval % HASHSIZE;//ハッシュ値を返す。
82
-
83
-
84
-
85
-
86
-
82
+
83
+
84
+
85
+
86
+
87
- }
87
+ }
88
+
89
+
90
+
88
-
91
+ struct match* find(char* home, char* away) {
92
+
93
+ struct match* p;//match構造体のポインタ変数
94
+
95
+ int hashval;
96
+
97
+ hashval = hash(home, away);//ハッシュ値を返す。
98
+
99
+ p = hashtable[hashval];//全体のリスト結合をpに代入させる
100
+
101
+ while (p != NULL) {//pがNULLになるまでループさせる
102
+
103
+ if ((strcmp(home, p->home) == 0) && (strcmp(away, p->away) == 0)) {//今のリストが探索して今までのリストのhome,awayが同じリストがあるならば今ののリストは結合させないようにしたい。
104
+
105
+ printf("%s %s\n", p->home, p->away);//同じアスキーコードがあるならばその値を返す。
106
+
107
+ return p;
108
+
109
+
110
+
111
+ }
112
+
113
+ p = p->next;//同じ、homeとawayが見つかるまで次のリストに移動させる。
114
+
115
+
116
+
117
+
118
+
119
+ }
120
+
121
+ }
122
+
123
+
124
+
125
+
126
+
127
+
128
+
129
+
130
+
131
+
132
+
89
- void ListKeyWord(char * home,char *away,int Hash)
133
+ void ListKeyWord(struct match *p ,char * home,char *away,int Hash)
90
134
 
91
135
  {
92
136
 
93
137
 
94
138
 
95
- struct match* p=hashtable[Hash];
139
+ struct match* ptr=hashtable[Hash];
96
-
97
-
98
-
99
-
100
-
140
+
141
+
142
+
143
+
144
+
101
- printf("home:%s away:%s ハッシュ値:%d:\n", (*p).home, (*p).away,hash((*p).home,away));
145
+ // printf("home:%s away:%s ハッシュ値:%d:\n", (*p).home, (*p).away,hash((*p).home,(*p).away));
146
+
102
-
147
+ // printf("home:%s away:%s ハッシュ値:%d:\n", (*ptr).home, (*ptr).away, hash((*ptr).home, (*ptr).away));
148
+
103
- }
149
+ }
150
+
151
+
152
+
153
+
154
+
155
+
104
156
 
105
157
 
106
158
 
@@ -110,59 +162,95 @@
110
162
 
111
163
  struct match* ptr;
112
164
 
113
-
165
+ int i;
114
-
166
+
115
- hashval = hash(home_team, away_team);
167
+ hashval = hash(home_team, away_team);//homeとawayのアスキーコードの和とそれを割る素数からハッシュ値を返す。
116
-
117
-
118
-
168
+
169
+
170
+
119
- ptr = (struct match*)malloc(sizeof(struct match));
171
+ ptr = (struct match*)malloc(sizeof(struct match));//ptrの領域を確保する
120
-
172
+
121
- ptr->home = (char*)malloc(strlen(home_team) + 1);
173
+ ptr->home = (char*)malloc(strlen(home_team) + 1);//homeの文字列+\0の長さを求める。
122
-
174
+
123
- strcpy(ptr->home, home_team);
175
+ strcpy(ptr->home, home_team);//文字列のコピー
124
176
 
125
177
  ptr->away = (char*)malloc(strlen(away_team) + 1);
126
178
 
127
179
  strcpy(ptr->away, away_team);
128
180
 
129
-
130
-
131
-
132
-
181
+
182
+
183
+
184
+
133
- if (hashtable[hashval] == NULL){
185
+ if (hashtable[hashval] == NULL){//ハッシュ値が未登録ならば
134
-
186
+
135
- hashtable[hashval] = ptr;
187
+ hashtable[hashval] = ptr;//最初にアドレスを登録
136
-
188
+
137
- ptr->next = NULL;
189
+ ptr->next = NULL;//次の指すアドレスをNULLにする。
138
190
 
139
191
 
140
192
 
141
- }
193
+ }
194
+
195
+
196
+
142
-
197
+ else {//ハッシュ値の中の値がNULLでなければNULLの後ろに新たなリストを生成する。
198
+
199
+ struct match* ptr2;//次のリストを指定
200
+
201
+ struct match* ptr3;//find関数のアドレスを返す。
202
+
203
+
204
+
205
+ ptr2 = hashtable[hashval];//今現在のリストをptr2に代入する
206
+
207
+ ptr3 = find(home_team, away_team);//find関数で探索をし、もし同じhomeとawayの値が見つかったらアドレスを返す
208
+
209
+ while (ptr2->next != NULL ) {
210
+
211
+ if ((strcmp(ptr2->home, ptr3->home) != 0) && (strcmp(ptr2->home, ptr3->home) != 0)) {//find関数で見つかったhomeとawayが今のptr2が同じならば、
212
+
213
+ //同じ名前のhomeとawayはリスト結合をしないようにしたい。
214
+
215
+ ptr->next = NULL;
216
+
217
+ break;
218
+
219
+ }
220
+
143
- else {
221
+ else {
144
-
145
- struct match* ptr2 = hashtable[hashval];
222
+
146
-
147
-
148
-
149
- while (ptr2->next!= NULL ) {
150
-
151
- ptr2 = ptr2->next;
223
+ ptr2 = ptr2->next;
152
-
224
+
153
- ptr2->next = ptr;
225
+ HASH[hashval]++;//同じハッシュ値がぶつかった回数だけ足していきたい。ただし同じhome,awayのリストは足さないようにしたい。
154
-
155
- ptr->next = NULL;
226
+
156
-
157
- }
227
+ }
158
-
159
-
160
-
228
+
229
+
230
+
161
- }
231
+ }
232
+
162
-
233
+ ptr2->next = ptr;//違うチーム同士をリスト結合でつないでいきたい
234
+
163
-
235
+ ptr->next = NULL;//リスとの末尾にNULLを返す。リストが終わるまで、何度もNULLの値が入れ替わる。
236
+
237
+
238
+
239
+
240
+
241
+
242
+
164
-
243
+ }
244
+
245
+
246
+
165
- ListKeyWord(home_team,away_team,hashval);
247
+ ListKeyWord(ptr,home_team, away_team, hashval);//ハッシュ値がどうなっているか確かめる
248
+
249
+
250
+
251
+
252
+
253
+
166
254
 
167
255
 
168
256
 
@@ -182,39 +270,47 @@
182
270
 
183
271
  ptr = NULL;
184
272
 
185
- const char* filename = "jleague.txt";
273
+ const char* filename = "jleague.txt";//Jリーグの過去の対戦結果のファイル
186
274
 
187
275
  FILE* fp;
188
276
 
189
-
277
+
190
278
 
191
279
  for (i = 0; i < HASHSIZE; i++) {
192
280
 
193
- hashtable[i] = NULL;
281
+ hashtable[i] = NULL;//初期値をNULLにさせる。
194
-
282
+
195
- }
283
+ }
196
-
197
-
284
+
285
+
198
286
 
199
287
  fp = fopen(filename, "r");
200
288
 
201
- while ((f = fscanf(fp, "%d %d %d %s %d %d %s", year, month, day, home_team, home_score, away_score, away_team)) != EOF) {
289
+ while ((f = fscanf(fp, "%d %d %d %s %d %d %s", &year, &month, &day, home_team, &home_score, &away_score, away_team)) != EOF) {
202
290
 
203
291
  add(year, month, day, home_team, home_score, away_score, away_team);
204
292
 
205
-
206
-
293
+
294
+
295
+
296
+
207
- }
297
+ }
298
+
208
-
299
+ for(i=0;i<HASHSIZE;i++)
300
+
209
-
301
+ printf("%d\n", HASH[i]); //ハッシュ値が偏りなくなっているか確かめる
210
-
211
-
212
-
213
-
214
-
302
+
303
+
304
+
305
+
306
+
307
+
308
+
215
- }
309
+ }
216
-
217
-
310
+
311
+
312
+
313
+
218
314
 
219
315
 
220
316
 

1

プログラムの説明が足りなかったこと。

2020/06/15 13:38

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,34 +1,8 @@
1
- チェイン法についての質問です。与えられた、ファイルデータ対戦相手、試合結果などを用いてデータを作成するといった内容です。
2
-
3
- まず、ハッシュのチェイン法で探索をする前に、ハッシュ関数でできた分布に偏りがないようにしたいです。
4
-
5
- ### ハッシュ法についての考え方
6
-
7
- 1初期値にhashtableをそれぞれNULLにする
8
-
9
- 2home_teamとaway_teamを固定して、アスキーコードで文字列の合計の割る17でハッシュテーブル0から17の中に割り当てる。
10
-
11
- 3push関数を用いて、最初はNULLのリストをmallocで次のリスト領域を格納する。
12
-
13
- 4リスト構造ができるごとに、それぞれのhashtableの値をインクリメントさせて、0から17の間にハッシュが偏りなく割り当てられているのか確認する
14
-
15
-
16
-
17
- 今やりたいことは、新たなホームとアウェイチームが別々もかかわらず、ハッシュ値が同じで衝突するのを避けるためにリスト構造を用いて、先頭のリストを出すような形でやりたいと思っております。
1
+ ェイン法ついて質問です。二つ以上のハッシュ値が一致してしまった場合、それを避けるためにリスト構造を用いて、最初はリスト末尾にNULLを生成します。その後、新たなハッシュ値が出た場合にNULLの前に新たなリストを作り、衝突を避けるようにしたいす。
18
-
19
- リスト内ごとに、ホームとアウェイチームの内容を格納させて、数珠つなぎのようにつなげていくようにする
2
+
20
-
21
- 例えば野球チームだと
22
-
23
- hashtable[0]->[ジャイアンツロッテ]->[タイガース、中日]->[NULL] 計2
3
+ そのためにadd関数内にあるelseの後の条件whileの内容を満たすようにするにはどうすればよいのでしょうか。また同じチムのアキーコードが同じなのにハッシュ値が異なる値が表示される場があるのはどうしてでしょうか。
24
-
25
- hashtable[1]->[DeNA、カープ]->[NULL]              合計1
4
+
26
-
27
- といった最初はNULL内から、push関数でタイガース、中日の組のリストを生成、次のチームのハッシュ値が1となり、DenA,カープの組ハッシュ値1のリストを生成することが目的です。最初の内容に戻ってしまいますが、この合計が偏りなくなるアルゴリズムを教えて欲しいです
5
+ 例えばhome:Sanfrecce_Hiroshima_F.C away:Urawa_Red_Diamondsた場合にハッシュ値が一回目が1二回目が16る値表示されることがあります。何度もコンパイルた結果そうなりす。ご協力お願ます。
28
-
29
- そこにコードのヒントも下さると助かります。中途半端なので何も完成していないです。
30
-
31
-
32
6
 
33
7
  ```ここに言語を入力
34
8
 
@@ -46,7 +20,21 @@
46
20
 
47
21
  struct match* hashtable[HASHSIZE];
48
22
 
49
-
23
+ struct match_score {
24
+
25
+ int year;
26
+
27
+ int month;
28
+
29
+ int day;
30
+
31
+ int home_score;
32
+
33
+ int away_score;
34
+
35
+ struct match_score* next;
36
+
37
+ };
50
38
 
51
39
  struct match {
52
40
 
@@ -54,31 +42,17 @@
54
42
 
55
43
  char *away;
56
44
 
45
+
46
+
47
+ struct match *next;
48
+
57
49
  struct match_score* r;
58
50
 
59
- struct match *next;
60
-
61
51
  };
62
52
 
63
53
 
64
54
 
65
- struct match * push( struct match * key,char*home,char *away) {
55
+
66
-
67
- struct match * tmp;
68
-
69
-
70
-
71
- tmp = (struct match*)malloc(sizeof(struct match ));
72
-
73
- tmp->home=home;
74
-
75
- tmp->away=away;
76
-
77
- tmp->next = tmp;
78
-
79
- return(tmp);
80
-
81
- }
82
56
 
83
57
  int hash(char *home,char *away) {
84
58
 
@@ -106,6 +80,26 @@
106
80
 
107
81
  return hashval % HASHSIZE;
108
82
 
83
+
84
+
85
+
86
+
87
+ }
88
+
89
+ void ListKeyWord(char * home,char *away,int Hash)
90
+
91
+ {
92
+
93
+
94
+
95
+ struct match* p=hashtable[Hash];
96
+
97
+
98
+
99
+
100
+
101
+ printf("home:%s away:%s ハッシュ値:%d:\n", (*p).home, (*p).away,hash((*p).home,away));
102
+
109
103
  }
110
104
 
111
105
 
@@ -116,23 +110,61 @@
116
110
 
117
111
  struct match* ptr;
118
112
 
119
-
120
-
113
+
114
+
121
- hashval=hash(home_team, away_team);
115
+ hashval = hash(home_team, away_team);
122
-
123
- hashtable[hashval]++;
116
+
117
+
124
118
 
125
119
  ptr = (struct match*)malloc(sizeof(struct match));
126
120
 
127
- ptr->next = hashtable[hashval];
121
+ ptr->home = (char*)malloc(strlen(home_team) + 1);
128
-
122
+
129
- ptr->home = home_team;
123
+ strcpy(ptr->home, home_team);
124
+
130
-
125
+ ptr->away = (char*)malloc(strlen(away_team) + 1);
126
+
131
- ptr->away = away_team;
127
+ strcpy(ptr->away, away_team);
132
-
128
+
129
+
130
+
131
+
132
+
133
- ptr->next = hashtable[hashval];
133
+ if (hashtable[hashval] == NULL){
134
-
134
+
135
- hashtable[hashval] = ptr;
135
+ hashtable[hashval] = ptr;
136
+
137
+ ptr->next = NULL;
138
+
139
+
140
+
141
+ }
142
+
143
+ else {
144
+
145
+ struct match* ptr2 = hashtable[hashval];
146
+
147
+
148
+
149
+ while (ptr2->next!= NULL ) {
150
+
151
+ ptr2 = ptr2->next;
152
+
153
+ ptr2->next = ptr;
154
+
155
+ ptr->next = NULL;
156
+
157
+ }
158
+
159
+
160
+
161
+ }
162
+
163
+
164
+
165
+ ListKeyWord(home_team,away_team,hashval);
166
+
167
+
136
168
 
137
169
  }
138
170
 
@@ -166,25 +198,23 @@
166
198
 
167
199
  fp = fopen(filename, "r");
168
200
 
169
- while ((f = fscanf(fp, "%d %d %d %s %d %d %s", &year, &month, &day, home_team, &home_score, &away_score, away_team)) != EOF) {
201
+ while ((f = fscanf(fp, "%d %d %d %s %d %d %s", year, month, day, home_team, home_score, away_score, away_team)) != EOF) {
170
202
 
171
203
  add(year, month, day, home_team, home_score, away_score, away_team);
172
204
 
173
- ptr = push(ptr, home_team, away_team);
205
+
174
-
206
+
175
- }
207
+ }
176
-
177
- for (i = 0; i < HASHSIZE; i++) {
208
+
178
-
179
- printf("%d\n", hashtable[i]);
209
+
180
-
210
+
211
+
212
+
213
+
214
+
181
- }
215
+ }
182
-
183
-
184
-
185
-
186
-
187
- }
216
+
217
+
188
218
 
189
219
 
190
220