/*
 * 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;
}

Reply via email to