Exemplo n.º 1
0
void Delete_Node(Node *self)
{
    if (self != NULL)
	{
        Delete_Node(self->children);
        Delete_Node(self->sibling);
        free(self);
    }
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
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;
}
Exemplo n.º 5
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;
}