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

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

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

Q&A

解決済

1回答

1058閲覧

連結リストを使って単語とその出現回数を表示する

janjanshishi

総合スコア1

0グッド

0クリップ

投稿2022/12/07 02:04

編集2022/12/07 02:27

前提

標準入力からテキストを読み込み、連結リストを使ってテキストに出現する単語を辞書式順序になるように出力し、その単語の出現回数を表示するプログラムを作成しています。

実現したいこと

関数add_node内で
・自身の再帰呼び出しで処理を行う。
・ 引数で受け取った単語(文字列)がリスト内のノードに存在しない場合、新しいノードとして、リストにあるノードの単語の並びが辞書式順序で昇順になるように、適切な位置に追加する。
・ 引数で受け取った単語がすでにリスト内のノードに存在する場合、該当する既存のノードの出現頻度を1増やす。
という処理を行えるようにしたい。

該当のソースコード

C

1 2#include <stdio.h> 3#include <stdlib.h> 4#include <string.h> 5#include <ctype.h> 6 7#define LEN 50 8 9/* リストのノードの構造体 */ 10struct ListNode{ 11 char word[LEN]; /* 単語 */ 12 int count; /* 単語の出現頻度 */ 13 struct ListNode *next; 14}; 15typedef struct ListNode LNode; 16 17LNode *cons(char *, int); 18void print_words(LNode *); 19LNode *add_node(LNode *, char *); 20 21int main(){ 22 LNode *ltop = NULL; /* リストの先頭ノードへのポインタ */ 23 char ch; /* 文字の読み込み用 */ 24 char word[LEN]; /* 読み込んだ単語を格納 */ 25 int length = 0; 26 27 /* 読み込んだテキストから単語を抜き出し、リストを作成 */ 28 while((ch = getchar()) != EOF){ 29 if (isalpha(ch)) 30 word[length++] = ch; 31 else 32 if (length != 0){ 33 word[length] = '\0'; 34 ltop = add_node(ltop, word); 35 length = 0; 36 } 37 } 38 if (length != 0){ /* 読み込み終了時に単語が残っていた場合の処理 */ 39 word[length] = '\0'; 40 ltop = add_node(ltop, word); 41 } 42 43 /* リストに登録された単語と出現頻度の出力 */ 44 print_words(ltop); 45 46 return 0; 47} 48 49/* 追加するノードの作成 */ 50LNode *cons(char *word, int count){ 51 LNode *nd; 52 nd = (LNode *)malloc(sizeof(struct ListNode)); 53 if (nd == NULL){ 54 printf("malloc error!!\n"); 55 exit(-1); 56 } 57 nd->count = count; 58 strcpy(nd->word, word); 59 nd->next = NULL; 60 return nd; 61} 62 63/* 単語の出力(リストの前方ノードから順に単語とその出現頻度を出力する) */ 64void print_words(LNode *lnode){ 65 while(lnode != NULL){ 66 printf("%s \t%d\n", lnode->word, lnode->count); 67 lnode = lnode->next; 68 } 69} 70 71LNode *add_node(LNode *lnode, char *word){ 72 73#ifdef BASE 74 /* 読み込んだ単語をリストの最後に追加していくだけの処理 */ 75 if (lnode == NULL) 76 lnode = cons(word, 1); 77 else 78 lnode->next = add_node(lnode->next, word); 79 return lnode; 80#else 81/*未完成部分*/ 82#endif 83} 84

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

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

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

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

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

Zuishin

2022/12/07 02:45 編集

これは何の役に立つプログラムですか? 言葉を変えると、何のために作っているんですか? 恐らく連結リストでリニアサーチするよりも、二分探索のできるデータ構造やハッシュを使った方が実用的です。
janjanshishi

2022/12/07 03:04

詳しくは言えませんが、連結リスト使用例として使用するつもりです。連結リストはこんなことにも使えます、という説明をするつもりです。
Zuishin

2022/12/07 03:05

使い方を間違えていますね。 使用例よりも先に、連結リストの長所と短所を把握した方が良いと思います。
fana

2022/12/12 07:25

関数add_nodeに「再帰」での実装が要求されている意味がわからない. 具体的な内部実装の形態に関する縛りをわざわざ入れる 意味/理由 は何か? (誰かにそのように強制されていない限りはそんなこと言わねぇよな,とか邪推してしまうよ)
fana

2022/12/13 02:46

この質問,何かタグが無い状態になっているように見えますね. わざわざそのような編集をしたのでしょうか? それともその他の要因?
guest

回答1

0

ベストアンサー

質問丸投げだと長年プログラム書いてる人にしか
解決出来ないと思います笑
以下にコード書いておきます↓

C

1 2 LNode *nlnode; 3 4 if (lnode == NULL) { 5 return cons(word, 1); 6 } else if (strcmp(word, lnode->word) < 0) { 7 nlnode = cons(word, 1); 8 nlnode->next = lnode; 9 return nlnode; 10 } else if (strcmp(word, lnode->word) == 0) { 11 lnode->count++; 12 return lnode; 13 } else { 14 lnode->next = add_node(lnode->next, word); 15 return lnode; 16 } 17

あと、見ず知らずの人に敬語を使えない人には気を付けてください...笑
少なくともまともな人間ではありません笑

投稿2022/12/12 08:07

編集2022/12/12 08:08
lowhigh181

総合スコア7

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

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

janjanshishi

2022/12/12 08:18

実行出来ました。ありがとうございます。
Zuishin

2022/12/12 09:59

初心者向けの課題なので、長年の研鑽は不要です。 初心者が解けるようになっています。
janjanshishi

2022/12/12 11:31

あっ、えっと解決したので大丈夫です...どうかしましたか?
Zuishin

2022/12/13 03:02

あなたに言ったように見えましたか? > 質問丸投げだと長年プログラム書いてる人にしか > 解決出来ないと思います笑 これに対して、長年書かなくても容易に解決できる問題で、その理由として、初心者によく出される課題だからということを言いました。 長年書かないと解けないような問題を初心者に出すような理不尽なことが行われることは珍しいと思います。 少なくとも数年前まではそうでしたが、今の初心者のレベルが壊滅的に落ちているのであれば知りません。
Zuishin

2022/12/13 03:05

これを初心者レベルではないと感じる時代が来たのであれば、プログラミング教育の成果というものは全く出ていないようですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問