CH 3 ASD II Listes Chainées PDF
CH 3 ASD II Listes Chainées PDF
CH 3 ASD II Listes Chainées PDF
Département d’informatique
ASD II
Par :
Khaled Hassine
[email protected]
PLAN PLAN
Introduction Introduction
LFSI 1 1
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
LFSI 1 2
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
Introduction
Autres opérations
01/03/2019 Khaled Hassine 9 01/03/2019 Khaled Hassine 10
LFSI 1 3
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
LFSI 1 4
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
d'assigner au champ « pointeur » du nouveau maillon, la valeur du Définir le nouveau maillon comme maillon de tête :
pointeur vers le maillon de tête : Tete = Nouveau;
Nouveau->Suivant ← Tete; Il est conseillé de tester la valeur renvoyée en retour par la fonction
malloc() afin de savoir si l'allocation dynamique de la mémoire s'est
définir le nouveau maillon comme maillon de tête :
déroulée correctement.
Tete ← Nouveau;
LFSI 1 5
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
Saisie d’une liste : fonction qui Saisie d’une liste en C : fonction qui
retourne la tête retourne la tête
Fonction construire() : VersMaillon VersMaillon construire()
Variables
{ VersMaillon debut, p;
VersMaillon debut, p;
ELEMENT valeur; ELEMENT valeur;
Début debut = NULL;
debut ← NULL; printf("Donnez vos entiers, terminez en indiquant EOF\n");
Lire (valeur)
Tanque (valeur) ≠ ValStop) while (scanf("%d", &valeur) != EOF)
Faire { p = (VersMaillon) malloc(sizeof(struct maillon));
p ← Allouer (1, maillon);
p -> valeur = valeur;
p -> valeur ← valeur;
p -> suivant ← debut; p -> suivant = *debut;
debut ← p; *debut = p;
lire (valeur)
Fin Faire
}
Construire ← debut; return debut;
Fin }
LFSI 1 6
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
Affichage d’une liste en C avec une Affichage d’une liste en C avec une
boucle while boucle for
void affiche (pmaillon *debut) void affiche (VersMaillon debut)
{ printf("\n______Contenu de la liste ________\n "); { pmaillon *p;
while (debut!=NULL) printf("\n______Contenu de la liste ________\n
{ printf("%d ", debut->valeur); ");
debut=debut->suivant; for (p=debut; p!=NULL; p=p->suivant)
} printf("\t%d",p->valeur);
printf("\n__________Fin contenue _________\n"); printf("\n__________Fin contenu
__________\n");
}
}
LFSI 1 7
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
PLAN
Introduction
Insertion dans une liste
Création d’une liste
Insertion en tête
Insertion en queue
Insertion dans une liste
Insertion par position
Autres opérations
01/03/2019 Khaled Hassine 29 01/03/2019 Khaled Hassine 30
Insertion en tête
Action Insertion_Tete (Données ELEMENT V,
Données/Résultat Maillon tete)
Insertion dans une liste Variable
Insertion en tête VersMaillon Nouveau;
Début
Insertion en queue tete
Nouveau ← allouer(1,maillon);
Insertion par position
Nouveau->valeur ← V; a b
Insertion par valeur Nouveau->suivant ← tete;
tete ← Nouveau; Nouveau V
Fin
LFSI 1 8
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
Insertion en tête en C
void Insertion_Tete (ELEMENT V, VersMaillon *tete)
{ VersMaillon Nouveau;
Insertion dans une liste
Nouveau = (pmaillon * ) malloc (sizeof(pmaillon));
Nouveau->valeur = V; Insertion en tête
Nouveau->suivant = *tete; Insertion en queue
*tete = Nouveau; Tete
Insertion par position
} a b
Insertion par valeur
Nouveau V
LFSI 1 9
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
LFSI 1 10
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
Insertion par valeur sur une liste Insertion par valeur sur une liste
triée triée en C
Action Insertion_Valeur (Données ELEMENT V, Données/Résultat Maillon tete,) void Insertion_Valeur (VersMaillon *tete, ELEMENT V)
Variables
VersMaillon Precedent, Courant, A_inserer; { VersMaillon Precedent, Courant, A_inserer;
Début if (((*tete) == NULL)||((*tete)->valeur > V)) Insertion_Tete(tete,V) ;
Si ((tete= NULL) ou (tete->valeur > V)) Alors Insertion_Tete(tete,V) ;
else {for (Courant = (*tete); (Courant != NULL) && (Courant->valeur < V);
Sinon Courant ← tete
Tanque (Courant ≠ NULL) et (Courant->valeur < V) Courant=Courant->suivant) Precedent = Courant ;
Faire if (Courant ==NULL) Insertion_Fin(tete, V);
Precedent ← Courant ;
Courant ← Courant->suivant
else { A_inserer =(VersMaillon) malloc(sizeof(pmaillon));
FinFaire A_inserer->valeur = V;
Si (Courant =NULL) Alors Insertion_Fin(tete, V); A_inserer->suivant=Precedent->suivant /* ou Courant*/
Sinon A_inserer ← Allouer (1, Maillon);
A_inserer->valeur ← V; Precedent->suivant =A_inserer;
A_inserer->suivant ← Precedent->suivant /* ou Courant*/ }
Precedent->suivant ← A_inserer; }
FinSi
FinSi }
Fin
PLAN
Introduction
Suppression dans une liste
Création d’une liste
Suppression par choix du user
Suppression en tête
Insertion dans une liste
Suppression par position
LFSI 1 11
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
P←C;
Vider une liste FinSi
C ← C->suivant;
FinFaire
Fin
}
}
Vider une liste
LFSI 1 12
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
Suppression en tête en C
void Suppression_Tete (VersMaillon *tete)
{ VersMaillon A_Supprimer ;
Suppression dans une liste
if (*tete != NULL)
{ A_Supprimer = *tete; Suppression par choix du user
*tete = (*tete)->suivant; Suppression en tête
free(A_Supprimer);
Suppression par position
} else printf("Suppression impossible-liste vide!!\n");
Suppression par valeur
}
Vider une liste
LFSI 1 13
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
LFSI 1 14
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
Suppression par valeur sur une liste Suppression par valeur sur une liste
triée en C quelconque
void Suppression_Valeur (ELEMENT E, VersMaillon *tete) Action Suppression_Valeur (Données ELEMENT E, Données/Résultat VersMaillon tete)
Variables
{ VersMaillon Precedent, Courant, A_Sup;
VersMaillon P, C, A_Sup;
if (((*tete)!= NULL)&&((*tete)->valeur ==E)) Suppression_Tete (tete); Debut
else { courant=*tete; Tanque (tete ≠ NULL) et ((tete->valeur =E)) Faire suppression_tete (tete); FinFaire
while ((courant !=NULL)&& (courant->valeur < E)) Si (tete ≠ NULL)
Alors
{ Precedent= Courant; C ← Tete->suivant; P ← Tete;
Courant=Courant->suivant; Tanque (C ≠ NULL) Faire
} Si (C->valeur = E))
Alors P->suivant ← C->suivant; A_Sup ← C;
while ((Courant != NULL) && (Courant->valeur == E)) free(A_Sup);
{ A_Sup=Courant; Precedent->suivant = Courant->suivant; C ← P->suivant;
Courant = Courant->suivant; free(A_Sup); Sinon
} P ← C;
C ← C->suivant;
} FinSi
} FinSi
Fin
}
}
Vider une liste
}
LFSI 1 15
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
PLAN
Introduction
Opérations particulières
Création d’une liste
Recherche dans une liste
Concaténation de deux listes
Insertion dans une liste
Fusion de deux listes
LFSI 1 16
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
LFSI 1 17
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
LFSI 1 18
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
LFSI 1 19
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
LFSI 1 20
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
Fusion de deux listes triées avec Fusion de deux listes triées avec
élimination des redondances … élimination des redondances …
Tanque ((L1 ≠ NULL) et (L2 ≠ NULL)) Tanque (L1 ≠ NULL )
Faire Faire
Si (L1->valeur <L2->valeur ) Si (Dernier ≠ L1->valeur )
Alors Si (Dernier ≠ L1->valeur ) Alors Dernier ← L1->valeur;
Alors Dernier ← L1->valeur; Insertion_Fin(Tete, Dernier);
Insertion_Fin(Tete, Dernier); FinSi
FinSi On écrit le plus petit de L1 ← L1->suivant; Copie des éléments
L1 ← L1->suivant; deux listes s’il n’est pas FinFaire restants en éliminant la
Sinon le dernier écrit Tanque (L2 ≠ NULL ) redondance
Si (Dernier ≠ L2->valeur ) Faire
Alors Dernier ← L2->valeur; Si (Dernier ≠ L2->valeur )
Insertion_Fin( tete, Dernier); Alors Dernier ← L2->valeur;
FinSi Insertion_Fin(Tete, Dernier);
L2 ← Li2->suivant; FinSi
FinSi L2 ← L2->suivant;
FinFaire FinFaire
Fusion_Sans_Redondance ← Tete;
Fin
LFSI 1 21
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
Fusion de deux listes triées avec Fusion de deux listes triées avec
élimination des redondances en C élimination des redondances en C …
VersMaillon Fusion_Sans_Redondance (VersMaillon Liste1, {
while ((Liste1 != NULL)&&(Liste2 != NULL))
if (Liste1->valeur <Liste2->valeur )
VersMaillon Liste2) { if (Dernier != Liste1->valeur )
{ VersMaillon tete; ELEMENT Dernier; { Dernier = Liste1->valeur;
Insertion_Fin(&tete, Dernier);
if(Liste1==NULL) tete= Liste2; }
Liste1 = Liste1->suivant;
else if (Liste2 ==NULL) tete= Liste1; }
else { tete=(VersMaillon) malloc(sizeof(pmaillon)); else
{ if (Dernier != Liste2->valeur )
if (Liste1->valeur < Liste2->valeur) { Dernier = Liste2->valeur;
tete->valeur = Liste1->valeur; Insertion_Fin(&tete, Dernier);
}
else tete->valeur = Liste2->valeur; Liste2 = Liste2->suivant;
}
tete->suivant = NULL ; }
Dernier = tete->valeur;
LFSI 1 22
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
LFSI 1 23
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
Inverser une liste sur une nouvelle Inverser une liste sur une nouvelle
liste en C liste
VersMaillon inverse (VersMaillon tete) Fonction Renverser(VersMaillon Tete) : VersMaillon
Variables VersMaillon Aux, Reste_a_inverser, Courant ;
{ /*écrit une liste existante dans une nouvelle de droite à Début
gauche _ insertion en tête*/ Si (Tete ≠ NULL) et ((Tete -> suivant ≠ NULL)
Alors
pmaillon *p; Aux ← Tete -> suivant;
Tete -> suivant ← NULL; /* On cré un premier élément avec la tete */
pmaillon *nv_liste=NULL; Reste_a_inverser ← Aux;
p=tete; Tanque (Reste_a_inverser ≠ NULL)
Faire
while (p!=NULL) Courant ← Reste_a_inverser;
{ insertion_en_tete(&nv_liste, p->valeur); Reste_a_inverser ← Reste_a_inverser -> suivant;
Courant -> suivant ← Tete;
p=p->suivant; Tete ← Courant;
FinFaire
} FinSi
return nv_liste; Renverser ← Tete;
Fin
}
LFSI 1 24
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
LFSI 1 25
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
Tri par sélection sur elle même Tri par sélection sur elle même en C
Action Trier(Données/Résultat VersMaillon L)
Variables VersMaillon p, q; Entier Aux;
void Trier(VersMaillon L)
Début
Si (L ≠ NULL) et (L->suivant ≠ NULL)
/* Tri de la liste sur elle-même. Seules les valeurs sont modifiées.*/
Alors { VersMaillon p,q;
p = L;
Tanque (p->suivant ≠ NULL) int Aux;
Faire
Tanque (p->suivant ≠ NULL) if(L&&L->suivant)
Faire Tri de la liste sur elle-
Si (p->valeur>q->valeur) for(p=L;p->suivant;p=p->suivant)
même. Seules les valeurs
Alors
Aux ← p->valeur; sont modifiées.
for(q=p->suivant;q;q=q->suivant)
p->valeur ← q->valeur;
q->valeur=Aux;
if(p->valeur>q->valeur)
FinSi { Aux=p->valeur;
q ← q->suivant
FinFaire p->valeur=q->valeur;
p ← p->suivant
FinFaire q->valeur=Aux;
Fin
FinSi
}
}
LFSI 1 26
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
Tri par sélection sur une nouvelle Tri par sélection sur une nouvelle
liste liste en C …
Fonction Tri (VersMaillon Liste_a_trier) : VersMaillon for(Noeud_a_Placer = Reste_a_trier ; Noeud_a_Placer !=
Variables NULL ; Noeud_a_Placer = Reste_a_trier)
VersMaillon ListeTrie, Reste_a_trier; { Reste_a_trier = Reste_a_trier->suivant;
VersMaillon tmp, Noeud_a_Placer; * la boucle de tri sur la nouvelle liste on effectue un test
Début sur le premier élément séparément */
Si (Liste_a_trier = NULL) if(ListeTrie->valeur >= Noeud_a_Placer->valeur)
Alors ListeTrie ← NULL; { Noeud_a_Placer->suivant = ListeTrie;
Sinon ListeTrie = Noeud_a_Placer;
ListeTrie ← Liste_a_trier; continue;
Reste_a_trier ← Liste_a_trier->suivant; }
ListeTrie->suivant ← NULL;
LFSI 1 27
Faculté des Sciences de Gabes 05/03/2019
Département d’informatique
ASD II
LFSI 1 28