前提
標準入力からテキストを読み込み、連結リストを使ってテキストに出現する単語を辞書式順序になるように出力し、その単語の出現回数を表示するプログラムを作成しています。
実現したいこと
関数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
これは何の役に立つプログラムですか?
言葉を変えると、何のために作っているんですか?
恐らく連結リストでリニアサーチするよりも、二分探索のできるデータ構造やハッシュを使った方が実用的です。
詳しくは言えませんが、連結リスト使用例として使用するつもりです。連結リストはこんなことにも使えます、という説明をするつもりです。
使い方を間違えていますね。
使用例よりも先に、連結リストの長所と短所を把握した方が良いと思います。
関数add_nodeに「再帰」での実装が要求されている意味がわからない.
具体的な内部実装の形態に関する縛りをわざわざ入れる 意味/理由 は何か?
(誰かにそのように強制されていない限りはそんなこと言わねぇよな,とか邪推してしまうよ)
解決しました
この質問,何かタグが無い状態になっているように見えますね.
わざわざそのような編集をしたのでしょうか? それともその他の要因?

回答1件
あなたの回答
tips
プレビュー