Advertisement
aadeg

Untitled

Mar 3rd, 2015
260
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.10 KB | None | 0 0
  1. /*
  2.  * list.cpp
  3.  *
  4.  *  Created on: 03/mar/2015
  5.  *      Author: andrea
  6.  */
  7.  
  8. #include "list.h"
  9.  
  10. typedef struct node {
  11.     struct node* prev;
  12.     struct node* next;
  13.  
  14.     int value;
  15. } node;
  16.  
  17. typedef struct list {
  18.     struct node* head;
  19.     struct node* end;
  20.     int size;
  21. } list;
  22.  
  23. struct list* newList(){
  24.     list* l = malloc(sizeof(list));
  25.     l->head = NULL;
  26.     l->end = NULL;
  27.     return l;
  28. }
  29.  
  30. struct node* newNode(int value){
  31.     node* n = malloc(sizeof(node));
  32.     n->next = NULL;
  33.     n->prev = NULL;
  34.     n->value = value;
  35.     return &n;
  36. }
  37.  
  38. int addAfter(list* list, node* __new, node* prev){
  39.     if ((list == NULL) || (node == NULL)){
  40.         return -1;
  41.     }
  42.  
  43.     if (list->head == NULL){    // Lista vuota
  44.         list->head = node;
  45.         list->end = node;
  46.         __new->prev = NULL;
  47.         __new->next = NULL;
  48.     } else if (prev == NULL){   // In cima alla lista
  49.         __new->next = list->head;
  50.         __new->prev = list->head;
  51.         list->head->prev = __new;
  52.         list->head = __new;
  53.     } else if (prev == list->end){ // In fondo alla lista
  54.         __new->next = NULL;
  55.         __new->prev = list->end;
  56.         list->end->next = __new;
  57.         list->end = __new;
  58.     } else {
  59.         __new->next = prev->next;
  60.         __new->prev = prev;
  61.         prev->next = __new;
  62.         __new->next->prev = __new;
  63.     }
  64.  
  65.     list->size++;
  66.  
  67.     return 0;
  68. }
  69.  
  70. int addBefore(list* list, node* __new, node* next){
  71.     if ((list == NULL) || (node == NULL)){
  72.         return -1;
  73.     }
  74.  
  75.     node* prev = NULL;
  76.     if (next == NULL){
  77.         prev = list->end;
  78.     } else if (next == list->head){
  79.         prev = NULL;
  80.     } else {
  81.         prev = next->prev;
  82.     }
  83.  
  84.     return addAfter(list, __new, prev);
  85. }
  86.  
  87. int removeNode(list* list, node* node){
  88.     if (list == NULL || node == NULL){
  89.         return -1;
  90.     }
  91.  
  92.     if (node == list->head && node == list->end){
  93.         list->head = NULL;
  94.         list->end = NULL;
  95.     } else if (node == list->head){ // Rimuovere primo elemento
  96.         list->head = node->next;
  97.         node->next->prev = list->head;
  98.     } else if (node == list->end){  // Rimuovere l'ultimo elemento
  99.         list->end = node->prev;
  100.         node->prev->next = NULL;
  101.     } else {                        // Rimuovere un nodo nel mezzo della lista
  102.         node->prev->next = node->next;
  103.         node->next->prev = node->prev;
  104.     }
  105.  
  106.     free(node);
  107.  
  108.     return 0;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement