Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Plan
95 cases inutilisées
Suppression de T[4]
Il existe un grand nombre de structure de données plus performant que les tableaux:
Exemple : listes chaînées, listes doublement chaînées les piles, les files, les arbres binaires...
Ses structures de donnée gèrent un ensemble d’éléments dont le nombre n’est pas fixé,
le nombre des éléments varie au cours de l’exécution du programme, puisqu’on peut y
ajouter et supprimer facilement des éléments en cours de traitement.
Dans une liste chaînée les objets sont stockés de manière ordonnée. L’ordre est déterminé par
un pointeur dans chaque objet contrairement au tableau, pour lequel l’ordre est déterminé par
les indices.
Chaque élément de la liste est contenu dans une cellule (nœud) composée d’une valeur et d’un
pointeur sur l’élément suivant.
Une liste chaînée est donc une succession de noeuds, dont le dernier porte sur NULL.
La première cellule de la liste est appelée tête (debut) et la dernière cellule est appelée queue
(Fin).
L’accès à la liste chaînée se fait par le pointeur debut sur le premier élément.
Déclaration
Chaque nœud d’une liste chaînée est une structures constitué : d’un champ de
données et d’un pointeur vers le nœud suivant. La déclaration correspondante est la
suivante:
Code en C
struct element
{
int donnee;
struct element * suivant;
};
Réservation mémoire
struct element{
int donnnee;
struct element *suivant;
};
typedef struct element Element;
Element *chaine;
chaine:
valeur suivant
chaine: 10
Element *p;
p = chaine;
p = p -> suivant;
p -> valeur = 5;
ou
typedef struct Liste{
Eelement * debut;
Eelement *courant;
Eelement *dernier;
}Liste;
Initialisation
Pour initialiser notre liste, il suffit d’initialiser les pointeurs debut et fin à NULL
et la taille à 0.
Il est important d’initialiser la liste, sinon le programme provoquera des erreurs
d’exécutions qui seront très difficiles à identifier.
void initListe(Liste * L) {
L->debut = (Element *) malloc ( sizeof(Element));
L->fin = (Element *) malloc ( sizeof(Element));
L->debut = NULL;
L->fin = NULL;
L->taille=0;
}
nouveau_element->suivant = NULL;
liste->debut = nouveau_element;
liste->fin = nouveau_element;
liste->taille++;
return 0;
}
Première année BTP Algorithmique avancée
2. Listes simplement chaînées
nouveau_element->suivant = liste->debut;
liste->debut = nouveau_element;
liste->taille++;
return 0;
}
Étapes:
allocation de la mémoire pour le nouvel élément
remplir le champ de données du nouvel élément
le pointeur suivant du dernier élément pointe vers le nouvel élément
le pointeur fin pointe vers le nouvel élément
le pointeur debut ne change pas
la taille est incrémentée
Prototype de la fonction : int ins_liste (Liste *liste, char *donnee, int pos);
L'insertion s’éffectue après la position pos passée en argument à la fonction.
Étapes:
allocation de la mémoire pour le nouvel élément
remplir le champ de données du nouvel élément
Se déplacer vers la position pos (l'insertion se fera après la pos)
le pointeur suivant du nouvel élément pointe vers l'adresse sur laquelle
pointe le pointeur suivant de pos.
le pointeur suivant de pos pointe vers le nouvel élément
les pointeurs debut et fin ne change pas
la taille est incrémentée d'une unité
Première année BTP Algorithmique avancée
2. Listes simplement chaînées
/* affichage de la liste */
void affiche (Liste * liste)
{
Element *courant;
courant = liste->debut;
while (courant != NULL){
printf ("%p - %s", courant, courant->donnee);
courant = courant->suivant;
}
}
int i,j,echange;
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
if ( T[j] < T[i] )
{
echange = T[i];
T[i] = T[j];
T[j] = echange;
}
Démonstration
Exercice
En s’inspirant du programme précédent qui tri
par sélection les éléments d’un tableau, écrire
une fonction qui tri par sélection la liste chaînée.
struct elem{
double data;
struct elem *suivant;
};
typedef struct elem * liste;
void tri_selection(liste * l)
void tri_selection(liste l)
{
liste p, q;
double Aux;
if ( l && l>suivant)
for(p=l ; p->suivant; p=p->suivant)
for(q=p->suivant; q; q=q->suivant)
if(p->data> q->data)
{
Aux=p->data;
p->data=q->data;
q->data=Aux;
}
}
Pour un tableau, on décale les éléments plus grand que celui à insérer vers la droite
jusqu'au moment où on tombe sur un élément plus petit que celui qu'on veut insérer, qu'il
ne faut pas décaler.
Démonstration
Exercice
Démonstration
La fusion efficace repose sur le fait que les deux listes sont triées. on sait que les plus
petits éléments des deux listes sont au début, le plus petit élément de la liste globale
est donc forcément le plus petit le plus petit des deux.
Découpage &fusion
if (j <= i) { return; }
int m = (i + j) / 2;
fusion(tab,i,m,j);
}
Démonstration
return fusion(x,y);
}
Démonstration
Imane.abl.2000@gmail.com
Première année BTP Algorithmique avancée
4. Listes doublement chaînées
A la différence des listes simplement chaînées, les maillons d'une liste doublement
chaînée possèdent un autre pointeur sur l'élément qui les précède :
4. Listes doublement chaînées
Le pointeur précédent du premier élément doit pointer vers NULL (le début de la liste).
Le pointeur suivant du dernier élément doit pointer vers NULL (la fin de la liste).
Pour accéder à un élément la liste peut être parcourue dans les deux sens :
en commençant avec la tête, le pointeur suivant permettant le déplacement vers le prochain élément.
en commençant avec la queue, le pointeur précédent permettant le déplacement vers l'élément
précédent.
Si dernier Si Premier