diff --git a/alloc.c b/alloc.c
index 931b9fd59da6368f6a48cfa9f681133f918b162b..82e21440359c1b256a988a41f1dd3f66a8d2806e 100644
--- a/alloc.c
+++ b/alloc.c
@@ -1 +1,345 @@
 #include "alloc.h"
+#include <unistd.h>
+
+unsigned int n_link;
+unsigned int stacked_link;
+meta * meta_header[100];
+
+char Algorithm;
+
+void * m_malloc(size_t size)
+{
+	unsigned int new_size;
+	unsigned int adjust;
+	meta * temp;
+
+	adjust = size % 4;
+	if(adjust == 0)
+		new_size = size;
+	else
+		new_size = size + (4 - adjust);
+	
+	temp = search_and_split(new_size);	
+
+	if(temp == NULL)
+	{
+		meta_header[n_link] = sbrk( sizeof(meta) ); // because meta's size = 16
+		meta_header[n_link]->free = 0;
+		meta_header[n_link]->size = new_size;
+
+		set_link();
+		n_link++;
+
+	}
+	else
+	{
+		printf("dlrjakwsi?\n");
+		return temp + 1;
+	}
+//	printf(" ")	;
+	return sbrk(size); // return address to pointer
+
+
+}
+void * m_realloc(void *ptr , size_t size)
+{
+	int flag1, flag2;
+	flag1 = 0;
+	flag2 = 0;
+	int compare_size = 0;
+	unsigned int save = 0;
+	meta * temp = NULL;
+	save = ptr;
+	temp = save - 0x10;
+//	printf("temp -> size %d and size %d\n",temp->size, size);
+//*/******************************************
+	unsigned int adjust;
+	unsigned int new_size;
+	meta * save_temp;
+	unsigned int save_size;
+	unsigned int save_tail;
+	adjust = size % 4;
+	if(adjust == 0)
+		new_size = size;
+	else
+		new_size = size + (4 - adjust);
+	
+	if(temp ->size == new_size)
+			return ptr;
+//***********************************************/	    
+	if(META.Tail == temp)
+	{
+		if(temp -> size > new_size)
+		{
+			temp -> size = new_size;
+			brk(ptr + new_size);
+			return ptr;
+		}
+	}
+
+	if ( (int) temp -> size -(int) new_size >= 20)
+	{
+		split_block(temp, new_size); // split and add meta
+		return ptr;
+	}
+	else if( (int) temp -> size > (int) new_size)
+	{
+		return ptr; // no change
+	}
+//****************************************
+	flag1 = m_search(temp);
+	if(flag1 == 1)
+	{
+		compare_size = temp -> size + temp -> next ->size + 0x10;
+		if(compare_size < new_size)
+		{
+			
+			// malloc and memcpy 
+		}
+		else if((int)compare_size >= (int)new_size + 20)
+		{
+			temp -> size = new_size;
+			save = temp;
+			temp -> next = save + new_size + 0x10;
+			temp -> next -> size = compare_size - new_size - 16;
+			temp -> next -> next = (unsigned int)temp + compare_size + 0x10;
+			return ptr;
+		}
+		else if( (int)compare_size >= (int)new_size)
+		{
+			temp -> size = compare_size;
+			temp -> next = temp -> next -> next;
+			temp -> next -> prev = temp;		
+			return ptr;
+		}
+		
+	}
+	save_temp = ptr;
+	save_size = temp -> size;
+	/*
+	m_free(ptr);
+//	brk( (unsigned int )META.Tail + META.Tail ->size + 0x10);
+	ptr = m_malloc( (size_t) new_size);
+	memmove(ptr, (void *)save_temp , save_size);
+	*/
+	return re_allocate(ptr, temp, new_size);
+
+
+
+//***************************************************
+
+
+}
+void * re_allocate(void * ptr, meta * temp, size_t new_size )
+{
+	unsigned int save_temp;
+	unsigned int save_size;
+	save_size = temp -> size;
+    save_temp = ptr;
+	m_free(ptr);
+	ptr = m_malloc( (size_t) new_size);
+	memmove(ptr, (void *)save_temp, save_size);
+	
+	return ptr;
+
+}
+void split_block(meta * temp, unsigned int new_size)
+{
+	unsigned int save;
+	save = temp;
+	meta_header[n_link] = save + 0x10 + new_size;
+	meta_header[n_link] ->free = 1;
+	
+	meta_header[n_link] -> next = temp -> next;
+	meta_header[n_link] -> next -> prev = meta_header[n_link];
+	temp ->next = meta_header[n_link];
+	meta_header[n_link] -> prev = temp;
+
+	meta_header[n_link] -> size = temp ->size - new_size - 0x10;
+	temp -> free = 0;
+	temp -> size = new_size;		
+
+	n_link++;
+	 
+	return;
+}
+
+
+int m_search(meta * ptr)
+{
+	 if(ptr ->next != NULL )
+	 {
+		if(ptr -> next -> free == 1)
+		return 1;
+	 }
+	return 0;
+}
+  
+
+
+void * m_free( void *ptr)
+{
+	meta * temp;
+	temp = ptr - 0x10;
+//	printf("size : %d \n",temp->size);
+	
+	temp ->free = 1;
+
+	if(temp -> prev != NULL && temp -> prev -> free == 1) //merge 
+	{
+		if( temp == META.Tail)
+		{
+			META.Tail = META.Tail -> prev;
+			temp -> prev -> next = temp -> next;
+			temp -> prev -> size += temp -> size + 0x10;
+		}
+		else
+		{
+			temp -> prev -> next = temp -> next;
+			temp -> next -> prev = temp -> prev;
+			temp -> prev -> size += temp -> size + 0x10;
+		}
+//		printf("check\n");
+		return m_free(temp -> prev + 1);
+	}
+	else if(temp -> next != NULL && temp ->next -> free == 1) // merge
+	{
+		if(temp -> next -> next == NULL)
+		{
+			temp ->size += temp ->next -> size + 0x10;
+			temp ->next = NULL;
+			META.Tail = temp;
+			
+
+		}
+		else
+		{
+			temp -> size += temp -> next ->size + 0x10;
+			temp -> next = temp ->next ->next;
+			temp -> next -> prev = temp;
+		}
+//		printf("yee..\n");
+		return m_free(ptr);
+	}
+	else if(temp -> next == NULL && temp -> prev == NULL)
+	{
+			printf("durldhsi??\n");
+			META.Head = NULL;
+			META.Tail = NULL;
+			brk(NULL);
+	}
+
+	else if(temp -> next == NULL)
+	{
+// ************************************
+			
+		META.Tail ->prev ->next = NULL;
+		META.Tail = META.Tail -> prev;
+		brk(ptr - 0x10);
+
+		return;
+	}
+//	printf("??\n");
+
+}
+void set_link(void)
+{
+	if(META.Head == NULL)
+	{
+
+		META.Head = meta_header[n_link];
+		META.Tail = meta_header[n_link];
+		meta_header[n_link]->prev = NULL;
+		meta_header[n_link]->next = NULL;
+		//printf("twice\n");
+	}
+	else
+	{
+		meta_header[n_link]->prev = META.Tail;
+		meta_header[n_link]->next = NULL;
+		META.Tail -> next = meta_header[n_link];
+		META.Tail = meta_header[n_link];
+
+	}
+	
+}
+meta * search_and_split(size_t size)
+{
+		
+	meta * temp = NULL;
+	temp = META.Head;
+	unsigned int diff;
+	unsigned int save;
+	while(temp != NULL)
+	{
+		if(temp->free == 1 && temp->size >= size)
+		{
+			//	printf("nonono...\n");
+			diff = temp->size - size;
+				
+				if(diff >= 20)
+				{
+					save = temp;
+					meta_header[n_link] = save + 16  +(unsigned int)size;
+					meta_header[n_link] -> free = 1;
+
+					meta_header[n_link] -> next = temp -> next;
+					meta_header[n_link] -> next -> prev = meta_header[n_link];
+					temp -> next = meta_header[n_link];
+					meta_header[n_link] -> prev = temp;
+					
+					meta_header[n_link] -> size = temp -> size - size - 16;
+					temp ->free = 0;
+					temp ->size = size;
+					n_link++;
+					return temp;
+
+
+				}
+				else 
+				{
+//					printf("temp = %p\n",temp);
+					return temp;
+
+				}
+				
+			
+			
+		}
+		temp = temp -> next;
+	}
+
+	return NULL;
+
+
+}
+void print_link(void)
+{
+	meta * temp = NULL;
+	temp = META.Head;
+	while(temp != NULL)
+	{
+		printf("----------------\n");
+		printf("size = %d\n",temp->size);
+		printf("free = %d\n",temp->free);
+		printf("address = %p\n",temp);
+		temp = temp -> next;
+	}
+
+}
+void reverse_print(void)
+{
+	meta * temp = NULL;
+	temp = META.Tail;
+	while(temp != NULL)
+	{
+		printf("----------------\n");
+		printf("size = %d\n",temp->size);
+		printf("free = %d\n",temp->free);
+		printf("address = %p\n",temp);
+		temp = temp -> prev;
+	
+	}
+
+
+}
diff --git a/alloc.h b/alloc.h
index f417000e963943bdc526b85344ced3aaccbdc525..a1f30cde3957b707c95a19ada9941c1470a30bd1 100644
--- a/alloc.h
+++ b/alloc.h
@@ -2,6 +2,7 @@
 #define _ALLOC_H_
 #include <unistd.h>
 #include <stdio.h>
+#include <string.h>
 typedef struct meta_struct {
 struct meta_struct * prev;
 struct meta_struct * next;
@@ -24,10 +25,16 @@ void * m_free (void * ptr);
 
 void set_link(void);
 
+int m_search(meta *ptr);
+
 meta * search_and_split(size_t size);
 
 void print_link(void);
 
+void split_block(meta * temp, unsigned int new_size);
+
+void * re_allocate(void *ptr, meta *temp, size_t new_size);
+
 void reverse_print(void);
 
 #endif