#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;
}
'c·c++ > c 프로그래밍' 카테고리의 다른 글
문자와 배열 (0) | 2011.12.11 |
---|---|
fprintf(stderr, "argggg"); 에 대하여 (0) | 2011.12.11 |
수억개의 자연수의 정렬 (0) | 2011.12.10 |
큰수 더하기 [간단한 버젼] (0) | 2011.12.08 |
이차원 배열을 동적으로 선언하여 사용하기 (0) | 2011.12.08 |