#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define MAX 1000
typedef struct st_tag
{
void *baseAddr;
int size;
int free_flag;
struct st_tag *next;
}node_type;
void initialize_getmemory(void);
void print_mem_info(void);
void *mymalloc(int size);
void myfree(void *xx);
node_type *hptr;
void main()
{
int *iptr;
initialize_getmemory();
print_mem_info();
iptr=(int *)mymalloc(10*sizeof(int));
iptr[0]=10;
iptr[1]=20;
printf("The iptr[0]= %d addr = %u\n",iptr[0] , &iptr[0]);
printf("The iptr[1]= %d addr = %u\n",iptr[1] , &iptr[1]);
print_mem_info();
printf("Try to free memory\n");
myfree(iptr);
print_mem_info();
}
void *mymalloc(int size)
{
node_type *ptr=hptr;
node_type *temp;
int delta;
while(ptr)
{
if(ptr->free_flag == TRUE && ptr->size >=size)
{
break;
}
ptr=ptr->next;
}
if(ptr)
{
temp=(node_type *)malloc(sizeof(node_type));
temp->next=ptr->next;
ptr->next=temp;
delta = (int)ptr->baseAddr - (int)hptr->baseAddr;
temp->baseAddr=(void *)((int)ptr->baseAddr + MAX - (delta + size) );
temp->free_flag = FALSE;
temp->size = size;
ptr->size = ptr->size - size;
return (void *)temp->baseAddr;
}
else
{
return (void *)NULL;
}
}
void myfree(void *xx)
{
node_type *ptr;
node_type *temp;
int success=FALSE;
ptr=hptr;
if(ptr->baseAddr==xx)
{
success=TRUE;
if(ptr->next == NULL || ptr->next->free_flag == FALSE)
{
ptr->free_flag = TRUE;
}
else
{
ptr->free_flag = TRUE;
ptr->size = ptr->size + ptr->next->size;
ptr = ptr->next;
hptr->next = ptr->next;
free(ptr);
}
}
else
{
while(ptr->next)
{
if(ptr->next->baseAddr == xx)
{
success=TRUE;
if(ptr->free_flag == FALSE)
{
if(ptr->next->next == NULL || ptr->next->next->free_flag == FALSE)
{
ptr->next->free_flag = TRUE;
}
else
{
ptr=ptr->next;
ptr->free_flag = TRUE;
ptr->size = ptr->size + ptr->next->size;
temp=ptr->next;
ptr->next = temp->next;
free(temp);
}
}
else
{
if(ptr->next->next == NULL || ptr->next->next->free_flag == FALSE)
{
ptr->size = ptr->size + ptr->next->size;
temp=ptr->next;
ptr->next = temp->next;
free(temp);
}
else
{
ptr->size = ptr->size + ptr->next->size + ptr->next->next->size;
temp=ptr->next;
ptr->next = temp->next->next;
free(temp->next);
free(temp);
}
}
break;
}
ptr=ptr->next;
}
}
if(success == FALSE)
{
printf("Unable to free the memory\n");
}
}
void initialize_getmemory(void)
{
node_type *head;
head=(node_type *)malloc(sizeof(node_type));
head->baseAddr=(void *)malloc(MAX);
head->size=1000;
head->free_flag=TRUE;
head->next=NULL;
hptr=head;
}
void print_mem_info(void)
{
node_type *ptr=hptr;
while(ptr)
{
printf("The base address is %u\n",ptr->baseAddr);
printf("The size is %d\n",ptr->size);
printf("The free_flag %d\n\n",ptr->free_flag);
ptr=ptr->next;
}
}