Corrigez ce programme C svp

qaszde Messages postés 112 Statut Membre -  
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   -
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
A voir également:

1 réponse

fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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