Apret une desallocation il affiche l'élément supprimer...!! [Résolu/Fermé]

Signaler
Messages postés
30
Date d'inscription
mardi 22 juillet 2014
Statut
Membre
Dernière intervention
17 mars 2016
-
Messages postés
30
Date d'inscription
mardi 22 juillet 2014
Statut
Membre
Dernière intervention
17 mars 2016
-
Bonjour, salut
voila mon code :
//***************************************************************
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//***************************************************************
// la structure :  
  typedef struct element ele;
      struct element {
        char nom[30];
        char prenom[30];
        char position;
        int valeur;
        ele*suiv;
      };
  typedef ele*liste;
 //*************************************************************** 
      // declaration globale de ma liste  :
        liste tete=NULL;
 //***************************************************************
  void inserer()
  {
      liste p=NULL;
       p=tete;
       ele * q =  malloc(sizeof(ele));
       printf("donnez le nom \n ");
       scanf("%s",&q->nom);
       printf("donnez le prenom \n");
       scanf("%s",&q->prenom);
       printf("donnez la position\n");getchar();
       scanf("%c",&q->position);
       printf("donnez la valeur\n");
       scanf("%d",&q->valeur);
       q->suiv=NULL;

       if(tete==NULL){
        tete=q;


       }else{
           while(p->suiv!=NULL){
             p=p->suiv;

           }
           p->suiv=q;

       }
  }
/**************************************************************
    void affichage(){
        liste p=tete;
        while(p!=NULL){
            printf("\n   ele  =   %s %s %c %d\n",p->nom,p->prenom,p->position,p->valeur);
            p=p->suiv;


        }
    }
/**************************************************************
    void supprimer(){
        liste L=tete,K=NULL;
        char suptemp[50];// le mot a rechercher 
         
        if(tete!= NULL){          // si la liste est vide
        printf("\n faites entrez un nom a supprimer : \n");
        scanf("%s",&suptemp);

           while(L!=NULL){
                 if(strcmp(L->nom,suptemp)==0){// si le nom est trouver
                   K=L;
                   L=L->suiv;
                   free(K);                                    // desallocation de mémoire 
                  }else{                                     // si le nom n'est pas trouver
                   L=L->suiv;
                 }
             }
       }else printf("la liste est vide");
    }
//-------------------------------------------
  int main(){
    int choix;
    do{
    printf("1 inserer\n");
    printf("2 supprimer\n");
    printf("3 affichage\n");
    printf("4 exite\n");
    scanf("%d",&choix);
    switch(choix){
    case 1:
        inserer();
    break;
    case 2:
        supprimer();
    break;
    case 3:
        affichage();
    break;
     }
    }while(choix!=4);
  return 0 ;
  }








4 réponses

Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 736
Bonjour,

Déjà, ton code n'est pas bon au niveau des commentaires
Avant void affichage(), tu as mis un /* que tu ne refermes pas...
Ensuite, il faut être plus précis dans les explications.
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63550 internautes nous ont dit merci ce mois-ci

Messages postés
30
Date d'inscription
mardi 22 juillet 2014
Statut
Membre
Dernière intervention
17 mars 2016
1
 //***************************************************************
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//***************************************************************
// la structure :  
  typedef struct element ele;
      struct element {
        char nom[30];
        char prenom[30];
        char position;
        int valeur;
        ele*suiv;
      };
  typedef ele*liste;
 //*************************************************************** 
      // declaration globale de ma liste  :
        liste tete=NULL;
 //***************************************************************
  void inserer()
  {
      liste p=NULL;
       p=tete;
       ele * q =  malloc(sizeof(ele));
       printf("donnez le nom \n ");
       scanf("%s",&q->nom);
       printf("donnez le prenom \n");
       scanf("%s",&q->prenom);
       printf("donnez la position\n");getchar();
       scanf("%c",&q->position);
       printf("donnez la valeur\n");
       scanf("%d",&q->valeur);
       q->suiv=NULL;

       if(tete==NULL){
        tete=q;


       }else{
           while(p->suiv!=NULL){
             p=p->suiv;

           }
           p->suiv=q;

       }
  }
//**************************************************************
    void affichage(){
        liste p=tete;
        while(p!=NULL){
            printf("\n   ele  =   %s %s %c %d\n",p->nom,p->prenom,p->position,p->valeur);
            p=p->suiv;


        }
    }
//**************************************************************
    void supprimer(){
        liste L=tete,K=NULL;
        char suptemp[50];// le mot a rechercher 
         
        if(tete!= NULL){          // si la liste est vide
        printf("\n faites entrez un nom a supprimer : \n");
        scanf("%s",&suptemp);

           while(L!=NULL){
                 if(strcmp(L->nom,suptemp)==0){// si le nom est trouver
                   K=L;
                   L=L->suiv;
                   free(K);                                    // desallocation de mémoire 
                  }else{                                     // si le nom n'est pas trouver
                   L=L->suiv;
                 }
             }
       }else printf("la liste est vide");
    }
//-------------------------------------------
  int main(){
    int choix;
    do{
    printf("1 inserer\n");
    printf("2 supprimer\n");
    printf("3 affichage\n");
    printf("4 exite\n");
    scanf("%d",&choix);
    switch(choix){
    case 1:
        inserer();
    break;
    case 2:
        supprimer();
    break;
    case 3:
        affichage();
    break;
     }
    }while(choix!=4);
  return 0 ;
  }
 
Messages postés
30
Date d'inscription
mardi 22 juillet 2014
Statut
Membre
Dernière intervention
17 mars 2016
1
bon salut fiddy , pour être précis
mon problème c'est le chaînage des élément de ma liste je veux dire que mémé si je fais pas la dés-allocation d'un élément il doit être disparu en affichage pasque j'ai fais
L=L->suiv;
(la ligne 70) j'ai mis l'adresse du suivant dans le suiv de l'element précédent de l'element que je veux supprimer
Messages postés
30
Date d'inscription
mardi 22 juillet 2014
Statut
Membre
Dernière intervention
17 mars 2016
1
donc ma question pourquoi ça ne marche pas et pourquoi l'element suprimer est afficher après tous ça ???????
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 736
Bonjour informatique_c

Faut pas être si impatient, si on ne répond pas c'est qu'on n'est pas dispo ;-).

Alors déjà, les variables globales sont à éviter. Il vaut mieux envoyer les variable en paramètre.
Ensuite, il ne faut pas mettre de & dans les scanf("%s", ...).
Par exemple :
scanf("%s",&q->nom); doit être transformé en
scanf("%s",q->nom);.
Je te laisse corriger tous les scanf("%s", ...).
Et enfin, le gros problème se trouve dans la fonction supprimer().
Tu "supprimes" l'élément courant, mais il faut bien penser à rattacher l'élément d'avant à l'élément d'après. Je te laisse réfléchir sur ce point.
Cdlt,
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63550 internautes nous ont dit merci ce mois-ci

Messages postés
30
Date d'inscription
mardi 22 juillet 2014
Statut
Membre
Dernière intervention
17 mars 2016
1
bonjour fiddy et merci beaucoup pour vautre repense je vais corriger et voire se qui manque par suite merci encore... ^_^
Messages postés
609
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
24 juin 2016
41
Bonsoir
En plus de ce que @fiddy a dit en va éviter de mettre des
typedef
partout "one" suffit.
Puis découpon le programme en sous-programme c'est-à-dire, une fonction inséré qui va dynamiquement allouer les espaces nécessaires des cellule et ajouté automatiquement les donner et préparer le terrain pour la cellule suivante une fonction afficher pour afficher l'ensemble de donner et ta fameuse fonction supprimer une cellule en envoyant vrais ou faux.

Dans mon exemple, j'ai fait simple et pas optimiser on partons de ta structure initiale de plus, le choix des pointeurs en <gras>nom d'utilisateurs
est mieux qu'une taille fixe car en ne sait pas réellement combien un nom peut prendre en taille surtout si c'est un non composer cas russe par exemple
Bref je tiens a précisé que c'est un exemple le code n'est pas optimisé et ont peut mieux faire.
à bientôt

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

//Variable type Bool
typedef enum{ false, true}bool;

//Structure de donnée
typedef struct s_Elev{

	char *pNon;
	char *pPre;

	float fVal;
	unsigned int iPos;
	struct s_Elev *pN;
}ts_Elev;

/**
* Insère les informations
**/
void f_AddEleves( ts_Elev *pData, const char *pN,const char *pP, const float fVal ){

	ts_Elev *p = pData;
	unsigned int i = 0;

	/**
	*	Recherche dynamique de
	*	la cellule à alouer
	**/
	while( p->pN ){
		i++;
		p = p->pN;
	}

	//Allocation de la cellule
	p->pN = (ts_Elev*)calloc( 1, sizeof(struct s_Elev) );
	if( p->pN == NULL ){
		perror( "Allocation pour new Elève\n" );
		exit( EXIT_SUCCESS );
	}
	p = p->pN;


	//Allocation sans contrôle de la nouvelle cellule
	p->pNon = (char*)calloc( strlen(pN), sizeof(char) );
	p->pPre = (char*)calloc( strlen(pP), sizeof(char) );

	//Ajout des informations
	p->iPos = i++;
	p->fVal = fVal;
	strcpy( p->pNon, pN );
	strcpy( p->pPre, pP );

	//Mise à nulle le pointeur suivant
	p->pN = NULL;
}

//Affiche la liste
void f_AfficherListe( ts_Elev *pData ){

	ts_Elev *p = pData;
	while( p ){

		printf( "[\t%d\t]\t", p->iPos );
		printf( "Nom\t:%s\t", p->pNon );
		printf( "Prénom\t:%s \t", p->pPre );
		printf( "Notes\t:%lf \n", p->fVal );

		p = p->pN;
	}
}


/**
* A faire
**/
/*bool f_Suprimer( ts_Elev *pData, const char *pN ){

	ts_Elev *p = pData;
	ts_Elev *o = NULL;

	while( (p->pN != NULL) && ( /*quelquechose != Quelquechose) ){
		/*faire quelque chose
	}

	( ... ){
		free( o );
		return ( true );
	}
	return ( false );
}*/

//Programme Princiaple
int main( void ){

	ts_Elev ListE;
	(&ListE)->pN = NULL;

	f_AddEleves( &ListE, "Toto", "Titi", 0.14 );
	f_AddEleves( &ListE, "Caca", "Bonb", 10.14 );
	f_AddEleves( &ListE, "Verb", "sylv", 15.14 );
	f_AddEleves( &ListE, "Piko", "Yesa", 9.14 );
	f_AddEleves( &ListE, "Inté", "Géni", 20.00 );
	f_AddEleves( &ListE, "ZigZ", "Flem", 0.1 );

	f_AfficherListe( (&ListE)->pN );

	/*if( f_Suprimer( (&ListE)->pN, "Verb" ) ){
		printf( "Valeur Suprimer\n" );
	}
	else
		printf( "La valeur à suprimer Existe pas\n" );

	f_AfficherListe( (&ListE)->pN );*/

	//Free de la liste à faire
	return ( EXIT_SUCCESS );
}
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63550 internautes nous ont dit merci ce mois-ci

Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 736
Attention à ne pas trop abuser du gras ;-).
Messages postés
609
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
24 juin 2016
41
Roooooo , c'est pour marquer les points important :)
Messages postés
30
Date d'inscription
mardi 22 juillet 2014
Statut
Membre
Dernière intervention
17 mars 2016
1
meciiiiiiiii sambia39 j'apprend de nouveaux trucs avec vous comme ( le perror() ) par ex merci boucoup
Messages postés
30
Date d'inscription
mardi 22 juillet 2014
Statut
Membre
Dernière intervention
17 mars 2016
1
j'attend vaux repenses avec impatience