-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1 from nakira974/branches/dev
Update clist.c
- Loading branch information
Showing
1 changed file
with
51 additions
and
46 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,63 +1,68 @@ | ||
// | ||
// Created by maxim on 20/02/2024. | ||
// Created by maxim on 14/02/2024. | ||
// | ||
|
||
#include "clist.h" | ||
#include "randomized_set.h" | ||
|
||
void clist_create(ClinkedList *list, void (*destroy)(void *value)) { | ||
list->size = 0; | ||
list->destroy = destroy; | ||
list->head = NULL; | ||
} | ||
|
||
void clist_destroy(ClinkedList *list) { | ||
void *value; | ||
void randomized_set_create(RandomizedSet *set) { | ||
// Alloue de la mémoire pour le tableau de nombres avec une capacité initiale de 1000. | ||
set->nums = (int *) malloc(1000 * sizeof(int)); | ||
// Initialise la taille actuelle du tableau à 0. | ||
set->size = 0; | ||
// Initialise la capacité maximale du tableau à 1000. | ||
set->capacity = 1000; | ||
} | ||
|
||
while (clist_size(list) > 0) { | ||
if (clist_remove(list, list->head, (void **) &value) && list->destroy != NULL) { | ||
list->destroy(value); | ||
bool randomized_set_add(RandomizedSet *obj, int val) { | ||
for (int i = 0; i < obj->size; i++) { | ||
// Vérifie si l'élément existe déjà dans le tableau. | ||
if (obj->nums[i] == val) { | ||
// Si l'élément existe déjà, retourne faux. | ||
return false; | ||
} | ||
} | ||
memset(list, 0, sizeof(ClinkedList)); | ||
} | ||
|
||
bool clist_add(ClinkedList *list, CLinkedElement *element, const void *value) { | ||
CLinkedElement *new_element = NULL; | ||
|
||
// If we've such enough place in the memory then continue | ||
if ((new_element = (CLinkedElement *) malloc(sizeof(CLinkedElement))) == NULL) return false; | ||
new_element->value = (void *) value; | ||
|
||
if (clist_size(list) == 0) { | ||
// Empty-list add case | ||
new_element->next = new_element; | ||
list->head = new_element; | ||
} else { | ||
// Non-empty list case | ||
new_element->next = element->next; | ||
element->next = new_element; | ||
// Vérifie si le tableau est plein. | ||
if (obj->size == obj->capacity) { | ||
// Réalloue de la mémoire pour doubler la capacité du tableau. | ||
obj->nums = (int *) realloc(obj->nums, (2 * obj->capacity) * sizeof(int)); | ||
// Met à jour la capacité maximale. | ||
obj->capacity *= 2; | ||
} | ||
list->size++; | ||
|
||
// Ajoute l'élément à la fin du tableau et met à jour la taille du tableau. | ||
obj->nums[obj->size++] = val; | ||
// Retourne vrai pour indiquer que l'insertion a réussi. | ||
return true; | ||
} | ||
|
||
bool clist_remove(ClinkedList *list, CLinkedElement *element, void **value) { | ||
CLinkedElement *last_element = NULL; | ||
bool randomized_set_remove(RandomizedSet *obj, int val) { | ||
for (int i = 0; i < obj->size; i++) { | ||
// Recherche l'élément dans le tableau. | ||
if (obj->nums[i] == val) { | ||
// Remplace l'élément par le dernier élément du tableau pour maintenir la continuité. | ||
obj->nums[i] = obj->nums[obj->size - 1]; | ||
// Réduit la taille du tableau. | ||
obj->size--; | ||
// Retourne vrai pour indiquer que la suppression a réussi. | ||
return true; | ||
} | ||
} | ||
// Si l'élément n'est pas trouvé, retourne faux. | ||
return false; | ||
} | ||
|
||
if (clist_size(list) == 0) return false; | ||
int randomized_set_get_random(RandomizedSet *obj) { | ||
// Génère un index aléatoire dans la plage des indices valides du tableau. | ||
int randomIndex = rand() % obj->size; | ||
// Retourne l'élément correspondant à l'index aléatoire. | ||
return obj->nums[randomIndex]; | ||
} | ||
|
||
*value = element->next->value; | ||
if (element->next == element) { | ||
// Is last element case | ||
last_element = element->next; | ||
list->head = NULL; | ||
} else { | ||
// Not the latest element of the list case | ||
last_element = element->next; | ||
element->next = element->next->next; | ||
} | ||
free(last_element); | ||
list->size--; | ||
return true; | ||
void randomized_set_destroy(RandomizedSet *obj) { | ||
// Libère la mémoire du tableau de nombres. | ||
free(obj->nums); | ||
// Libère la mémoire de la structure RandomizedSet. | ||
free(obj); | ||
} |