[C] Parcours d'une liste chainee

Résolu/Fermé
vgortz Messages postés 3 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 6 novembre 2007 - 19 oct. 2007 à 17:58
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 22 oct. 2007 à 10:10
Bonjour,
dans le cadre de l'amélioration d'un programme de pendu pour l'école, je dois manipuler une liste chainée (en langage C).
Avant de bousiller le programme, sachant que je ne maitrisais pas trop les liste chainées, j'ai créé un petit programme tout simple pour voir le fonctionnement de ce genre de structure, voici ce que j'ai :

Fichier contenant la structure et les prototypes:
typedef struct pile
{
int valeur;
struct pile *prec;
}pile;

void push(pile **p, int val);
int pop(pile **p);
int Length(pile *p);
void clear(pile **p);
void view(pile *p);

Fichier contenant les implémentations de mes fonctions:
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include "struct.h"
void push(pile **p, int val)
{
pile *element=(pile*)malloc(sizeof(pile));
if(!element)
{
printf("erreur allocation, relancer le programme");
exit(-1);
}
element->valeur=val;
element->prec=*p;
*p=element;
};

int pop(pile **p)
{
int val;
pile *tmp;
if(!*p) return -1;
tmp=(*p)->prec;
val=(*p)->valeur;
free(*p);
*p=tmp;
return val;
};

int Length(pile *p)
{
int n=0;
while(p)
{
n++;
p=p->prec;
}
return n;
};

void clear(pile **p)
{
pile *tmp;
while(*p)
{
tmp=(*p)->prec;
free(*p);
*p=tmp;
}
};

void view(pile *p)
{
while(p)
{
printf("%d\n",p->valeur);
p=p->prec;
}
}

Fichier main pour les tests :
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include "struct.h"

int main(void)
{
pile *MaPile=NULL;
int menu,nb;
do
{
system("CLS");
printf("1. ajouter un element a la pile\n");
printf("2. enlever un element de la pile\n");
printf("3. afficher la pile\n");
printf("4. nombre d'elements dans la pile\n");
printf("5. quitter\n");
scanf("%d",&menu);
system("CLS");
switch(menu)
{
case 1 : printf("Nombre (entier) a ajouter: ");
scanf("%d",&nb);
push(&MaPile,nb);
break;
case 2 : nb=pop(&MaPile);
break;
case 3 : view(MaPile);
getch();
break;
case 4 : printf("Nb elements: %d\n",Length(MaPile));
getch();
break;
case 5 : clear(&MaPile);
break;
default: printf("entrer un chiffre entre 1 et 5");
getch();
break;
}
}while(menu!=5);
return 0;
}

j'ai trouvé les implémentations sur le net et je les comprends assez bien.
Ce dont j'ai besoin maintenant, c'est une fonction permettant d'aller à un maillon bien précis pour en retirer le contenu et ensuite le supprimer.

7 réponses

vgortz Messages postés 3 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 6 novembre 2007 2
19 oct. 2007 à 21:28
je sais mais c'est ce que j'ai trouvé de plus approchant (mais surtout de plus clair) en cherchant sur la toile.
Ceci dit, entre

typedef struct pile
{
int valeur;
struct pile *prec;
}pile;

et

typedef struct _maillon{
struct _maillon *next;
int data; // si on prends un cas particulier plutot qu'on générique
} maillon;

je ne vois pas de grande différence, si je renome prec en next, il n'y a plus que les noms de variables qui changent.

Je comprends bien l'idée de la structure supplémentaire contenant deux pointeurs (l'un vers le premier maillon et l'autre vers le dernier) bien que dans le cas d'un liste simplement chainée je n'en vois pas l'utilité (si ce n'est que en général c'est utilisé par tout le monde).

il me reste à poser deux questions pour orienter un peu la discussion et éviter de lancer un "simple" débat sur les listes
Entre la pile et la liste, qu'est-ce qui changerait dans mon code?
Comme je l'ai déjà demandé avant :
si j'ai 10 maillons, que je veux extraire la donnée du 3e (par exemple) pour la transférer à une autre variable (donc il ne me fait pas un void element_x(); mais plutot un int element_x();
comment puis-je procéder ? (en oubliant pas que une fois la donnée extraite, je dois supprimer le maillon)
2