c·c++/c 프로그래밍

단어가 등장하는 줄세기

바로이순간 2011. 12. 10. 23:36

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

 

#define MAXWORD 100
struct line {
    int line_no;
    struct line *next;
};

 

struct tnode {
    char *word;
    struct line *lines;
    struct tnode *next;
};

 

static int line_number = 1;
int End_switch = 0;

 

struct tnode *talloc();
struct line *lalloc();
char *strdup1(char *);

 

void addTree(struct tnode *, char *);
void addLine(struct line *);
int seekdown(struct line *);
void rootprint(struct tnode *);
int getword(char *, int);

 

int main() {
    struct tnode *root;
    char word[MAXWORD];

 

    root=(struct tnode*)talloc();
    root->next=(struct tnode*)NULL;
    root->lines=(struct line*)NULL;

 

    while (getword (word, MAXWORD) != EOF) {
        if (isalpha (word[0]) && End_switch == 0)
            addTree(root, word);
        if (isalpha (word[0]) && End_switch != 0) {
            addTree(root, word);
            line_number++;
            End_switch = 0;
        }
    }
    rootprint(root->next);

 

    return 0;
}

 

void addNewNode(struct tnode *node, char *w) {
    struct tnode *pn;
    struct line *pl;

 

    node->next=pn=talloc();
    pn->lines = pl = lalloc();
    pl->line_no = line_number ;
    pl->next = NULL;
    pn->word = strdup1(w);
    pn->next = NULL;
}

 

/* 문자형 포인터 변수에 마디를 추가하고 구조체 포인터 p에 위치시킨다. */
void addTree(struct tnode *node, char *w) {
    while(node->next && (strcmp(node->next->word,w) != 0))

        node = node->next;
    if (node->next==NULL)
        addNewNode(node,w);
    else
        addLine(node->next->lines);

}

 

void addLine(struct line *pl) {
    struct line *pp;

 

    if (seekdown(pl)) return ;
    while(pl && pl->next) pl=pl->next;
    pl->next = pp = lalloc();
    pp->next = NULL;
    pp->line_no = line_number;
}

 

int seekdown(struct line *pl) {
    while(pl) {
        if(line_number == pl->line_no) return 1;
        pl=pl->next;
    }
    return 0;
}

 

/* 트리 p 에 있는 마디를 순서대로 출력한다. */
void rootprint (struct tnode *p) {
 
    while(p) {
        struct line* pl;
        printf("%s ", p->word);
        pl=p->lines;
        while(pl) {
            printf("%d ",pl->line_no);
            pl=pl->next;
        }
        putchar('\n');
        p=p->next;
    }
}

 

/* 마디(node)를 만든다. */
struct tnode *talloc() {
    return (struct tnode *) malloc (sizeof(struct tnode));
}

 

struct line *lalloc() {
    return (struct line *) malloc (sizeof(struct line));
}

 

/* 주어진 문자형 포인터를 복사시킨뒤 반환한다.*/
char *strdup1(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;
    int getch();
    void ungetch(int);
    char *w= word;

 

    while (isspace(c =getch()))
        ;

 

    if (c != EOF) *w++ = c;
    if (!isalpha(c) && c != '\n') {
        *w = '\0';
        return c;
    }

 

    while(--lim > 0) {
        if ( !isalnum(*w =getch()) && *w !='\n' ) {
            ungetch(*w);
            break;
        } else if(*w=='\n') {
            End_switch = 1;
            ungetch(*w);
            break;
        }
        ++w;
    }
    *w = '\0';
    return word[0];
}

 

#define BUFSIZE 100

char buf[BUFSIZE];
int bufp = 0;

 

/* 문자를 받는다. */
int getch() {
    return (bufp >0) ? buf[--bufp] : getchar( );
}

 

/* 입력으로 받은 문자를 되돌린다. */
void ungetch(int c) {
    if (bufp >= BUFSIZE)
        printf("ungetch : too many character\n");
    else
        buf[bufp++] = c;
}