Chap 3
Chap 3
Chap 3
1
Limite des tableaux
19/04/2023 5
- Représentation d’une liste chainée
19/04/2023 6
Nœud suivant
Le champ pointeur vers un nœud pointe vers le nœud suivant de la liste. S’il
n’y a pas de nœud suivant, le pointeur vaut NULL.
Notion de liste
Une liste simplement chaînée est un pointeur sur un nœud. Une liste vide est
une liste qui ne contient pas de nœud. Elle a donc la valeur NULL.
Définitions
La terminologie suivante est généralement employée :
– le premier nœud de la liste est appelé tête ;
– le dernier nœud de la liste est appelé queue.
7
19/04/2023 8
Deux manières de définir une liste chainée
Une liste chaînée est manipulée à l'aide d'un pointeur vers son premier élément.
Plus généralement, tout pointeur vers Nœud peut donc être vu de deux manière :
1- comme pointant vers un élément d'une liste,
•Nœud représente un élément, avec une valeur, et pointant vers l'élément
suivant,
19/04/2023 9
Deux manières de définir une liste chainée
Une liste chaînée est manipulée à l'aide d'un pointeur vers son premier élément.
Plus généralement, tout pointeur vers Nœud peut donc être vu de deux manière :
2- comme pointant vers une liste, via son premier élément.
•Nœud représente une liste, avec sa première valeur, et pointant vers la
liste des éléments suivants.
Une liste récursive : chaque élément permet d'accéder à la liste d'éléments suivants
19/04/2023 10
Liste chainée itérative
Principe: Définir la liste chainée itérative en prenant comme opérations de
base:
19/04/2023 11
Les opérations sur une liste chainée itérative
Insérer un élément à la tête d’une liste : liste inserer_tete(liste list, int val);
Insérer un élément à la queue d’une liste : liste inserer_fin(liste list, int val);
Supprimer un élément ayant la valeur val: liste supprimer(liste list, int val);
19/04/2023 12
- programmes en C des opérations d’une liste chainée itérative
19/04/2023 13
liste inserer_tete(liste list, int valeur)
{
liste list_i;
if ((list_i = (liste)malloc(sizeof(Noeud))) == NULL)
{ printf ("erreur allocation");
exit(1);
}
list_ivaleur = valeur;
list_isuivant = list;
return(list_i);
}
19/04/2023 14
liste inserer_queue(liste list, int valeur)
{
liste list_i, list_move;
if((list_i = (liste )malloc(sizeof(Noeud))) == NULL)
{ printf(" erreur allocation "); exit(1); }
//creation noeud
list_i valeur = valeur;
list_i suivant= NULL;
if(list == NULL)
return(list_i);
// insertion queue
else
list_move= list;
// parcours Liste
while (list_move suivant!=NULL)
list_move=list_move suivant;
19/04/2023 17
void affichage(liste list)
{
liste p_maillon = list;
if(p_maillon ==NULL)
printf("liste vide\n") ;
else
{
while (p_maillon !=NULL)
{
printf("%d ", p_maillon valeur);
p_maillon=p_maillon suivant ;
}
}
}
19/04/2023 18
Application
employee=saisir();
ma_liste1 = ajouterEnFin(ma_liste1, employee);
printf(" \n La liste apres rajout ");
affich(ma_liste1);
printf(" \n La liste apres suppression de l\'employe le plus ancien \n
");
ma_liste1=Supp-ancien(ma_liste1);
affich(ma_liste1);
return 0;
}
Employe saisir()
{
Employe empl;
printf("Saisir matricule employe \n");
scanf("%d",&empl.mat);
printf("Saisir nom employe \n");
scanf("%s",empl.nom);
printf("Saisir prenom employe \n");
scanf("%s",empl.prenom);
printf("Saisir anciennete employe\n");
scanf("%d",&empl.ancien);
return empl;
}
llist ajouterEnFin(llist liste, Employe e)
{
/* On crée un nouvel élément */
BD_Emp* nouvelEmploye, temp=liste;
nouvelEmploye=(BD_Emp*)malloc(sizeof(BD_Emp));
temp->suiv = nouvelEmploye;
return liste;
}
}
void affich(llist liste)
{
BD_Emp *temp=liste;
while(temp != NULL)
{
printf("{ %d %s %s %d }-> \n",temp->emp.mat,temp->emp.nom,temp->emp.prenom,temp-
>emp.ancien);
temp = temp->suiv;
}
}
llist Supp-ancien( llist liste)
{
llist temp = liste;
llist pmax, prec,precmax;
int max= temp->emp.ancien;
precmax=NULL;
prec= temp;
pmax=temp;
temp=temp->suiv;
while (temp->suiv ) {
if(temp->emp.ancien > max)
{max = temp->emp.ancien;precmax=prec; pmax=temp;}
prec=temp;
temp = temp->suiv;
}
if (precmax == NULL) {liste= pmax->suiv ; free(pmax); return liste ; }
if (temp->suiv == NULL && temp->emp.ancien > max)
{max = temp->emp.ancien;precmax=prec;pmax=temp;}
precmax->suiv=pmax->suiv;
return liste ;
}