Exercice listes chainées

Fermé
nerazzurri - 10 janv. 2008 à 20:54
 taktakach - 11 avril 2012 à 18:40
Bonjour,je suis débutant en c et je voudrais resoudre un petit exercice consiste à afficher un menu comporte 5 opérations [ 1) Ajout 2) Modification 3) Consultation 4) Suppression 0) Quitter ], sur enregistrement sa définition est comme suite [ struct fiche { char nom[25];
char prenom[20]; int age; int code; struct fiche *pSuivant ; }; ] (à l'aide des listes chainées ) , s'il ya quelqu'un qui peut m'aider je serai trés content et merci.

11 réponses

erraji khalid
26 avril 2010 à 08:53
voici un programe qui contient 7 operations ajouter une liste entete,ajouter en fin,inserer une liste,afficher tous,rechercher par reference et afficher,la suppression d'une liste,modifier une liste.
concernant la gestion d'un produit(reference,nom,prix de vente ,prix d'achat)
il suffit seulement d 'avoir un sens d'imagination et de bien ce concentrer et aprés c'est sur qu'il
apparaitera que c'est simple
je souhaite qu'il vous plais,bon courage!!!

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

typedef struct produit{
int ref;
char nom[30];
float p_vente,p_achat;
produit* next;

};

produit* ajouter_produit_entete(produit* list){

produit* nv=(produit*)malloc(sizeof(produit));
if(list==NULL){
printf("on va initialiser par la premiere liste\n");
}


printf("donner le ref de produit");
scanf("%d",&(*nv).ref);
produit* tmp;
tmp=list;
while(tmp!=NULL){
if(tmp->ref==nv->ref){
printf(" ce ref exist deja essayez encore\n");
return list;
goto sortie;
}
tmp=tmp->next;
}
printf("donner lenom de produit");
scanf("%s",(*nv).nom);
printf("donner la prix d'achat ");
scanf("%f",&(*nv).p_achat);
printf("donner la prix de vente");
scanf("%f",&(*nv).p_vente);

nv->next=list;
return nv ;
sortie:;
}

void afficher_tout(produit*list){
produit* tmp;
tmp=list;
if(tmp==NULL){
printf("acune liste a afficher ajoutez une\n");
}
while(tmp!=NULL){
printf("le ref de produit est:%d\n",tmp->ref);
printf("le nom de produit est:%s\n",tmp->nom);
printf("le prix d'achat de produit est:%f\n",tmp->p_achat);
printf("le prix de vente de produit est:%f\n",tmp->p_vente);
tmp=tmp->next;


}

}

produit* ajouter_enfin(produit*list){
produit* nv=(produit*)malloc(sizeof(produit));
if(list==NULL){
printf("on va initialiser par la premiere liste liste\n");
}

printf("donner le ref de produit");
scanf("%d",&(*nv).ref);
produit* tmp;
tmp=list;
while(tmp!=NULL){
if(tmp->ref==nv->ref){
printf(" ce reference concerne un autre produit\n");
return list;
goto sortie ;
}
tmp=tmp->next;
}
printf("donner lenom de produit");
scanf("%s",(*nv).nom);
printf("donner la prix d'achat ");
scanf("%f",&(*nv).p_achat);
printf("donner la prix de vente");
scanf("%f",&(*nv).p_vente);
nv->next=NULL;
if(list==NULL){
return nv;
}else{
produit*tmpe;
tmpe=list;
while(tmpe->next!=NULL){
tmpe=tmpe->next;
}
tmpe->next=nv;
return list;
}
sortie:;
}

produit* inserer_une_liste(produit* list){
if(list==NULL){
printf("on va initialiser par la premiere liste car elle n' existe aucune \n");
}
produit* nv=(produit*)malloc(sizeof(produit));
printf("donner le ref de produit");
scanf("%d",&(*nv).ref);
produit* tmp;
tmp=list;
while(tmp!=NULL){
if(tmp->ref==nv->ref){
printf(" ce ref exist deja essayez encore\n");
return list;
goto sortie ;
}
tmp=tmp->next;
}
printf("donner lenom de produit");
scanf("%s",(*nv).nom);
printf("donner la prix d'achat ");
scanf("%f",&(*nv).p_achat);
printf("donner la prix de vente");
scanf("%f",&(*nv).p_vente);
if(list==NULL){
nv->next=list;
return nv;
}else{
printf("donner le ref de produit que vous voulez inserer apre");
int a;
scanf("%d",&a);
produit* tmp;
tmp=list;
while(tmp->ref!=a ){
tmp=tmp->next;
if(tmp==NULL){
printf("ereure!!! vous ne devez pas donner le ref du produit que vous ");
printf("voulez inserer mais celui d'un autre qui existe deja\n");
return list;
goto sortie ;
}
}
nv->next=tmp->next;
tmp->next=nv;
return list;

}
sortie:;
}

void rechercher_par_ref_et_affiche(produit*list){
printf("donner le ref de produit que vous voulez afficher");
int a;
scanf("%d",&a);
produit* tmp;
tmp=list;
while(tmp->ref!=a ){
tmp=tmp->next;
if(tmp==NULL){
printf("le ref du produit que vous voulez afficher n'existe pas\n ");

goto sortie;
}
}
printf("le ref de produit est:%d\n",tmp->ref);
printf("le nom de produit est:%s\n",tmp->nom);
printf("le prix d'achat de produit est:%f\n",tmp->p_achat);
printf("le prix de vente de produit est:%f\n",tmp->p_vente);

sortie:;
}
produit* supprimer(produit* list){
if(list==NULL){
goto sortie1;
}
printf("donner le ref de produit que vous voulez supprimer");
int a;
scanf("%d",&a);
produit* tmp;
tmp=list;
while(tmp!=NULL){
if(tmp->ref==a){
printf(" la liste concernant ce produit va etre suprime\n");

goto sortie2 ;
}
tmp=tmp->next;
}
if(tmp==NULL){
printf("le ref que vous avez donner n'existe pas\n");
goto sortie3;
}
sortie2:
if(tmp==list){
list=list->next;
}else{
produit*tmp2;
tmp2=list;
while(tmp2->next!=tmp){
tmp2=tmp2->next;
}
tmp2->next=tmp->next;
free(tmp);
};
return list;
sortie1:
printf("elle n'y a aucune liste a supprimer vous devez ajouter au moins une\n");
return list;
sortie3:
return list;
}
produit* modifier(produit*list){
if(list==NULL){
printf(" elle n'existe aucune liste a modifier\n");
return list;
}else{
printf("donner le ref de produit que vous voulez modifier\n------->");
int a;
scanf("%d",&a);
produit *tmp;
tmp=list;
while(tmp->ref!=a){
tmp=tmp->next;
if(tmp==NULL){
goto sortie1;
}
}
printf("donnez le nouveau ref");
int b;
scanf("%d",&b);
produit * tmpe;
tmpe=list;
if(tmp->ref!=b){
while(tmpe!=NULL){
if(tmpe->ref==b){
goto sortie2;
}
tmpe=tmpe->next;
}
}
tmp->ref=b;

printf("donner lenom de produit");
scanf("%s",tmp->nom);
printf("donner la prix d'achat ");
scanf("%f",&tmp->p_achat);
printf("donner la prix de vente");
scanf("%f",&tmp->p_vente);
return list;

sortie1:;
printf("ce ref n'exite pas\n");
return list;
sortie2:;
printf("c'est un reference concernant un autre produit!!!!???\n");
return list;
}
}
void Menu(produit* list){

int a;

while(a!=0){
printf("--------------------------*****bonjour:******--------------------------");
printf("\n voila le menue :\n0-pour exit\n1-ajouter une liste entete");
printf("\n2-ajouter en fin\n3-inserer une liste\n4-afficher tous\n");
printf("5-rechercher par ref et afficher\n6-la suppression d'une liste\n7-modifier une liste\ndonner le numero de la tahe que vous voulez executer\n ---->");
scanf("%d",&a);



switch(a){
case 1: list= ajouter_produit_entete(list);break;
case 4: afficher_tout(list);break;
case 2: list=ajouter_enfin(list);break;
case 3:list= inserer_une_liste(list);break;
case 5: rechercher_par_ref_et_affiche(list);break;
case 6: list = supprimer(list);break;
case 7: list =modifier(list);break;
default : printf("\n ----------------------------\n ****** Indice hors limites !! *******\n-------------------------\n");break;
}

}

}



main(){
produit* la_liste;
la_liste=NULL;
Menu(la_liste);


}
28
Blyess Messages postés 3 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 10 janvier 2008 9
10 janv. 2008 à 21:32
slt, voilà ce que j'était fait , j'ai réalisé seulement l'opération d'ajout mais elle ne fonctionne pas, je ne sais pas ou est le pbme, quand j'execute le pgme il ne teste pas la boucle while

#include <conio.h>
#include <alloc.h>
#include <stdio.h>
struct fiche{
char nom[25];
char prenom[20];
int age;
int code;
struct fiche*pSuivant;
};
void main()
{int choix;
struct fiche*nouveau;
struct fiche*tete;
struct fiche*courant;
tete = NULL;
nouveau=(struct fiche*)malloc(sizeof(struct fiche));
nouveau->pSuivant=tete;
tete=nouveau;



clrscr;
printf(" ************************* Menu *************************\n");
printf(" * ---- *\n");
printf(" * 1) Ajout *\n");
printf(" * 2) Consultation *\n");
printf(" * 3) Modification *\n");
printf(" * 4) Suppression *\n");
printf(" * 0) Quiter *\n");
printf(" * *\n");
printf(" ********************************************************\n");

printf("\nQue voulez-vous faire ? Choisisez entre 1,2,3,4 ou quitter le programme 0: ");
scanf("%d",&choix);
switch (choix)
{
case 1 :{ clrscr;
printf("\n************** Ajout d'une nouvelle personne **************\n");
printf("\n Entrez le Nom, Prenom et l'Age : \n");

courant=tete;
if(tete!=NULL){
while(courant->pSuivant!=NULL){
courant=courant->pSuivant;
nouveau=(struct fiche*)malloc(sizeof(struct fiche));
courant->pSuivant=nouveau;
nouveau->pSuivant=NULL;
printf(" Nom : "); scanf("%s",nouveau->nom[25]);
printf(" Prenom : "); scanf("%s",nouveau->prenom[20]);
printf(" Age : "); scanf("%d",nouveau->age);
nouveau->code++ ;
}
}
};
case 2 :{ clrscr;
break;
}
}
getch();

}
8
Doctor C Messages postés 627 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 19 février 2016 398
10 janv. 2008 à 21:53
Si je peux me permettre, je n'aime pas trop ton allocation de mémoire!

C'est quoi cette idée d'allouer de la mémoire à un nouveau noeud avant même d'avoir choisi d'en créer un!

En plus, je ne saisis pas ta logique du tout... tu fais quoi? une pile?
je comprend pas pourquoi tu modifies la valeur de la tête avant même que le programme ait afficher le menu.

et pas étonnant que ton while marche pas, tu lui fais vérifier si courant->pSuivant!=NULL ... qui est déjà null...

vraiment, je comprend pas ton code!
0
Xana > Doctor C Messages postés 627 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 19 février 2016
31 mai 2009 à 14:06
alor kel solution proposes tu?
0
perdu de temps le temps est l·argent
0
sfel Messages postés 1640 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 15 juillet 2009 430
10 janv. 2008 à 20:57
qu'as-tu réalisé pour l'instant ??

on te corrigera.
3
Blyess Messages postés 3 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 10 janvier 2008 9
10 janv. 2008 à 21:21
slt, j'ai un pbme au niveau du remplissage des champs de l'enregistrement, comment utiliser les listes chainées pour remplir les champs
c-à-d ajouter enregistrement à une liste avec le remplissage de ses chomps
1
Doctor C Messages postés 627 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 19 février 2016 398
10 janv. 2008 à 21:38
En fait, tu devrais utiliser cette stratégie pour ton programme:

A. Fait toi un menu du genre:

1. Ajouter un enregistrement
2. Modifier un enregistrement
3... etc

B. Lorque l'utilisateur appuie sur 1, tu appelles la fonction Ajouter(); 2 la fonction Modifier(); etc...

Et pour l'ajout d'enregistrement, tu n'as qu'à demander à l'utilisateur d'entrer une à la suite des autres les informations que tu as besoins (nom, prénom, etc.) avec des gets ou des scanf. Une fois que tu as récolté toutes tes données dans des variables, tu te crées une nouvelle occurence de ta structure avec ces informations et tu l'ajoutes dans ta liste.

J'espère avoir été clair et pas trop mélangeant!

si tu as des questions, laisse-toi aller!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
10 janv. 2008 à 22:04
1
j'ai un controle tp et j'ai besoin de savoir la solution de ce exercice:
on veut représenter des polynomes de derés quelconque sous formae de listes chainées.pour cela,on dispose de 2 polynomes P1 et P2 de degrés n et m(n et m etant quelconques)représentés par deux listes chainées linéaires unidirectionnelles.
le travail demandé est d'additionner ces deux polynomes dans un troisiéme.
mercu de me répondre par un e-mail, vite
1
sfel Messages postés 1640 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 15 juillet 2009 430
10 janv. 2008 à 21:51
alors pour commencer, tes
printf(" Nom : "); scanf("%s",nouveau->nom[25]);
printf(" Prenom : "); scanf("%s",nouveau->prenom[20]);
printf(" Age : "); scanf("%d",nouveau->age); 


tu peux les mettre avant ton if.

sinon tu as fai un " if(tete!=NULL) "
tu fais pas le "else" ???

dans ta logique, par rapport a ta chaine, où ajoutes-tu ton nouveau (juste voir si tu as bien compris ton analyse, me jete pas de tomates tout de suite ^^)


après il y a 10 mille truc qu'on pourrais te dire, mais je préfère attendre au fur et a mesure, pour que l'analyse soit clair dans ton esprit
0
Blyess Messages postés 3 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 10 janvier 2008 9
10 janv. 2008 à 21:59
exactement, et aprés chaque opération en revient au menu, mas pour ne pas compliquer les choses on peut ne pas utiliser les appelles aux fonctions pour chaque opération
0
pose bien ta question,
liste chainée a entête ou monodirectionnelle.

un peu de précision ptit

tiga
0
j'ai un controle tp et j'ai besoin de savoir la solution de ce exercice:
on veut représenter des polynomes de derés quelconque sous formae de listes chainées.pour cela,on dispose de 2 polynomes P1 et P2 de degrés n et m(n et m etant quelconques)représentés par deux listes chainées linéaires unidirectionnelles.
le travail demandé est d'additionner ces deux polynomes dans un troisiéme.
mercu de me répondre
0
Doctor C Messages postés 627 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 19 février 2016 398
10 janv. 2008 à 21:08
je vais quand même pas t'écrire la solution au complet...

as-tu des problèmes spécifiques? par exemple une fonction dont tu n'as aucune idée comment coder?
-1