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