2013年5月21日火曜日

開発環境

プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)の第6章(構造体)、6.5(自己参照的構造体)、演習6-4を解いてみる。

その他参考書籍

演習 6-4.

コード

sample.c

#include <stdio.h>
#include <string.h>
#include <ctype.h>

struct tnode {
    char *word;
    int count;
    struct tnode *left;
    struct tnode *right;
};

#define MAXWORD 100
#define BUFSIZE 100

struct tnode *addtree(struct tnode *, char *);

struct tnode *talloc(void);
char *strdup(char *);
int getword(char *word, int lim);
int getch(void);
void ungetch(int);
void qsort(struct tnode *tnodes[], int, int);
void swap(struct tnode *tnodes[], int, int);
void append(struct tnode *, struct tnode *tnodes[]);
char buf[BUFSIZE];
int bufp = 0;
int n = 0;
enum { NO, YES };

int main()
{
    struct tnode *root;
    char word[MAXWORD];
    struct tnode *tnodes[1000];
    root = NULL;
    int i;
    
    while (getword(word, MAXWORD) != EOF)
        if(isalpha(word[0]))
            root = addtree(root, word);

    append(root, tnodes);

    qsort(tnodes, 0, n - 1);
    
    for (i = 0; i < n; i++)
        printf("%d %s\n", tnodes[i]->count, tnodes[i]->word);
    return 0;
}

void append(struct tnode *p, struct tnode *tnodes[])
{
    if (p != NULL) {
        append(p->left, tnodes);
        tnodes[n++] = p;
        append(p->right, tnodes);
    }
}

struct tnode *addtree(struct tnode *p, char *w)
{
    int cond;
    if (p == NULL) {
        p = talloc();
        p->word = strdup(w);
        p->count = 1;
        p->left = p->right = NULL;
    } else if ((cond = strcmp(w, p->word)) == 0)
        p->count++;
    else if (cond < 0)
        p->left = addtree(p->left, w);
    else
        p->right = addtree(p->right, w);
    return p;
}

void qsort(struct tnode *tnodes[], int left, int right)
{
    int i, last;
    if (left >= right)
        return;
    swap(tnodes, left, (left + right) / 2);
    last = left;
    for (i = left + 1; i <= right; i++)
        if ((tnodes[i]->count - tnodes[left]->count) < 0)
            swap(tnodes, ++last, i);
    swap(tnodes, left, last);
    qsort(tnodes, left, last - 1);
    qsort(tnodes, last + 1, right);
}

void swap(struct tnode *tnodes[], int i, int j)
{
    struct tnode *tmp;
    
    tmp = tnodes[i];
    tnodes[i] = tnodes[j];
    tnodes[j] = tmp;
}

struct tnode *talloc(void)
{
    return (struct tnode *) malloc(sizeof(struct tnode));
}

char *strdup(char *s)
{
    char *p;
    
    p = (char *) malloc(strlen(s) + 1);
    if (p != NULL)
        strcpy(p, s);
    return p;
}

int getword(char *word, int lim)
{
    int c;
    char *w = word;
    
    while (isspace(c = getch()))
        ;
    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
2 heart
2 i
2 Desire
2 Fate
2 Heart
2 I
2 love
2 Re
2 Ah
2 would
2 Love
2 Would
2 Scheme
2 desire
2 Things
2 To
2 re
2 fate
2 scheme
2 ah
2 things
4 mould
4 shatter
4 entire
4 sorry
4 nearer
4 the
4 of
4 then
4 s
4 you
4 conspire
4 this
4 grasp
4 we
4 not
4 with
4 could
4 bits
8 it
8 and
10 to
$ cat sample.c | ./a.out
1 isalnum
1 too
1 isspace
1 YES
1 main
1 characters
1 many
1 d
1 sizeof
1 getchar
1 stdio
1 break
1 strcmp
1 enum
1 strcpy
1 ctype
1 string
1 NO
1 strlen
2 isalpha
2 printf
2 malloc
2 define
2 while
2 EOF
3 j
3 cond
3 h
3 include
3 buf
3 BUFSIZE
3 for
3 getword
3 strdup
3 lim
3 talloc
3 MAXWORD
3 tmp
4 else
4 s
4 getch
4 ungetch
5 root
5 bufp
5 qsort
5 append
5 NULL
5 addtree
5 swap
6 last
6 count
6 n
8 return
8 c
10 right
12 if
12 void
12 word
12 w
14 char
14 left
15 i
22 struct
22 tnode
24 p
24 int
25 tnodes
$

0 コメント:

コメントを投稿