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
|
/*
** 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 <grass/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');
}
|