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
|
/*
** Written by David Gerdes US Army Construction Engineering Research Lab
** April 1992
** Copyright 1992 USA-CERL All rights reserved.
**
*/
/*
** takes 1st command line argument and stuffs each letter of it into
** a linked list. then prints it back out to stdout.
** If a second argument is specified, the first argument is put in the
** list backwards.
*/
#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;
if (argc < 2)
fprintf (stderr, "Usage: %s str [rev]\n", argv[0]), exit (1);
if (argc > 2)
rev = 1;
List.next = NULL;
List.let = ' ';
head = (VOID_T *) link_init (sizeof (struct link));
for (i = 0 ; argv[1][i] ; i++)
{
tmp = (struct link *) link_new (head);
tmp->let = argv[1][i];
if (rev)
add_link_rev (&List, tmp);
else
add_link (&List, tmp);
}
dumplist (&List);
p = List.next;
while (p->next != NULL)
{
tmp = p->next;
link_dispose (head, p);
p = tmp;
}
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');
}
|