Corrigez ce programme C svp

Fermé
qaszde Messages postés 97 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 20 mai 2011 - 2 mars 2009 à 15:39
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 2 mars 2009 à 16:05
Bonjour,
ecrire un programme C qui charge dans une liste chainée des mots à partir d'un fichier, et de d'inserer un mot et supprimer un mot ( les mots seront donnés par l'utilisateur)
, de trier cette liste et enfin de l'afficher.

ben j'ai écrit ce code il est compilé mais il existe des fautes lors de l'éxécution
par exemple lors de l'affichage il ne s'affiche que le mot à insérer

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

struct liste
{
char s[50];
struct liste* next;
};
typedef struct liste LISTE;

int INIT_fichier(FILE**fp,int argc,char *argv[])
{
if(argc<2)
{
printf("Syntaxe %s<file>",argv[0]);
return(0);
}
if(!(*fp= fopen(argv[1],"r")))
return(0);
return(1);

}


void insere_mot(LISTE**first, char s[])
{
LISTE* p;
p=(LISTE*)malloc(sizeof(LISTE));
strcpy(p->s,s);
p->next=*first;
*first=p;
}

LISTE* chargement_liste(FILE*fp)
{
char s[50]; LISTE* first;
for(first=NULL;fgets(s,50,fp);)
{
*(s+(strlen(s)-1))='\0'; //supprimer \n//
insere_mot(&first,s);
}
return(first);
}





void supprime_mot(LISTE**first,char mot[])
{
LISTE* prev=NULL, *p=*first;
while(p!=NULL && (strcmp(p->s,mot)))
{
prev=p;
p=p->next;
}
if(p!=NULL)
{
if(p!=*first)
prev->next=p->next;
else
* first=p->next;
free(p);
}
}


void affiche_liste(LISTE*first)
{
LISTE* p;
for(p=first;p;p=p->next)
puts(p->s);
}

LISTE* min_mot(LISTE* p)
{
LISTE* p_min=p,*q=p->next;
while(q!=NULL)
if(strcmp(q->s,p_min->s)<0)
p_min=q;
return(p_min) ;
}

void permute(LISTE* p1,LISTE* p2)
{
char temp[50];
strcpy(temp,p1->s);
strcpy(p1->s,p2->s);
strcpy(p2->s,temp);
}


void tri_liste(LISTE**first)
{
LISTE* p=*first, *p_min;
while(p->next!=NULL)
{p_min=min_mot(p);
if(p!=p_min)
permute(p,p_min);
p=p->next;
}
}


int main(int argc, char *argv[])
{
FILE* fp;
char mot[50], mot1[50];
LISTE* first;

if(!(INIT_fichier(&fp,argc,argv)))
exit(0);
first=chargement_liste(fp);
printf("Donnez le mot a inserer");
gets(mot);
insere_mot(&first,mot);
printf("Donnez le mot a supprimer");
gets(mot1);
supprime_mot(&first,mot1);
affiche_liste(first);
tri_liste(&first);
}


merci pour votre aide

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
2 mars 2009 à 16:05
Salut,
L'erreur vient du faire que lorsque tu utilises gets, t'obtiens le '\n' en fin de chaîne.
Il faut donc le supprimer, sinon la comparaison échouera toujours. Ce qui explique pourquoi tu n'as pas de suppression.
Donc :
fgets(mot1,sizeof mot1,stdin); //fgets et non gets (car gets c'est dangereux).
{
     char *p=strchr(mot1,'\n'); //on recherche si le \n existe
     if(p) *p='\0'; //s'il existe on le supprime.
}
supprime_mot(&first,mot1);

N'oublie pas de faire pareil pour la fonction "insérer".

Revérifie ta fonction mot_min. Tu ne modifies pas q, ça devrait donc partir en boucle infinie.
Et enfin n'oublie pas de faire un return 0; à la fin du programme pour signaler que tout va bien ;-)
Cdlt
0