Skip to content
Snippets Groups Projects
Commit 389b7d40 authored by thib's avatar thib
Browse files

aled

parent 2ad64280
No related branches found
No related tags found
No related merge requests found
cc=gcc
CFLAGS=-Wextra -Wall -g -fsanitize=address -fsanitize=leak
LFLAGS= -lm
circ.x: circ.o main.o
$(cc) -o $@ $^ $(CFLAGS) $(LFLAGS)
clean:
rm -f *.o *.x
#include "circ.h"
#include <stdlib.h>
// typedef struct element {
// void *content;
// struct element *next;
// } element;
// Crée une nouvelle liste vide. Renvoie simplement un pointeurNULL
element *list_create() { return NULL; }
// true si la liste est vide
bool list_empty(element *head) { return head == NULL; }
// Renvoie le nombre d’éléments de la listeunsigned
int list_count(element *head) {
if (list_empty(head)) {
return 0;
}
int count = 1;
element *crt = head;
while (crt->next != head) {
crt = crt->next;
count++;
}
return count;
}
// Déplace le pointeur head sur l’élément suivant. Retourne la nouvelle têtede
// liste
element *list_move(element *head) {
head = head->next;
return head;
}
// Insert un élément après le pointeur head. Retourne le pointeur sur l’élé-ment
// inséré
element *list_insert_after(element *head, void *data) {
if (list_empty(head)) {
printf("insert empty\n");
head = malloc(sizeof(element));
head->content = data;
head->next = head;
return head;
}
printf("insert not empty\n");
element *tmp = malloc(sizeof(element));
tmp->content = data;
tmp->next = head->next;
head->next = tmp;
return tmp;
}
// Insert un élément avant le pointeur head. Retourne le pointeur sur l’élé-ment
// inséré
element *list_insert_before(element *head, void *data) {
element *crt = head;
while (crt->next != head) {
list_move(crt);
}
element *tmp = malloc(sizeof(element));
tmp->content = data;
tmp->next = head;
crt->next = tmp;
return tmp;
}
// Recherche un élément dans la liste. Retourne un pointeur sur le 1erélément
// trouvé ouNULLsi l’élément est absent
element *list_search(element *head, void *data,
int (*compare)(void *, void *)) {
element *crt = head;
while (compare(crt->content, data)) {
crt = crt->next;
if (crt->next == head) {
return NULL;
}
}
return crt;
}
// Supprime un élément de la liste sans libérer l’élément pointé. Renvoie
// unpointeur sur le 1er élément trouvé à supprimer et l’enlève de la liste,
// ouNULLsi l’élément est absent
element *list_remove(element *head, void *data,
int (*compare)(void *, void *)) {
element *tmp = list_search(head, data, compare);
if (tmp == NULL) {
return NULL;
}
element *removed = tmp->next;
tmp->next = tmp->next->next;
return removed;
}
// Supprime toute la liste en libérant chaque élément
void list_free(element *head, void (*data_free)(void *)) {
element *tmp = head;
while (!list_empty(tmp)) {
tmp = tmp->next;
data_free(head);
}
}
// Appel d’une fonction de traitement quelconque sur chaque élément de laliste
void list_process(element *head, void *(*action)(void *)) {
element *crt = head;
while (crt->next != head) {
action(crt->content);
crt = crt->next;
}
}
#ifndef _circ_H_
#define _circ_H_
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct element {
void *content;
struct element *next;
} element;
// Crée une nouvelle liste vide. Renvoie simplement un pointeurNULL
element* list_create();
// este si la liste est vide
bool list_empty(element* head);
// Renvoie le nombre d’éléments de la listeunsigned
int list_count(element* head);
// Déplace le pointeur head sur l’élément suivant. Retourne la nouvelle têtede liste
element* list_move(element* head);
// Insert un élément après le pointeur head. Retourne le pointeur sur l’élé-ment inséré
element* list_insert_after(element* head, void* data);
// Insert un élément avant le pointeur head. Retourne le pointeur sur l’élé-ment inséré
element* list_insert_before(element* head, void* data);
// Recherche un élément dans la liste. Retourne un pointeur sur le 1erélément trouvé ouNULLsi l’élément est absent
element* list_search(element* head,void* data,int (*compare)(void*, void*));
// Supprime un élément de la liste sans libérer l’élément pointé. Renvoie unpointeur sur le 1er élément trouvé à supprimer et l’enlève de la liste, ouNULLsi l’élément est absent
element* list_remove(element* head, void* data,int (*compare)(void*, void*));
// Supprime toute la liste en libérant chaque élément
void list_free(element* head, void (*data_free)(void*));
// Appel d’une fonction de traitement quelconque sur chaque élément de laliste
void list_process(element* head, void* (*action)(void*));
#endif
#include "circ.h"
#include <stdlib.h>
void *print_int(void *x) {
printf("%d ", *(int *)x);
return x;
}
void free_simple(void *ptr) { free(ptr); }
int main() {
element *head = list_create();
printf("%d\n", list_count(head));
int a = 1;
int b = 2;
int c = 3;
head = list_insert_after(head, &a);
head = list_insert_after(head, &b);
head = list_insert_after(head, &a);
// list_insert_after(head, &b);
// list_insert_after(head, &c);
printf("%d\n", list_count(head));
// for (int i = 0; i < 8; i++) {
// list_insert_after(head, &i);
// }
// list_process(head, print_int);
// list_free(head, free_simple);
return EXIT_SUCCESS;
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment