1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
/*
** Written by David Gerdes US Army Construction Engineering Research Lab
** April 1992
** Copyright 1992 USA-CERL All rights reserved.
**
*/
/*
** read from stdin and each line into a linked list of chars
** then print it back out. if there is any argument specified
** the lines will be printed out reversed.
*/
#include <stdio.h>
#include "linkm.h"
struct link {
char let;
struct link *next;
};
int
main (int argc, char *argv[])
{
register int i;
VOID_T *head;
struct link List, *tmp, *p;
int rev = 0;
char buf[4096];
if (argc == 2)
rev = 1;
List.next = NULL;
List.let = ' ';
link_set_chunk_size (1);
head = (VOID_T *) link_init (sizeof (struct link));
while (NULL != gets (buf))
{
for (i = 0 ; buf[i] != '\0' ; i++)
{
tmp = (struct link *) link_new (head);
tmp->let = buf[i];
if (rev)
add_link_rev (&List, tmp);
else
add_link (&List, tmp);
}
dumplist (&List);
p = List.next;
while (p != NULL && p->next != NULL)
{
tmp = p->next;
link_dispose (head, p);
p = tmp;
}
List.next = NULL;
}
link_cleanup (head);
exit (0);
}
int
add_link_rev (struct link *List, struct link *link)
{
struct link *p;
p = List->next;
List->next = link;
link->next = p;
}
int
add_link (struct link *List, struct link *link)
{
struct link *p;
p = List;
while (p->next != NULL)
p = p->next;
p->next = link;
link->next = NULL;
}
int
dumplist (struct link *List)
{
struct link *p;
p = List->next;
while (p != NULL)
{
putchar (p->let);
p = p->next;
}
putchar ('\n');
}
|