void Delete_Node(Node *self) { if (self != NULL) { Delete_Node(self->children); Delete_Node(self->sibling); free(self); } }
int main(void){ int Option = 1; int Value; while(Option){ printf("1) Create linked-list\n2) Append linked-list\n3) Prepend linked-list\n4) Length Of linked-list\n5) Delete a node\n6) Reverse linked-list\n7) Delete linked-list\n8) Print linked-list\n0) Exit program\n"); scanf("%d", &Option); switch(Option){ case 1: printf("Enter a value: "); scanf("%d", &Value); Create_Linked_list(Value); printf("Linked-list created\n\n"); break; case 2: printf("Enter a value: "); scanf("%d", &Value); Append_Linked_list(Value); printf("Value appended to Linked-list\n\n"); break; case 3: printf("Enter a value: "); scanf("%d", &Value); Prepend_Linked_list(Value); printf("Value prepended to Linked-list\n\n"); break; case 4: Value = Length_Of_Linked_list(); printf("Linked-list length: %d\n\n", Value); break; case 5: printf("Enter a value: "); scanf("%d", &Value); Delete_Node(Value); printf("Value deleted from linked-list\n\n"); break; case 6: Reverse_Linked_list(); printf("Linked-list reversed\n\n"); break; case 7: Delete_Linked_list(); printf("Linked-list deleted\n\n"); break; case 8: Print_LinkedList(); break; case 0: Delete_Linked_list(); break; default: printf("Enter a valid choice\n\n"); } } return 1; }
int main(int argc, char const *argv[]) { int num; Dnode *head; head = Creat_Dlink(); Print_Dlink(head); printf("Delete_Node :\n"); scanf("%d",&num); head =Delete_Node(head,num); Print_Dlink(head); return 0; }
int Mem_Free(void *ptr){ //check edge cases if (ptr == NULL) return -1; ptr -= sizeof(node); node *tmpPtr = (node*) ptr; if (tmpPtr->wizard != -666) { m_error = E_BAD_POINTER; return -1; } //forward check - coalescion void *check_address = ptr + tmpPtr->data; node *forward_node; int check_forward = 1; while(check_forward != 0) { forward_node = Search_For_Node(check_address, &header); if (forward_node == NULL) { check_forward = 0; break; } else { if (forward_node->next != NULL) { tmpPtr->next = forward_node->next; } else { tmpPtr->next = NULL; } Delete_Node(forward_node, &header); check_address = check_address + forward_node->data; tmpPtr->data += forward_node->data; } } //back check - coalescion check_address = ptr; node *back_node; int size = tmpPtr->data; int check_back = 1; while(check_back != 0) { back_node = Search_For_Previous_Node(check_address, &header, size); if (back_node == NULL) { check_back = 0; break; } else { Delete_Node(back_node, &header); if (tmpPtr->next != NULL) { back_node->next = tmpPtr->next; } else { back_node->next = NULL; } check_address = check_address - back_node->data; back_node->data += tmpPtr->data; size = back_node->data; tmpPtr = back_node; } } //insert freed segment back into free list tmpPtr->wizard = -666; Insert_Node(&tmpPtr, &header); return 0; }
void *Mem_Alloc(int size, int style){ node* to_remove; node* new_free; void* return_ptr; //8-byte align for performance if (size % 8 != 0) { if (size < 8) { size = 8; } else { size = (size / 8 + 1) * 8; } } int total_size_free_space; size = (int)(size + sizeof(node)); //actual size needed is desired size + node size char* temp_ptr; //used to move forward during memory splitting //allocation handling, based on desired style switch (style){ case BESTFIT: to_remove = Get_Best_Fit(size, &header); if (to_remove == NULL) { m_error = E_NO_SPACE; return to_remove; break; } Delete_Node(to_remove, &header); total_size_free_space = to_remove->data; to_remove->data = size; if (total_size_free_space - size > 0) { temp_ptr = (char*) to_remove; temp_ptr += size; new_free = (node*) temp_ptr; new_free->data = total_size_free_space - size; new_free->next = to_remove->next; new_free->wizard = -666; Insert_Node(&new_free, &header); } return_ptr = (void*) to_remove; return_ptr += sizeof(node); return return_ptr; break; case WORSTFIT: to_remove = Get_Worst_Fit(size, &header); if (to_remove == NULL) { m_error = E_NO_SPACE; return to_remove; break; } Delete_Node(to_remove, &header); total_size_free_space = to_remove->data; to_remove->data = size; if (total_size_free_space - size > 0) { temp_ptr = (char*) to_remove; temp_ptr += size; new_free = (node*) temp_ptr; new_free->data = total_size_free_space - size; new_free->next = to_remove->next; new_free->wizard = -666; Insert_Node(&new_free, &header); } return_ptr = (void*) to_remove; return_ptr += sizeof(node); return return_ptr; break; case FIRSTFIT: to_remove = Get_First_Fit(size, &header); if (to_remove == NULL) { m_error = E_NO_SPACE; return to_remove; break; } Delete_Node(to_remove, &header); total_size_free_space = to_remove->data; to_remove->data = size; if (total_size_free_space - size > 0) { // move the pointer to the beginning of the new free space temp_ptr = (char*) to_remove; temp_ptr += size; new_free = (node*) temp_ptr; new_free->data = total_size_free_space - size; new_free->next = to_remove->next; new_free->wizard = -666; Insert_Node(&new_free, &header); } return_ptr = (void*) to_remove; return_ptr += sizeof(node); return return_ptr; break; } return NULL; }