Accueil > > > LISTE DOUBLEMENT CHAINÉE D'ENTIERS
LISTE DOUBLEMENT CHAINÉE D'ENTIERS
Information sur la source
Description
Manipulation de pointeurs à travers une liste doublement chainée. Liste d'entiers avec tri des valeurs par ordre croissant. un menu permet de manipuler la liste.
Source
- // liste_chainee_dble.c
- /* Programme d'apprentissage des pointeurs en langage C */
- /* Liste doublement chainee d'entiers avec tri croissant des valeurs */
- /* De maniere a ajouter des valeurs en debut, fin et milieu de liste */
-
- #include <stdio.h>
- #include <stdlib.h>
-
- #define OK 1
- #define ERR -1
- #define QUIT 6 // valeur pour quitter le programme
-
- // declaration maillon pour liste chainee double
- typedef struct _maillon_dble_{
- int valeur;
- struct _maillon_dble_* suivant;
- struct _maillon_dble_* precedent;
- }MaillonD;
-
- /* Retourne un pointeur sur le maillon nouvellement cree */
- MaillonD* creer_maillon_dble(int valeur){
- MaillonD* maillon = NULL;
-
- maillon = (MaillonD*) malloc(sizeof(MaillonD));
- maillon->valeur = valeur;
- maillon->suivant = NULL;
- maillon->precedent = NULL;
- return(maillon);
- }
-
- /* Parcours la liste depuis le 1er maillon
- et retourne le denier maillon de la liste */
- MaillonD* dernier_maillon_dble(MaillonD* entete){
-
- while(entete->suivant != NULL)
- entete = entete->suivant;
- return(entete);
- }
-
- /* Retourne OK si le maillon a ete trouve, ERR sinon */
- int recherche_maillon_dble(MaillonD* entete, int valeur){
-
- while((entete->valeur != valeur) && (entete->suivant!= NULL))
- entete = entete->suivant;
- if(entete->valeur == valeur)
- return(OK);
- else
- return(ERR);
- }
- /* Ajoute un maillon nouvellement cree en debut de liste, si la valeur du
- maillon entete est superieure a la valeur du nouveau maillon.
- Retourne un pointeur sur le maillon en tete de liste */
- MaillonD* ajoute_maillon_dble_entete(MaillonD* entete, MaillonD* nouveau){
-
- if(entete != NULL){
- nouveau->suivant = entete;
- entete->precedent = nouveau;
- entete = nouveau;
- return(entete);
- }else
- return(NULL);
- }
-
- /* Ajoute un maillon nouvellement cree en fin de liste, si la valeur du
- maillon enqueue est inferieure ou egale a la valeur du nouveau maillon.
- Retourne un pointeur sur le maillon en queue de liste */
- MaillonD* ajoute_maillon_dble_enqueue(MaillonD* enqueue, MaillonD* nouveau){
-
- if(enqueue != NULL){
- enqueue->suivant = nouveau;
- nouveau->precedent = enqueue;
- return(nouveau);
- }else
- return(NULL);
- }
-
- /* Ajoute le maillon nouvellement cree entre le maillon de valeur immediatement
- inferieure ou egale et le maillon de valeur immediatement superieure */
- int ajoute_maillon_dble_milieu(MaillonD* entete, MaillonD* nouveau){
- MaillonD* suivant;
-
- suivant = entete->suivant;
- if((entete != NULL) && (suivant != NULL)){
- while((entete->valeur <= nouveau->valeur) &&
- (suivant->valeur < nouveau->valeur)){
- entete = entete->suivant;
- suivant = entete->suivant;
- }
- if(suivant->valeur > nouveau->valeur){
- nouveau->suivant = suivant;
- suivant->precedent = nouveau;
- entete->suivant = nouveau;
- nouveau->precedent = entete;
- return(OK);
- }
- }
- return(ERR);
- }
- /* Retourne un pointeur sur le maillon en tete de liste, NULL si la liste
- est vide ou si l'unique maillon de la liste est supprime */
- MaillonD* supprime_maillon_dble(MaillonD* precedent, int valeur){
- MaillonD* encours;
- MaillonD* suivant;
- MaillonD* liste;
-
- if(precedent != NULL){
- if(precedent->valeur == valeur){
- // le maillon a supprimer est le maillon en tete de liste
- if(precedent->suivant != NULL){
- encours = precedent->suivant;
- encours->precedent = NULL;
- liste = encours;
- free(precedent);
- return(liste);
- }else{
- free(precedent);
- return(NULL);
- }
- }else{
- liste = precedent;
- encours = precedent->suivant;
- suivant = encours->suivant;
- while(encours->valeur != valeur){
- precedent = encours;
- encours = suivant;
- suivant = suivant->suivant;
- }
- if(encours->valeur == valeur){
- if(encours->suivant == NULL)
- // le maillon a supprimer est le dernier de la liste
- precedent->suivant = NULL;
- else{
- // le maillon a supprimer est au milieu de la liste
- precedent->suivant = suivant;
- suivant->precedent = precedent;
- }
- free(encours);
- return(liste);
- }
- }
- }
- return(NULL);
- }
- /* Affiche les valeurs de la liste par ordre croissant */
- int affiche_liste_croissant(MaillonD* affiche){
-
- while(affiche != NULL){
- printf("%d, ", affiche->valeur);
- affiche = affiche->suivant;
- }
- puts("");
- return(OK);
- }
-
- /* Affiche les valeurs de la liste par orde decroissant */
- int affiche_liste_decroissant(MaillonD* affiche){
- while(affiche != NULL){
- printf("%d, ", affiche->valeur);
- affiche = affiche->precedent;
- }
- puts("");
- return(OK);
- }
-
- /* Retourne le choix de l'utilisateur */
- int menu(void){
- int choix = 0;
-
- puts("");
- puts("1. Ajouter un maillon");
- puts("2. Supprimer un maillon");
- puts("3. Rechercher un maillon");
- puts("4. Afficher la liste dans l\'ordre croissant");
- puts("5. Afficher la liste dans l\'ordre decroissant");
- puts("6. Quitter");
- printf("Entrez un choix : ");
- scanf("%d", &choix);
- return(choix);
- }
-
- /* Retourne la valeur dans le cas d'un(e) ajout/suppr./recherche d'un maillon */
- int navigation(int choix){
- int valeur = 0;
-
- switch(choix){
- case 1: // l'utilisateur ajoute un maillon a la liste
- printf("Entrez la valeur a ajouter : ");
- scanf("%d", &valeur);
- break;
- case 2: // l'utilisateur supprime un maillon de la liste
- printf("Entrez la valeur a supprimer : ");
- scanf("%d", &valeur);
- break;
- case 3: // l'utilisateur recherche un maillon dans la liste
- printf("Entrer la valeur a rechercher : ");
- scanf("%d", &valeur);
- break;
- }
- return(valeur);
- }
-
- int main(void){
- MaillonD* entete = NULL; // pointe sur le 1er maillon (declare a NULL)
- MaillonD* enqueue; // pointe sur le dernier maillon
- MaillonD* nouveau; // designe le maillon nouvellement cree
- int valeur, choix, etat;
-
- valeur = choix = etat = 0; // init
- choix = menu();
- while(choix != QUIT){ // tant que l'utilisateur ne quitte pas
- if((choix > 1) && (entete == NULL)){
- puts("La liste est vide.");
- }else{
- valeur = navigation(choix);
- switch(choix){
- case 1: // Ajout d'un maillon
- nouveau = creer_maillon_dble(valeur);
- if(entete != NULL){
- if(nouveau->valeur < entete->valeur)
- // Ajout d'un maillon en tete de liste
- entete = ajoute_maillon_dble_entete(entete, nouveau);
- else{
- enqueue = dernier_maillon_dble(entete);
- if(nouveau->valeur >= enqueue->valeur)
- // Ajout d'un maillon en queue de liste
- enqueue = ajoute_maillon_dble_enqueue(enqueue, nouveau);
- else if((nouveau->valeur >= entete->valeur) &&
- (nouveau->valeur < enqueue->valeur))
- // Ajout d'un maillon en milieu de liste
- ajoute_maillon_dble_milieu(entete, nouveau);
- }
- }else // entete == NULL --> 1er maillon ajoute a la liste
- entete = nouveau;
- break;
- case 2: // Suppression d'un maillon
- if(entete != NULL){
- if(recherche_maillon_dble(entete, valeur) == OK){
- entete = supprime_maillon_dble(entete, valeur);
- if(entete == NULL)
- free(entete);
- }else
- puts("La valeur n\'existe pas dans la liste.");
- }else
- puts("La liste est vide.");
- break;
- case 3: // Recherche d'un maillon
- etat = recherche_maillon_dble(entete, valeur);
- if(etat == ERR)
- puts("la valeur recherchee n\'existe pas dans la liste.");
- else
- printf("la valeur a ete trouve : %d\n", valeur);
- break;
- case 4: // Affichage de la liste dans l'ordre croissant
- affiche_liste_croissant(entete);
- break;
- case 5: // Affichage de la liste dans l'ordre decroissant
- affiche_liste_decroissant(enqueue);
- break;
- }
- }
- choix = menu(); // re-init
- }
- return(EXIT_SUCCESS);
- }
-
// liste_chainee_dble.c
/* Programme d'apprentissage des pointeurs en langage C */
/* Liste doublement chainee d'entiers avec tri croissant des valeurs */
/* De maniere a ajouter des valeurs en debut, fin et milieu de liste */
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERR -1
#define QUIT 6 // valeur pour quitter le programme
// declaration maillon pour liste chainee double
typedef struct _maillon_dble_{
int valeur;
struct _maillon_dble_* suivant;
struct _maillon_dble_* precedent;
}MaillonD;
/* Retourne un pointeur sur le maillon nouvellement cree */
MaillonD* creer_maillon_dble(int valeur){
MaillonD* maillon = NULL;
maillon = (MaillonD*) malloc(sizeof(MaillonD));
maillon->valeur = valeur;
maillon->suivant = NULL;
maillon->precedent = NULL;
return(maillon);
}
/* Parcours la liste depuis le 1er maillon
et retourne le denier maillon de la liste */
MaillonD* dernier_maillon_dble(MaillonD* entete){
while(entete->suivant != NULL)
entete = entete->suivant;
return(entete);
}
/* Retourne OK si le maillon a ete trouve, ERR sinon */
int recherche_maillon_dble(MaillonD* entete, int valeur){
while((entete->valeur != valeur) && (entete->suivant!= NULL))
entete = entete->suivant;
if(entete->valeur == valeur)
return(OK);
else
return(ERR);
}
/* Ajoute un maillon nouvellement cree en debut de liste, si la valeur du
maillon entete est superieure a la valeur du nouveau maillon.
Retourne un pointeur sur le maillon en tete de liste */
MaillonD* ajoute_maillon_dble_entete(MaillonD* entete, MaillonD* nouveau){
if(entete != NULL){
nouveau->suivant = entete;
entete->precedent = nouveau;
entete = nouveau;
return(entete);
}else
return(NULL);
}
/* Ajoute un maillon nouvellement cree en fin de liste, si la valeur du
maillon enqueue est inferieure ou egale a la valeur du nouveau maillon.
Retourne un pointeur sur le maillon en queue de liste */
MaillonD* ajoute_maillon_dble_enqueue(MaillonD* enqueue, MaillonD* nouveau){
if(enqueue != NULL){
enqueue->suivant = nouveau;
nouveau->precedent = enqueue;
return(nouveau);
}else
return(NULL);
}
/* Ajoute le maillon nouvellement cree entre le maillon de valeur immediatement
inferieure ou egale et le maillon de valeur immediatement superieure */
int ajoute_maillon_dble_milieu(MaillonD* entete, MaillonD* nouveau){
MaillonD* suivant;
suivant = entete->suivant;
if((entete != NULL) && (suivant != NULL)){
while((entete->valeur <= nouveau->valeur) &&
(suivant->valeur < nouveau->valeur)){
entete = entete->suivant;
suivant = entete->suivant;
}
if(suivant->valeur > nouveau->valeur){
nouveau->suivant = suivant;
suivant->precedent = nouveau;
entete->suivant = nouveau;
nouveau->precedent = entete;
return(OK);
}
}
return(ERR);
}
/* Retourne un pointeur sur le maillon en tete de liste, NULL si la liste
est vide ou si l'unique maillon de la liste est supprime */
MaillonD* supprime_maillon_dble(MaillonD* precedent, int valeur){
MaillonD* encours;
MaillonD* suivant;
MaillonD* liste;
if(precedent != NULL){
if(precedent->valeur == valeur){
// le maillon a supprimer est le maillon en tete de liste
if(precedent->suivant != NULL){
encours = precedent->suivant;
encours->precedent = NULL;
liste = encours;
free(precedent);
return(liste);
}else{
free(precedent);
return(NULL);
}
}else{
liste = precedent;
encours = precedent->suivant;
suivant = encours->suivant;
while(encours->valeur != valeur){
precedent = encours;
encours = suivant;
suivant = suivant->suivant;
}
if(encours->valeur == valeur){
if(encours->suivant == NULL)
// le maillon a supprimer est le dernier de la liste
precedent->suivant = NULL;
else{
// le maillon a supprimer est au milieu de la liste
precedent->suivant = suivant;
suivant->precedent = precedent;
}
free(encours);
return(liste);
}
}
}
return(NULL);
}
/* Affiche les valeurs de la liste par ordre croissant */
int affiche_liste_croissant(MaillonD* affiche){
while(affiche != NULL){
printf("%d, ", affiche->valeur);
affiche = affiche->suivant;
}
puts("");
return(OK);
}
/* Affiche les valeurs de la liste par orde decroissant */
int affiche_liste_decroissant(MaillonD* affiche){
while(affiche != NULL){
printf("%d, ", affiche->valeur);
affiche = affiche->precedent;
}
puts("");
return(OK);
}
/* Retourne le choix de l'utilisateur */
int menu(void){
int choix = 0;
puts("");
puts("1. Ajouter un maillon");
puts("2. Supprimer un maillon");
puts("3. Rechercher un maillon");
puts("4. Afficher la liste dans l\'ordre croissant");
puts("5. Afficher la liste dans l\'ordre decroissant");
puts("6. Quitter");
printf("Entrez un choix : ");
scanf("%d", &choix);
return(choix);
}
/* Retourne la valeur dans le cas d'un(e) ajout/suppr./recherche d'un maillon */
int navigation(int choix){
int valeur = 0;
switch(choix){
case 1: // l'utilisateur ajoute un maillon a la liste
printf("Entrez la valeur a ajouter : ");
scanf("%d", &valeur);
break;
case 2: // l'utilisateur supprime un maillon de la liste
printf("Entrez la valeur a supprimer : ");
scanf("%d", &valeur);
break;
case 3: // l'utilisateur recherche un maillon dans la liste
printf("Entrer la valeur a rechercher : ");
scanf("%d", &valeur);
break;
}
return(valeur);
}
int main(void){
MaillonD* entete = NULL; // pointe sur le 1er maillon (declare a NULL)
MaillonD* enqueue; // pointe sur le dernier maillon
MaillonD* nouveau; // designe le maillon nouvellement cree
int valeur, choix, etat;
valeur = choix = etat = 0; // init
choix = menu();
while(choix != QUIT){ // tant que l'utilisateur ne quitte pas
if((choix > 1) && (entete == NULL)){
puts("La liste est vide.");
}else{
valeur = navigation(choix);
switch(choix){
case 1: // Ajout d'un maillon
nouveau = creer_maillon_dble(valeur);
if(entete != NULL){
if(nouveau->valeur < entete->valeur)
// Ajout d'un maillon en tete de liste
entete = ajoute_maillon_dble_entete(entete, nouveau);
else{
enqueue = dernier_maillon_dble(entete);
if(nouveau->valeur >= enqueue->valeur)
// Ajout d'un maillon en queue de liste
enqueue = ajoute_maillon_dble_enqueue(enqueue, nouveau);
else if((nouveau->valeur >= entete->valeur) &&
(nouveau->valeur < enqueue->valeur))
// Ajout d'un maillon en milieu de liste
ajoute_maillon_dble_milieu(entete, nouveau);
}
}else // entete == NULL --> 1er maillon ajoute a la liste
entete = nouveau;
break;
case 2: // Suppression d'un maillon
if(entete != NULL){
if(recherche_maillon_dble(entete, valeur) == OK){
entete = supprime_maillon_dble(entete, valeur);
if(entete == NULL)
free(entete);
}else
puts("La valeur n\'existe pas dans la liste.");
}else
puts("La liste est vide.");
break;
case 3: // Recherche d'un maillon
etat = recherche_maillon_dble(entete, valeur);
if(etat == ERR)
puts("la valeur recherchee n\'existe pas dans la liste.");
else
printf("la valeur a ete trouve : %d\n", valeur);
break;
case 4: // Affichage de la liste dans l'ordre croissant
affiche_liste_croissant(entete);
break;
case 5: // Affichage de la liste dans l'ordre decroissant
affiche_liste_decroissant(enqueue);
break;
}
}
choix = menu(); // re-init
}
return(EXIT_SUCCESS);
}
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
RE : CXIMAGERE : CXIMAGE par rt15
Cliquez pour lire la suite par rt15
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|