tree.c
author Markus Bröker <mbroeker@largo.dyndns.tv>
Mon, 07 Jun 2010 23:20:47 +0200
changeset 132 54a04f5f141d
parent 77 49e0babccb23
permissions -rw-r--r--
Adjusted to show side effects and their handling When dealing with static buffers, successive calls point to the same memory location and overwrite formers ones... committer: Markus Bröker <mbroeker@largo.homelinux.org>

/**
 * tree.c
 * Copyright (C) 2008 Markus Broeker
 */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define GETRANDOM(max) (1+(int)((float)(max)*rand()/RAND_MAX+1.0))

struct T {
    int data;
    struct T *next;
};

typedef struct T T;

T *make_list (int elements, int rand_max)
{
    int i;

    T *t, *first = NULL;

    srand (time (NULL));

    if ((t = malloc (sizeof (T))) == NULL) {
        perror ("MALLOC");
        return first;
    }

    t->data = GETRANDOM (rand_max);
    t->next = NULL;

    first = t;

    for (i = 1; i < elements; i++) {
        if ((t->next = malloc (sizeof (T))) == NULL)
            break;
        t->next->data = GETRANDOM (rand_max);
        t = t->next;
    }

    t->next = NULL;

    return first;
}

int main (int argc, char **argv)
{
    T *t, *next;

    if (argc != 3) {
        printf ("Usage: %s <elements> <rand_max>\n", argv[0]);
        return EXIT_FAILURE;
    }

    t = make_list (atoi (argv[1]), atoi (argv[2]));

    while (t) {
        printf ("%d\n", t->data);
        next = t->next;
        free (t);
        t = next;
    };

    return EXIT_SUCCESS;
}