/*------------------------------------------------------------------------------ * find_mth_to_the_last.c: **----------------------------------------------------------------------------*/ /* Copyright (c) 2009 Peter Bui. All Rights Reserved. * * Peter Bui * **------------------------------------------------------------------------------ * Includes **----------------------------------------------------------------------------*/ #include #include /*------------------------------------------------------------------------------ * Type Definitions **----------------------------------------------------------------------------*/ struct slist_node { int data; struct slist_node *next; }; /*------------------------------------------------------------------------------ * Functions **----------------------------------------------------------------------------*/ struct slist_node * slist_node_alloc(int data) { struct slist_node *sn_next; sn_next = malloc(sizeof(struct slist_node)); sn_next->data = data; sn_next->next = NULL; return (sn_next); } struct slist_node * slist_node_append(struct slist_node *sn, int data) { struct slist_node *sn_next; sn_next = slist_node_alloc(data); sn->next = sn_next; return (sn_next); } struct slist_node * find_mth_to_the_last(struct slist_node *sn_head, int mth) { int i; struct slist_node *sn_mth = NULL, *sn_next; sn_mth = sn_next = sn_head; for (i = 0; i < mth && sn_next; i++) sn_next = sn_next->next; if (!sn_next) return ((i < mth) ? NULL : sn_mth); while (sn_next->next) { sn_next = sn_next->next; sn_mth = sn_mth->next; } return (sn_mth); } /*------------------------------------------------------------------------------ * Main Execution **----------------------------------------------------------------------------*/ int main(int argc, char* argv[]) { int data, mth; struct slist_node *sn_head = NULL, *sn_next = NULL, *sn_mth = NULL; while (scanf("%d", &data) && data >= 0) { if (!sn_head) sn_next = sn_head = slist_node_alloc(data); else sn_next = slist_node_append(sn_next, data); } while (scanf("%d", &mth) != EOF) { sn_mth = find_mth_to_the_last(sn_head, mth); printf("%d\n", (sn_mth) ? sn_mth->data : -1); } return (EXIT_SUCCESS); } /*------------------------------------------------------------------------------ * vim: sts=4 sw=4 ts=8 ft=c **----------------------------------------------------------------------------*/