arraylist.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /*
  2. * File: arraylist.c
  3. * Author: Arthur Brandao
  4. *
  5. * Created on 14 novembre 2018
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include "str.h"
  10. #include "arraylist.h"
  11. /* --- Fonctions publiques --- */
  12. void arraylist_ini(arraylist* al){
  13. al->first = NULL;
  14. al->last = NULL;
  15. al->size = 0;
  16. }
  17. al_node* arraylist_add(arraylist* al, char* key, char* val){
  18. int length;
  19. al_node* aln;
  20. //Regarde si la clef existe
  21. if((aln = arraylist_search(al, key)) != NULL){
  22. arraylist_delete(al, aln);
  23. }
  24. //Ajout des valeurs
  25. aln = malloc(sizeof(al_node));
  26. length = strlen(key);
  27. aln->key = malloc(sizeof(char) * (length + 1));
  28. memset(aln->key, 0, length + 1);
  29. strncpy(aln->key, key, length);
  30. length = strlen(val);
  31. aln->val = malloc(sizeof(char) * (length + 1));
  32. memset(aln->val, 0, length + 1);
  33. strncpy(aln->val, val, length);
  34. //Lien entre les noeuds
  35. aln->next = NULL;
  36. if (al->first == NULL) {
  37. aln->prev = NULL;
  38. al->first = aln;
  39. al->last = aln;
  40. } else {
  41. aln->prev = al->last;
  42. al->last->next = aln;
  43. al->last = aln;
  44. }
  45. al->size++;
  46. return aln;
  47. }
  48. al_node* arraylist_search(arraylist* al, char* key){
  49. //Liste vide
  50. if(al->first == NULL){
  51. return NULL;
  52. }
  53. //Cherche dans la liste
  54. al_node* aln = al->first;
  55. int length = strlen(aln->key) + 1;
  56. while (aln != NULL) {
  57. if (strncmp(aln->key, key, length) == 0) {
  58. return aln;
  59. }
  60. aln = aln->next;
  61. }
  62. return NULL;
  63. }
  64. char* arraylist_get(arraylist* al, char* key){
  65. al_node* aln = arraylist_search(al, key);
  66. if(aln == NULL){
  67. return NULL;
  68. }
  69. return aln->val;
  70. }
  71. int arraylist_getint(arraylist* al, char* key){
  72. al_node* aln = arraylist_search(al, key);
  73. if(aln == NULL){
  74. return 0;
  75. }
  76. return atoi(aln->val);
  77. }
  78. double arraylist_getdouble(arraylist* al, char* key){
  79. al_node* aln = arraylist_search(al, key);
  80. if(aln == NULL){
  81. return 0;
  82. }
  83. return atof(aln->val);
  84. }
  85. void arraylist_delete(arraylist* al, al_node* aln){
  86. //Liste vide
  87. if(al->first == NULL){
  88. return;
  89. }
  90. //Si 1er et seul
  91. if (aln->prev == NULL && aln->next == NULL) {
  92. al->first = NULL;
  93. al->last = NULL;
  94. }
  95. //Si 1er et non seul
  96. else if (aln->prev == NULL && aln->next != NULL) {
  97. aln->next->prev = NULL;
  98. al->first = aln->next;
  99. }
  100. //Si dernier
  101. else if (aln->next == NULL) {
  102. aln->prev->next = NULL;
  103. al->last = aln->prev;
  104. }
  105. //Sinon si il est au milieu
  106. else {
  107. aln->prev->next = aln->next;
  108. aln->next->prev = aln->prev;
  109. }
  110. //Free
  111. free(aln->key);
  112. free(aln->val);
  113. free(aln);
  114. al->size--;
  115. }
  116. boolean arraylist_remove(arraylist* al, char* key){
  117. al_node* aln = arraylist_search(al, key);
  118. if(aln == NULL){
  119. return false;
  120. }
  121. arraylist_delete(al, aln);
  122. return true;
  123. }
  124. void arraylist_clean(arraylist* al){
  125. //Liste vide
  126. if(al->first == NULL){
  127. return;
  128. }
  129. //Vide liste
  130. al_node* tmp, * aln = al->first;
  131. while (aln != NULL) {
  132. tmp = aln->next;
  133. arraylist_delete(al, aln);
  134. aln = tmp;
  135. }
  136. al->first = NULL;
  137. al->last = NULL;
  138. al->size = 0;
  139. }