55 * By Faisal Saadatmand
66 */
77
8- #include <stdio.h>
8+ /* NOTE: I included a definition for sorttree and copytree for academic
9+ * purposes. They are not used in the code */
10+
911#include <ctype.h>
10- #include <string .h>
12+ #include <stdio .h>
1113#include <stdlib.h>
14+ #include <string.h>
1215
1316#define MAXWORD 100
1417#define BUFSIZE 100
1518
19+ /* types */
1620struct tnode {
1721 char * word ;
1822 int count ;
@@ -22,98 +26,43 @@ struct tnode {
2226
2327/* functions */
2428int getword (char * , int );
25- struct tnode * talloc (void ); /* allocate memory to new tree node */
26- char * strDup (char * ); /* copy string into safe place */
29+ struct tnode * talloc (void ); /* allocate memory to new tree node */
30+ char * strDup (char * ); /* copy string into safe place */
2731struct tnode * addtree (struct tnode * , char * );
28- void treeprint (struct tnode * );
29- struct tnode * copyTree (struct tnode * , struct tnode * );
30- struct tnode * sortTree (struct tnode * , struct tnode * );
31- struct tnode * freetree (struct tnode * );
32+ void printtree (struct tnode * );
33+ void freetree (struct tnode * );
34+ struct tnode * sorttree (struct tnode * , struct tnode * ); /* optional */
3235
3336/* globals */
34- int buf [BUFSIZE ]; /* buffer from ungetch */
35- int bufp = 0 ; /* next free position in buf */
36-
37- int getch (void ) /* get a (possibly pushed back) character */
38- {
39- return (bufp > 0 ) ? buf [-- bufp ] : getchar ();
40- }
41-
42- void ungetch (int c ) /* push character back on input */
43- {
44- if (bufp >= BUFSIZE )
45- printf ("ungetch: too many characters\n" );
46- else
47- buf [bufp ++ ] = c ;
48- }
49-
50- /* getword: get next word or character from input */
51- int getword (char * word , int lim )
52- {
53- int c , getch (void );
54- void ungetch (int );
55- char * w = word ;
56-
57- while (isspace (c = getch ()))
58- ;
59- if (c != EOF )
60- * w ++ = c ;
61- if (!isalpha (c )) {
62- * w = '\0' ;
63- return c ;
64- }
65- for ( ; -- lim > 0 ; w ++ )
66- if (!isalnum (* w = getch ())) {
67- ungetch (* w );
68- break ;
69- }
70- * w = '\0' ;
71- return word [0 ];
72- }
73-
74- /* talloc: make a tnode */
75- struct tnode * talloc (void )
76- {
77- return malloc (sizeof (struct tnode ));
78- }
79-
80- /*strDup: make a duplicate of s */
81- char * strDup (char * s )
82- {
83- char * p ;
84-
85- p = malloc (strlen (s ) + 1 ); /* +1 for '\0' */
86- if (p )
87- strcpy (p , s );
88- return p ;
89- }
37+ int buf [BUFSIZE ]; /* buffer from ungetch */
38+ int bufp = 0 ; /* next free position in buf */
9039
9140/* addtree: add a node with w, at or below p */
9241struct tnode * addtree (struct tnode * p , char * w )
9342{
9443 int cond ;
9544
96- if (!p ) { /* a new word has arrived */
45+ if (!p ) { /* a new word has arrived */
9746 p = talloc (); /* make a new node */
9847 p -> word = strDup (w ); /* copy data to it */
9948 p -> count = 1 ;
10049 p -> left = p -> right = NULL ;
101- } else if ((cond = strcmp (w , p -> word )) == 0 )
102- p -> count ++ ; /* repeated word */
50+ } else if (! (cond = strcmp (w , p -> word )))
51+ ++ p -> count ; /* repeated word */
10352 else if (cond < 0 ) /* less than into left subtree */
10453 p -> left = addtree (p -> left , w );
10554 else
10655 p -> right = addtree (p -> right , w );
10756 return p ;
10857}
10958
110- /* print: in-order print of tree p */
111- void treeprint (struct tnode * p )
59+ /* print: in-order print of tree p - decreasing order version */
60+ void printtree (struct tnode * p )
11261{
11362 if (p ) {
114- treeprint (p -> right );
63+ printtree (p -> right );
11564 printf ("%4d %s\n" , p -> count , p -> word );
116- treeprint (p -> left );
65+ printtree (p -> left );
11766 }
11867}
11968
@@ -132,45 +81,98 @@ struct tnode *copyTree(struct tnode *p, struct tnode *root)
13281 return p ;
13382}
13483
135- /* sortTree : performs inorder traversal on root and creates a BST p according
84+ /* sorttree : performs inorder traversal on root and creates a BST p according
13685 * to frequency of occurrence */
137- struct tnode * sortTree (struct tnode * p , struct tnode * root )
86+ struct tnode * sorttree (struct tnode * p , struct tnode * root )
13887{
88+ struct tnode * copyTree (struct tnode * , struct tnode * );
89+
13990 if (root ) {
140- p = sortTree (p , root -> left );
91+ p = sorttree (p , root -> left );
14192 p = copyTree (p , root );
142- p = sortTree (p , root -> right );
93+ p = sorttree (p , root -> right );
14394 }
14495 return p ;
14596}
14697
98+ /* talloc: make a tnode */
99+ struct tnode * talloc (void )
100+ {
101+ return malloc (sizeof (struct tnode ));
102+ }
103+
104+ /*strDup: make a duplicate of s */
105+ char * strDup (char * s )
106+ {
107+ char * p ;
108+
109+ p = malloc (strlen (s ) + 1 ); /* +1 for '\0' */
110+ if (p )
111+ strcpy (p , s );
112+ return p ;
113+ }
114+
147115/* freetree: free allocated heap memory of node tree */
148- struct tnode * freetree (struct tnode * node )
116+ void freetree (struct tnode * node )
149117{
150- if (node ) {
151- freetree (node -> left );
152- freetree (node -> right );
153- free (node -> word );
154- free (node );
118+ if (!node )
119+ return ;
120+ freetree (node -> left );
121+ freetree (node -> right );
122+ free (node -> word );
123+ free (node );
124+ }
125+
126+ /* getword: get next word or character from input */
127+ int getword (char * word , int lim )
128+ {
129+ int c , getch (void );
130+ void ungetch (int );
131+ char * w = word ;
132+
133+ while (isblank (c = getch ()))
134+ ;
135+ if (c != EOF )
136+ * w ++ = c ;
137+ if (!isalpha (c )) {
138+ * w = '\0' ;
139+ return c ;
155140 }
156- return node ;
141+ for ( ; -- lim > 0 ; w ++ )
142+ if (!isalnum (* w = getch ())) {
143+ ungetch (* w );
144+ break ;
145+ }
146+ * w = '\0' ;
147+ return word [0 ];
148+ }
149+
150+ /* get a (possibly pushed back) character */
151+ int getch (void )
152+ {
153+ return (bufp > 0 ) ? buf [-- bufp ] : getchar ();
154+ }
155+
156+ /* push character back on input */
157+ void ungetch (int c )
158+ {
159+ if (bufp >= BUFSIZE )
160+ printf ("ungetch: too many characters\n" );
161+ else
162+ buf [bufp ++ ] = c ;
157163}
158164
159165int main (void )
160166{
161167 struct tnode * root ; /* root node */
162- struct tnode * sorted ; /* root node to sorted tree */
163168 char word [MAXWORD ]; /* currently read word */
164169
165- root = sorted = NULL ;
170+ root = NULL ;
166171 while (getword (word , MAXWORD ) != EOF )
167172 if (isalpha (word [0 ]))
168173 root = (addtree (root , word )); /* build tree */
169- sorted = sortTree (sorted , root );
170- treeprint (sorted );
171- /* clean up */
172- root = freetree (root );
173- sorted = freetree (sorted );
174- root = sorted = NULL ;
174+ printtree (root );
175+ freetree (root );
176+ root = NULL ;
175177 return 0 ;
176178}
0 commit comments