Commit 00a2508e authored by Kilian Cardet's avatar Kilian Cardet
Browse files

TP1

parent 6fcaad20
Loading
Loading
Loading
Loading
+64 −6
Original line number Diff line number Diff line
#include<stdlib.h>

struct cell_t {
  void* val;
  unsigned long int id;
@@ -7,30 +9,86 @@ struct cell_t {
typedef struct cell_t* list_t;

list_t list_empty(){
	return NULL;
}

int list_is_empty(list_t l){
	return l == NULL;
}

list_t list_push(list_t l, void* x){
	list_t head = malloc(sizeof(struct cell_t));
	head->next = l;
	head->val = x;
	head->id = list_is_empty(l) ? 1 : l->id+1;
	return head;
}

list_t list_tail(list_t l){
}

void* list_pop(list_t* l){ 
	return list_is_empty(l) ? NULL : l->next;
}

void* list_top(list_t l){
}

void list_destroy(list_t l, void (*free)(void*)){
	return list_is_empty(l) ? NULL : l->val;
}

// return the found element or NULL
void* list_in(list_t l, void* x, int (*eq)(void*, void*)){
	while(!list_is_empty(l))
		if(eq(l->val, x))
			return l->val;
		else
			l = l->next;
	return NULL;
}

unsigned long int list_len(list_t l){
	return list_is_empty(l) ? 0 : l->id;
}

void* list_pop(list_t* l){ 
	if(list_is_empty(*l))
		return NULL;
	void* res = (*l)->val;
	list_t new_head = (*l)->next;
	free(*l);
	*l = new_head;
	return res;
}

void list_destroy(list_t l, void (*free)(void*)){
	while(!list_is_empty(l))
		free(list_pop(&l));
}