List.c

De la WikiLabs
Versiunea din 3 aprilie 2014 09:02, autor: Rhobincu (discuție | contribuții)
(dif) ← Versiunea anterioară | Versiunea curentă (dif) | Versiunea următoare → (dif)
Jump to navigationJump to search
#include "list.h"
#include <stdlib.h>


struct simply_linked_node * create_simply_linked_node(int data){
    struct simply_linked_node * new_node = 
        (struct simply_linked_node*)malloc(sizeof(struct simply_linked_list));
        
    new_node->data = data;
    new_node->next = NULL;
    
    return new_node;
}
 
struct simply_linked_list * create_simply_linked_list(int max_size){
    struct simply_linked_list * new_list = 
        (struct simply_linked_list*)malloc(sizeof(struct simply_linked_list));

    new_list->first = NULL;
    new_list->last = NULL;
    new_list->size = 0;
    new_list->max_size = max_size;

    return new_list;
}

int is_full(struct simply_linked_list * list){
    return list->max_size != UNLIMITED_SIZE && list->size == list->max_size;
}
 
void add_node_to_end_of_list(struct simply_linked_node * node, struct simply_linked_list * list){
    if(is_full(list)){
        return;
    }
    
    node->next = NULL;
    if(!list->size){
        list->first = node;
        list->last = node;
    }else{
        list->last->next = node;
        list->last = node;
    }
    
    list->size++;
}

struct simply_linked_node * get_node(struct simply_linked_list * list, unsigned position){
    struct simply_linked_node * node = list->first;
    while(node != NULL && position){
        node = node->next;
        position--;
    }
    return node;
}

void add_node_to_list(struct simply_linked_node * new_node, struct simply_linked_list * list, unsigned position){
    if(is_full(list)){
        return;
    }
    
    if(!position){
        new_node->next = list->first;
        list->first = new_node;
        if(!list->size){
            list->last = list->first; 
        }
    }else{
        struct simply_linked_node * node = get_node(list, position - 1);
        new_node->next = node->next;
        node->next = new_node;
    }
    
    list->size++;
}

void delete_node(struct simply_linked_list * list, unsigned position){
    struct simply_linked_node * old_node;

    if(!list->size){
        return;
    }
    
    
    if(position == 0){
        if(list->size == 1){
            free(list->first);
            list->first = NULL;
            list->last = NULL;
            list->size = 0;
        }else{
            old_node = list->first;
            list->first = old_node->next;
            free(old_node);
            list->size--;
        }
        return;
    }
    
    
    struct simply_linked_node * node = get_node(list, position - 1);
    
    if(node == NULL){
        return;
    }
    
    old_node = node->next;
    node->next = old_node->next;
    
    if(old_node == list->last){
        list->last = node;
    }
    list->size--;
    
    free(old_node);
}