/* * Here 's the code. Try commenting out the line that says "WTF mate!" * On my machine, the loop never returns. Somehow printf makes it work. * Compiler bug or not? Please compile and confirm. */
#include <stdio.h> #include <stdlib.h> typedef struct List List; struct List { int data; List *next; }; List *new(int); List *add(List *, List *); List *merge(List *, List *); int main(void) { List *a, *b, *t, *p; a = b = t = p = NULL; int i; for (i = 0; i < 10; i += 2) a = add(a, new(i)); for (i = 1; i < 10; i += 2) b = add(b, new(i)); printf("Printing a...\n"); for (t = a; t != NULL; t = t->next) printf("%d ", t->data); printf("\n"); printf("Printing b...\n"); for (t = b; t != NULL; t = t->next) printf("%d ", t->data); printf("\n"); printf("Merging a and b..."); p = merge(a, b); printf("done.\n"); printf("Printing...\n"); for (t = p; t != NULL; t = t->next) printf("%d ", t->data); printf("\n"); exit(0); } List * new(int data) { List *newp; newp = malloc(sizeof(List)); newp->data = data; newp->next = NULL; return newp; } List * add(List *listp, List *newp) { List *p; if (listp == NULL) return newp; for (p = listp; p->next != NULL; p = p->next) ; p->next = newp; return listp; } List * merge(List *ap, List *bp) { List *listp; List **last; last = &listp; for (;;) { if (ap == NULL) { (*last)->next = bp; break; } else if (bp == NULL) { (*last)->next = ap; break; } printf("\nWTF mate!\n"); /* problem here */ if (ap->data < bp->data) { (*last)->next = ap; ap = ap->next; } else { (*last)->next = bp; bp = bp->next; } last = &((*last)->next); } return listp->next; }