here is a sort of calender
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

enum DAY {MON = 1, TUES, WED, THURS, FRI, SAT, SUN};
enum MONTH {JAN = 1, FEB, MARCH, APRIL, MAY, JUNE, JULY, AUG, SEPT, OCT, NOV, DEC};

typedef struct Days_Node
{
    int day_num;
    char *weekday;
    struct Days_Node *next;
}Days_Node;

typedef struct Months_Node
{
    int month_num;
    char *month;
    struct Months_Node *next;
}Months_Node;


typedef struct Lists
{
    struct Days_Node *current_day;
    struct Months_Node *current_month;
}Lists;

struct Days_Node  *debugDays[100];
int                ndebugDays = 0;

Days_Node *get_day_memory(void);
Months_Node *get_month_memory(void);
char *get_string_memory(int x);
void add_day_node(Lists *calender);
void set_day_data(Days_Node *node, int x);
void add_month_node(Lists *calender);
void set_month_data(Months_Node *node, int x);
void free_list(Lists *calender);
void adder(Lists *calender, Days_Node *node);
void adder_month(Lists *calender, Months_Node *node);
int days_in_month(int x);

int main()
{
    int i, j, num_days;
    char *endings[] = {"th", "st", "nd", "rd"};
    Lists calender;

    calender.current_day = NULL;
    calender.current_month = NULL;
    add_day_node(&calender);
    add_month_node(&calender);

    for ( i = 0 ; i < ndebugDays ; i++ )
    {
        printf("self=%p next=%p\n", debugDays[i], debugDays[i]->next);
    }

    while (calender.current_day->day_num != TUES)
    {
        calender.current_day = calender.current_day->next;
    }

    while (calender.current_month->month_num != JAN)
    {
        calender.current_month = calender.current_month->next;
    }

    for (j = 1; j < 13; j++)
    {
        num_days = days_in_month(j);
        for (i = 1; i < num_days; i ++)
        {
            printf("%s %d", calender.current_day->weekday, i);
            switch (i % 10)
            {
                case 1:
                    printf("%s ", endings[1]);
                    break;
                case 2:
                    printf("%s ", endings[2]);
                    break;
                case 3:
                    printf("%s ", endings[3]);
                    break;
                default:
                    printf("%s ", endings[0]);
            }
            printf("of %s\n", calender.current_month->month);
            calender.current_day = calender.current_day->next;
        }
        printf("\n\n");
        calender.current_month = calender.current_month->next;
    }

    free_list(&calender);

    return 0;
}

Days_Node *get_day_memory(void)
{
    Days_Node *result = malloc(sizeof(Days_Node));
    debugDays[ndebugDays++] = result;
    return result;
}

Months_Node *get_month_memory(void)
{
    return malloc(sizeof(Months_Node));
}

char *get_string_memory(int x)
{
    return (char *)malloc(x + 1);
}

void adder_day(Lists *calender, Days_Node *node)
{
    if ( calender->current_day == NULL )
    {
        // empty
        calender->current_day = node;
        node->next = node;
    }
    else
    {
        // more than one node
        node->next = calender->current_day->next; // A
        calender->current_day->next = node;       // B
        calender->current_day = node;             // C
    }
}

void add_day_node(Lists *calender)
{
    int i;
    for (i = 1; i < 8; i++)
    {
        Days_Node *tmp_node = get_day_memory();
        set_day_data(tmp_node, i);
        tmp_node->next = NULL;
        adder_day(calender, tmp_node);
    }
}

void set_day_data(Days_Node *node, int x)
{
    char *days[] = {"", "Monday", "Tuesday", "Wendnesday", "Thursday", "Friday", "Saturday", "Sunday"};

    if (!node)
    {
        fprintf(stderr, "unable to allocate memory");
        exit(EXIT_FAILURE);
    }
    node->day_num = x;
    node->weekday = get_string_memory(strlen(days[x]));
    strcpy(node->weekday, days[x]);
}

void adder_month(Lists *calender, Months_Node *node)
{
    if ( calender->current_month == NULL )
    {
        // empty
        calender->current_month = node;
        node->next = node;
    }
    else
    {
        // more than one node
        node->next = calender->current_month->next; // A
        calender->current_month->next = node;       // B
        calender->current_month = node;             // C
    }
}

void set_month_data(Months_Node *node, int x)
{
    char *months[] = {"",
                      "January",
                      "Febuary",
                      "March",
                      "April",
                      "May",
                      "June",
                      "July",
                      "August",
                      "September",
                      "October",
                      "November",
                      "December"};
    if (!node)
    {
        fprintf(stderr, "unable to allocate memory");
        exit(EXIT_FAILURE);
    }
    node->month_num = x;
    node->month = get_string_memory(strlen(months[x]));
    strcpy(node->month, months[x]);
}

void add_month_node(Lists *calender)
{
    int i;
    for (i = 1; i < 13; i++)
    {
        Months_Node *tmp_node = get_month_memory();
        set_month_data(tmp_node, i);
        tmp_node->next = NULL;
        adder_month(calender, tmp_node);
    }
}

void free_list(Lists *calender)
{
    Days_Node *tmp_node = calender->current_day->next; // tmp_node now points to monday
    Months_Node *tmp_month_node = calender->current_month->next;

    calender->current_day->next = NULL; // breaks the loop
    calender->current_day = tmp_node; //set calender->current_day to the head of the list as it is now a singley linked list

    calender->current_month->next = NULL;
    calender->current_month = tmp_month_node;

    printf("starting to free memory\n");
    while (calender->current_day)
    {
        tmp_node = calender->current_day->next;
        printf("%s ", calender->current_day->weekday);
        free(calender->current_day->weekday);
        free(calender->current_day);
        printf(" freed\n");
        calender->current_day = tmp_node;
    }

    printf("days freed\n");

    while (calender->current_month)
    {
        tmp_month_node = calender->current_month->next;
        printf("%s ", calender->current_month->month);
        free(calender->current_month->month);
        free(calender->current_month);
        printf(" freed\n");
        calender->current_month = tmp_month_node;
    }
    printf("finished freeing all memory\n");
}

int days_in_month(int x)
{
    int result;
    switch (x)
    {
        case FEB:
            result = 29; //28 + 1
            break;
        case JAN: case MARCH: case MAY: case JULY: case AUG: case OCT: case DEC:
            result = 32; //31 + 1for the <
            break;
        default:
            result = 31; //30 + 1
    }
    return result;
}
its primitive but it does what it says on the tin
coop