#include #include typedef struct Number { int num; struct Number *nxt; } Number; Number *list_toend(Number *list, int what) { Number *newel = (Number*) malloc(sizeof(Number)); newel->num = what; newel->nxt = NULL; if (list == NULL) return newel; else { Number *iter; for (iter = list; iter->nxt != NULL; iter = iter->nxt) ; /* empty for loop */ iter->nxt = newel; return list; } } /* Reverses a linked list and * returns the pointer to the head of the reversed one. * Attention: the original list will be gone! The function uses * the elements of the original list to build the reversed one. * Usage: * numbers = list_reverse(numbers); */ Number *list_reverse(Number *list) { Number *original = list; Number *reversed = NULL; while (original != NULL) { Number *relinked = original, *next = original->nxt; relinked->nxt = reversed; /* add to the reversed */ /* 1 */ reversed = relinked; /* 2 */ original = next; /* take next fro morig.*/ /* 3 */ } return reversed; } void list_print(Number *list) { Number *iter; for (iter = list; iter != NULL; iter = iter->nxt) printf("%d ", iter->num); printf("\n"); } void list_free(Number *list) { while (list != NULL) { Number *nxt = list->nxt; free(list); list = nxt; } } int main(void) { Number *list = NULL; int n; printf("Enter numbers, I will put them to a list. Enter 0 to finish.\n"); printf("Then I print it, reverse it, and print the reversed one.\n"); scanf("%d", &n); while (n != 0) { list = list_toend(list, n); scanf("%d", &n); } list_print(list); list = list_reverse(list); list_print(list); list_free(list); return 0; }