開発環境
- OS X Lion - Apple(OS)
- Emacs、BBEdit - Bare Bones Software, Inc. (Text Editor)
- プログラミング言語: C
- Clang (コンパイラ)
プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)の第6章(構造体)、6.5(自己参照的構造体)、演習6-3を解いてみる。
その他参考書籍
- プログラミング言語Cアンサー・ブック 第2版 (クロビス・L.トンド、スコット・E.ギンペル(著)、矢吹 道郎(翻訳))
演習 6-3.
コード
sample.c
#include <stdio.h> #include <string.h> #include <ctype.h> #include <stdlib.h> struct linenums { int linenum; struct linenums *p; }; struct tnode { char *word; struct linenums *nums; struct tnode *left; struct tnode *right; }; #define MAXWORD 100 #define BUFSIZE 100 #define NOISEWORDN 10 struct tnode *addtree(struct tnode *, char *, int); void addlinenum(struct tnode *, int); void treeprint(struct tnode *); struct tnode *talloc(void); struct linenums *lalloc(void); char *strdup(char *); int getword(char *word, int lim); int getch(void); void ungetch(int); int noiseword(char *word); char buf[BUFSIZE]; int bufp = 0; enum { NO, YES }; int main() { struct tnode *root; char word[MAXWORD]; int linenum = 1; root = NULL; while (getword(word, MAXWORD) != EOF) { if(isalpha(word[0]) && !noiseword(word)) root = addtree(root, word, linenum); else if (word[0] == '\n') linenum++; } treeprint(root); return 0; } struct tnode *addtree(struct tnode *p, char *w, int n) { int cond; if (p == NULL) { p = talloc(); p->word = strdup(w); p->nums = lalloc(); p->nums->linenum = n; p->nums->p = NULL; p->left = p->right = NULL; } else if ((cond = strcmp(w, p->word)) == 0) addlinenum(p, n); else if (cond < 0) p->left = addtree(p->left, w, n); else p->right = addtree(p->right, w, n); return p; } void addlinenum(struct tnode *p, int n) { struct linenums *tmp; tmp = p->nums; while (tmp->linenum != n && tmp->p != NULL) tmp = tmp->p; if (tmp->linenum != n) { tmp->p = lalloc(); tmp->p->linenum = n; tmp->p->p = NULL; } } void treeprint(struct tnode *p) { struct linenums *tmp; if (p != NULL) { treeprint(p->left); printf("%-10s ", p->word); for (tmp = p->nums; tmp != NULL; tmp = tmp->p) printf("%d ", tmp->linenum); printf("\n"); treeprint(p->right); } } struct tnode *talloc(void) { return (struct tnode *) malloc(sizeof(struct tnode)); } struct linenums *lalloc(void) { return (struct linenums *) malloc(sizeof(struct linenums)); } char *strdup(char *s) { char *p; p = (char *) malloc(strlen(s) + 1); if (p != NULL) strcpy(p, s); return p; } int noiseword(char *word) { char *nw[NOISEWORDN] = { "a", "A", "an", "An", "the", "The", "and", "AND", "i", "I" }; int i; for (i = 0; i < NOISEWORDN; i++) if (strcmp(word, nw[i]) == 0) return YES; return NO; } int getword(char *word, int lim) { int c; char *w = word; while (isspace(c = getch()) && c != '\n') ; if (c != EOF) *w++ = c; if (!isalpha(c)) { *w = '\0'; return c; } for (; --lim > 0; w++) if (!isalnum(*w = getch())) { ungetch(*w); break; } *w = '\0'; return word[0]; } int getch(void) { return (bufp > 0) ? buf[--bufp] : getchar(); } void ungetch(int c) { if (bufp >= BUFSIZE) printf("ungetch: too many characters\n"); else buf[bufp++] = c; }
入出力結果(Terminal)
$ cat sample.txt Ah Love! could you and I with Fate conspire To grasp this sorry Scheme of Things entire, Would not we shatter it to bits -- and then Re-mould it nearer to the Heart's Desire! ah love! could you and i with fate conspire to grasp this sorry scheme of things entire, would not we shatter it to bits -- and then re-mould it nearer to the heart's desire! !@#$%Ah Love! could you and I with Fate conspire !@#$%To grasp this sorry Scheme of Things entire, !@#$%Would not we shatter it to bits -- and then !@#$%Re-mould it nearer to the Heart's Desire! !@#$%ah love! could you and i with fate conspire !@#$%to grasp this sorry scheme of things entire, !@#$%would not we shatter it to bits -- and then !@#$%re-mould it nearer to the heart's desire! $ cat sample.txt | ./a.out Ah 1 9 Desire 4 12 Fate 1 9 Heart 4 12 Love 1 9 Re 4 12 Scheme 2 10 Things 2 10 To 2 10 Would 3 11 ah 5 13 bits 3 7 11 15 conspire 1 5 9 13 could 1 5 9 13 desire 8 16 entire 2 6 10 14 fate 5 13 grasp 2 6 10 14 heart 8 16 it 3 4 7 8 11 12 15 16 love 5 13 mould 4 8 12 16 nearer 4 8 12 16 not 3 7 11 15 of 2 6 10 14 re 8 16 s 4 8 12 16 scheme 6 14 shatter 3 7 11 15 sorry 2 6 10 14 then 3 7 11 15 things 6 14 this 2 6 10 14 to 3 4 6 7 8 11 12 14 15 16 we 3 7 11 15 with 1 5 9 13 would 7 15 you 1 5 9 13 $
0 コメント:
コメントを投稿