-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLLC_liste.h
125 lines (107 loc) · 2.75 KB
/
LLC_liste.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <stdio.h>
#include <stdlib.h>
typedef struct Elt{
void *info;
struct Elt *svt;
} node ;
typedef node* LLC_liste ;
int LLC_Vide(LLC_liste l){
return l == NULL;
}
int LLC_Size(LLC_liste l){
return (!l)?0:LLC_Size(l->svt)+1;
}
void* LLC_neGet(LLC_liste l,int index){
if (index > LLC_Size(l))
return NULL;
return index != 0 ?LLC_neGet(l->svt,index-1): l->info;
}
void* LLC_Get(LLC_liste l,int index){
LLC_neGet(l,LLC_Size(l)-index-1);
}
LLC_liste LLC_CrNode(void *val,size_t taille){
LLC_liste l=(LLC_liste)malloc(sizeof(node));
l->info = malloc(taille);
//on copie les info byte par byte
for (int i = 0; i < taille; i++) {
*(char *)(l->info +i) = *(char *)(val + i);
}
l->svt = NULL;
return l;
}
//return le dernier elt ajouter
LLC_liste LLC_add(LLC_liste last,void* val,size_t taille){
LLC_liste l = LLC_CrNode(val,taille);
if(last != NULL) last->svt = l;
return l;
}
LLC_liste getLast(LLC_liste lst){
return lst->svt?getLast(lst->svt):lst ;
}
void LLC_addLast(LLC_liste *l ,void* val , size_t taille){
if (!(*l)) *l=LLC_CrNode(val,taille);
else LLC_add(getLast(*l),val,taille);
}
void push(LLC_liste* p,void* val,size_t taille){
if (!*p)
*p = LLC_CrNode(val,taille);
else {
LLC_liste tmp = *p;
*p = LLC_CrNode(val,taille);
(*p)->svt = tmp;
}
}
void* pop(LLC_liste* p){
LLC_liste l;
void* tmp = NULL;
if (*p){
l = *p ;
*p = (*p)->svt ;
l->svt = NULL;
tmp = l->info;
free(l);
l=NULL;
}
return tmp;
}
void LLC_addFirst(LLC_liste *l,void* val, size_t taille){
push(l,val,taille);
}
void LLC_Affiche(LLC_liste t,void (*ptrF)(void *)){
printf("[");
for (LLC_liste w = t; w ; w=w->svt)
(*ptrF)(w->info);
printf("]");
}
void LLC_Affiche2(LLC_liste t,void (*ptrF)(void*),char* Listname){
printf("\n%s", Listname);
LLC_Affiche(t,ptrF);
}
//return l'adr de 1er occurence d Elt qui verifier le prediact ptrF(fonction->>boolean)
LLC_liste LLC_Recherche(LLC_liste l,void* val,int (*ptrF)(void *,void *)){
for (; l ; l=l->svt)
if ((*ptrF)(l->info,val))
return l;
return NULL;
}
int LLC_Count(LLC_liste l , void* val ,int (*ptrF)(void *,void *)){
return l?LLC_Count(l->svt,val,ptrF)+(*ptrF)(l->info,val):0;
}
void __Swap(LLC_liste *lst1,LLC_liste *lst2){
void* tmp =(*lst1)->info;
(*lst1)->info=(*lst2)->info;
(*lst2)->info=tmp;
}
void LLC_sort(LLC_liste *l ,int (*CmpPtrF)(void*,void*)){
if (*l)
for (LLC_liste q = *l; q->svt ; q=q->svt)
for (LLC_liste w = q->svt ; w ; w=w->svt)
if ((*CmpPtrF)(q->info,w->info))__Swap(&q,&w);
}
//fonction qui faire l affichage au sense inverse
//Comme Pile (pour afficher les Erreur)
void LLC2Pile_Affiche(LLC_liste t,void (*ptrF)(void *)){
if(t->svt)
LLC2Pile_Affiche(t->svt,ptrF);
(*ptrF)(t->info);
}