Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- enum { MAXLN = 256 };
- typedef struct words {
- char *word;
- struct words *next;
- } words;
- words *add2list (words **list, char *word);
- void print_list (words *list);
- void free_list (words *list);
- int main (int argc, char **argv) {
- words *wordlist = NULL; /* declare list */
- char line[MAXLN] = {0}; /* line buffer */
- char delim[] = " \t\n,.;"; /* delimiters */
- FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
- if (!fp) { /* validate file open */
- fprintf (stderr, "error: file open failed '%s'\n", argv[1]);
- return 1;
- }
- while (fgets (line, MAXLN, fp)) /* read each line in file */
- {
- char *p = NULL;
- /* tokenize line, add each word in line to linked-list */
- for (p = strtok (line, delim); p; p = strtok (NULL, delim))
- add2list (&wordlist, strdup (p)); /* allocate/copy p */
- }
- if (fp != stdin) fclose (fp);
- print_list (wordlist); /* print all nodes in list */
- free_list (wordlist); /* free all nodes in list */
- return 0;
- }
- /* add nodes to list */
- words *add2list (words **list, char *word)
- {
- words *node = calloc (1, sizeof *node); /* create node */
- if (!node) {
- fprintf (stderr, "add2list() error: virtual memory exhausted.\n");
- exit (EXIT_FAILURE);
- }
- node->word = word; /* assign values */
- node->next = NULL;
- if (!*list) { /* first node - add as first */
- (*list) = node;
- }
- else { /* second node - add as next */
- if ((*list)->next == NULL) {
- (*list)->next = node;
- }
- else { /* remaining nodes - add at end */
- words *iter = *list;
- while (iter->next) iter = iter->next;
- iter->next = node;
- }
- }
- return *list;
- }
- /* print all nodes in list */
- void print_list (words *list)
- {
- const words *iter = list; /* pointer to iterate list */
- if (iter == NULL) {
- fprintf (stderr,"print_list() warning: empty list.\n");
- return;
- }
- for (; iter; iter = (iter->next ? iter->next : NULL))
- printf (" %s\n", iter-> word);
- }
- /* free all nodes in list */
- void free_list (words *list)
- {
- words *iter = list; /* pointer to iterate list */
- words *victim = list; /* pointer to delete */
- if (iter == NULL) {
- fprintf (stderr,"print_list() warning: empty list.\n");
- return;
- }
- while (iter) {
- victim = iter;
- iter = iter->next;
- free (victim->word);
- free (victim);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement