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

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

ただいまの
回答率

87.58%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 490

score 27

#include <stdio.h>
#include <stdlib.h>

#define NO   1
#define NAME 2

typedef enum {
    Term, Insert, Delete, SrchNo, Dump,
} Menu;

typedef struct {
    int     no;
    char    name[10];
} Data;

typedef struct __node {
    Data           data;
    struct __node  *next;
} Node;

typedef struct {
    int     size;
    Node    **table;
} Hash;

int hash(int key) {
    return (key % 13);
}

void SetNode(Node *n, Data x, Node *next) {
    n->data = x;
    n->next = next;
}

int InitHash(Hash *h, int size) {
    int     i;

    h->size = 0;
    if ((h->table = calloc(size, sizeof(Node *))) == NULL)
        return 0;

    h->size = size;
    for (i = 0; i < size; i++)
        h->table[i] = NULL;
    return 1;
}

void TermHash(Hash *h) {
    int     i;
    for (i = 0; i < h->size; i++) {
        Node *p = h->table[i];
        while (p != NULL) {
            Node *next = p->next;
            free(p);
            p = next;
        }
    }
    free(h->table);
}

Node *SearchNode(Hash *h, Data x) {
    int     key = hash(x.no);
    Node    *p = h->table[key];

    while (p != NULL) {
        if (p->data.no == x.no)
            return p;
        p = p->next;
    }
    return NULL;
}

int InsertNode(Hash *h, Data x) {
    int     key = hash(x.no);
    Node    *p = h->table[key];
    Node    *temp;

    while (p != NULL) {
        if (p->data.no == x.no)
            return 1;
        p = p->next;
    }
    if ((temp = (Node *)calloc(1, sizeof(Node))) == NULL)
        return 2;
    SetNode(temp, x, h->table[key]);
    h->table[key] = temp;
    return 0;
}

int DeleteNode(Hash *h, Data x) {
    int     key = hash(x.no);
    Node    *p = h->table[key];
    Node    **pp = &h->table[key];

    while (p != NULL) {
        if (p->data.no == x.no) {
            *pp = p->next;
            free(p);
            return 0;
        }
        pp = &p->next;
        p = p->next;
    }
    return 1;
}

void DumpHash(Hash *h) {
    int i;

    for (i = 0; i < h->size; i++) {
        Node *p = h->table[i];
        printf("%02d  ", i);
        while (p != NULL) {
            printf("→ %d (%s)  ", p->data.no, p->data.name);
            p = p->next;
        }
        putchar('\n');
    }
}

void PrintData(Data x) {
    printf("%d %s\n", x.no, x.name);
}

Data Read(char *message, int sw) {
    Data temp;

    printf("%sするデータを入力してください。\n", message);

    if (sw & NO)   {printf("番号:"); scanf("%d", &temp.no);}
    if (sw & NAME) {printf("名前:"); scanf("%s", temp.name);}

    return temp;
}

Menu SelectMenu(void) {
    int i, ch;

    do {
        printf("(1) 追加 (2) 削除 (3) 探索 (4) ダンプ (0) 終了 :");
        scanf("%d", &ch);
    } while (ch < Term || ch > Dump);
    return ((Menu)ch);
}

int main(void)
{
    Menu menu;
    Hash hash;

    InitHash(&hash, 13);

    do {
        int result;
        Data x;
        Node *temp;

        switch (menu = SelectMenu()) {
            case Insert : x = Read("追加", NO | NAME);     // NO == 1, NAME == 2
                          result = InsertNode(&hash, x);
                          if (result)
                              printf("追加に失敗しました。(%s)。\n",
                                        (result == 1) ? "登録済み" : "メモリ不足");
                          break;

            case Delete : x = Read("削除", NO);
                          result = DeleteNode(&hash, x);
                          if (result == 1)
                              printf("その番号のデータは存在しません。\n");
                          break;

            case SrchNo : x = Read("探索", NO);
                          temp = SearchNode(&hash, x);
                          if (temp == NULL)
                              printf("探索に失敗しました。");
                          else {
                              printf("探索に成功しました。\n");
                              PrintData(temp->data);
                          }
                          break;

            case Dump :   DumpHash(&hash);
                          break;
        }
    } while (menu != Term);

    TermHash(&hash);

    return 0;
}

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

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

 InitHash(&hash, 13);   // メイン関数内
int InitHash(Hash *h, int size) {
    int     i;

    h->size = 0;
    if ((h->table = calloc(size, sizeof(Node *))) == NULL)
        return 0;

    h->size = size;
    for (i = 0; i < size; i++)
        h->table[i] = NULL;
    return 1;
}


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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/10/05 08:45

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

    キャンセル

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

  • ただいまの回答率 87.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

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