1 // This code uses nested functions, which were introduced to C in the 1999
2 // standard, so it won't compile on some older compilers. To compile with GCC,
3 // use "gcc -std=c99 reverse.c".
7 typedef struct List List;
15 List* makeList(void* head, List* tail)
17 List* result = malloc(sizeof(result));
23 List* reverse(List* list)
25 List* internal(List* in, List* out)
30 return internal(in->tail, makeList(in->head, out));
33 return internal(list,NULL);
40 void test_reverseOnEmptyList()
44 List* result = reverse(fixture);
46 assert(result == NULL);
49 void test_reverseOnSingleElementList()
52 List* fixture = makeList(&one,NULL);
54 List* result = reverse(fixture);
56 assert(result->head == &one);
57 assert(result->tail == NULL);
60 void test_reverseOnMultiElementList()
62 int one = 1, two = 2, three = 3;
63 List* fixture = makeList(&one, makeList(&two, makeList(&three, NULL)));
65 List* result = reverse(fixture);
67 assert(result->head == &three);
68 assert(result->tail->head == &two);
69 assert(result->tail->tail->head == &one);
70 assert(result->tail->tail->tail == NULL);
73 void test_doublyReversedListIsSameAsOriginal()
75 int listsAreEqual(List* left, List* right)
77 if(left == NULL && right == NULL)
80 if(left == NULL || right == NULL || left->head != right->head)
83 return listsAreEqual(left->tail, right->tail);
86 int one = 1, two = 2, three = 3;
87 List* fixture = makeList(&one, makeList(&two, makeList(&three, NULL)));
89 List* result = reverse(reverse(fixture));
91 assert(listsAreEqual(fixture, result));
94 int main(int argc, char** argv)
96 test_reverseOnEmptyList();
97 test_reverseOnSingleElementList();
98 test_reverseOnMultiElementList();
99 test_doublyReversedListIsSameAsOriginal();
101 printf("All tests passed.\n");