質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1740閲覧

C言語 関数の戻り値を格納する変数が無いのに、戻り値を設定する意味がわかりません。

hogeee

総合スコア27

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/10/04 18:26

c

1#include <stdio.h> 2#include <stdlib.h> 3 4#define NO 1 5#define NAME 2 6 7typedef enum { 8 Term, Insert, Delete, SrchNo, Dump, 9} Menu; 10 11typedef struct { 12 int no; 13 char name[10]; 14} Data; 15 16typedef struct __node { 17 Data data; 18 struct __node *next; 19} Node; 20 21typedef struct { 22 int size; 23 Node **table; 24} Hash; 25 26int hash(int key) { 27 return (key % 13); 28} 29 30void SetNode(Node *n, Data x, Node *next) { 31 n->data = x; 32 n->next = next; 33} 34 35int InitHash(Hash *h, int size) { 36 int i; 37 38 h->size = 0; 39 if ((h->table = calloc(size, sizeof(Node *))) == NULL) 40 return 0; 41 42 h->size = size; 43 for (i = 0; i < size; i++) 44 h->table[i] = NULL; 45 return 1; 46} 47 48void TermHash(Hash *h) { 49 int i; 50 for (i = 0; i < h->size; i++) { 51 Node *p = h->table[i]; 52 while (p != NULL) { 53 Node *next = p->next; 54 free(p); 55 p = next; 56 } 57 } 58 free(h->table); 59} 60 61Node *SearchNode(Hash *h, Data x) { 62 int key = hash(x.no); 63 Node *p = h->table[key]; 64 65 while (p != NULL) { 66 if (p->data.no == x.no) 67 return p; 68 p = p->next; 69 } 70 return NULL; 71} 72 73int InsertNode(Hash *h, Data x) { 74 int key = hash(x.no); 75 Node *p = h->table[key]; 76 Node *temp; 77 78 while (p != NULL) { 79 if (p->data.no == x.no) 80 return 1; 81 p = p->next; 82 } 83 if ((temp = (Node *)calloc(1, sizeof(Node))) == NULL) 84 return 2; 85 SetNode(temp, x, h->table[key]); 86 h->table[key] = temp; 87 return 0; 88} 89 90int DeleteNode(Hash *h, Data x) { 91 int key = hash(x.no); 92 Node *p = h->table[key]; 93 Node **pp = &h->table[key]; 94 95 while (p != NULL) { 96 if (p->data.no == x.no) { 97 *pp = p->next; 98 free(p); 99 return 0; 100 } 101 pp = &p->next; 102 p = p->next; 103 } 104 return 1; 105} 106 107void DumpHash(Hash *h) { 108 int i; 109 110 for (i = 0; i < h->size; i++) { 111 Node *p = h->table[i]; 112 printf("%02d ", i); 113 while (p != NULL) { 114 printf("→ %d (%s) ", p->data.no, p->data.name); 115 p = p->next; 116 } 117 putchar('\n'); 118 } 119} 120 121void PrintData(Data x) { 122 printf("%d %s\n", x.no, x.name); 123} 124 125Data Read(char *message, int sw) { 126 Data temp; 127 128 printf("%sするデータを入力してください。\n", message); 129 130 if (sw & NO) {printf("番号:"); scanf("%d", &temp.no);} 131 if (sw & NAME) {printf("名前:"); scanf("%s", temp.name);} 132 133 return temp; 134} 135 136Menu SelectMenu(void) { 137 int i, ch; 138 139 do { 140 printf("(1) 追加 (2) 削除 (3) 探索 (4) ダンプ (0) 終了 :"); 141 scanf("%d", &ch); 142 } while (ch < Term || ch > Dump); 143 return ((Menu)ch); 144} 145 146int main(void) 147{ 148 Menu menu; 149 Hash hash; 150 151 InitHash(&hash, 13); 152 153 do { 154 int result; 155 Data x; 156 Node *temp; 157 158 switch (menu = SelectMenu()) { 159 case Insert : x = Read("追加", NO | NAME); // NO == 1, NAME == 2 160 result = InsertNode(&hash, x); 161 if (result) 162 printf("追加に失敗しました。(%s)。\n", 163 (result == 1) ? "登録済み" : "メモリ不足"); 164 break; 165 166 case Delete : x = Read("削除", NO); 167 result = DeleteNode(&hash, x); 168 if (result == 1) 169 printf("その番号のデータは存在しません。\n"); 170 break; 171 172 case SrchNo : x = Read("探索", NO); 173 temp = SearchNode(&hash, x); 174 if (temp == NULL) 175 printf("探索に失敗しました。"); 176 else { 177 printf("探索に成功しました。\n"); 178 PrintData(temp->data); 179 } 180 break; 181 182 case Dump : DumpHash(&hash); 183 break; 184 } 185 } while (menu != Term); 186 187 TermHash(&hash); 188 189 return 0; 190} 191

上のコードはチェイン法におけるハッシュの操作を表したものです。

お聞きしたいのは以下の部分です。

c

1 InitHash(&hash, 13); // メイン関数内

c

1int InitHash(Hash *h, int size) { 2 int i; 3 4 h->size = 0; 5 if ((h->table = calloc(size, sizeof(Node *))) == NULL) 6 return 0; 7 8 h->size = size; 9 for (i = 0; i < size; i++) 10 h->table[i] = NULL; 11 return 1; 12}

メイン関数内でInitHash関数を呼び出しているのですが、InitHash関数内で「return 0」や「return 1」とあります。
しかし呼び出した側のメイン関数内にはInitHash関数の戻り値を格納する変数を用意していません。
この「return 0」や「return 1」はどういう意味があるのでしょうか?

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

メモリ確保に失敗した場合(callocの戻り値がNULL)は0、確保できた場合は1で見分けがつくようにしていますが、使用していないだけです。

投稿2020/10/04 18:46

SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/10/04 23:45

printfもintを返しますが、返り値を使った記憶がないですね…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問