Apret une desallocation il affiche l'élément supprimer...!!

Résolu/Fermé
informatique_c Messages postés 30 Date d'inscription mardi 22 juillet 2014 Statut Membre Dernière intervention 17 mars 2016 - 8 nov. 2014 à 11:21
informatique_c Messages postés 30 Date d'inscription mardi 22 juillet 2014 Statut Membre Dernière intervention 17 mars 2016 - 9 nov. 2014 à 18:36
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 ;
  }








A voir également:

4 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
8 nov. 2014 à 11:51
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
informatique_c Messages postés 30 Date d'inscription mardi 22 juillet 2014 Statut Membre Dernière intervention 17 mars 2016 1
8 nov. 2014 à 12:04
 //***************************************************************
#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 ;
  }
 
0
informatique_c Messages postés 30 Date d'inscription mardi 22 juillet 2014 Statut Membre Dernière intervention 17 mars 2016 1
8 nov. 2014 à 12:12
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
0
informatique_c Messages postés 30 Date d'inscription mardi 22 juillet 2014 Statut Membre Dernière intervention 17 mars 2016 1
8 nov. 2014 à 12:15
donc ma question pourquoi ça ne marche pas et pourquoi l'element suprimer est afficher après tous ça ???????
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
8 nov. 2014 à 17:28
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
informatique_c Messages postés 30 Date d'inscription mardi 22 juillet 2014 Statut Membre Dernière intervention 17 mars 2016 1
8 nov. 2014 à 21:09
bonjour fiddy et merci beaucoup pour vautre repense je vais corriger et voire se qui manque par suite merci encore... ^_^
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
8 nov. 2014 à 22:28
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
8 nov. 2014 à 22:50
Attention à ne pas trop abuser du gras ;-).
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
8 nov. 2014 à 23:01
Roooooo , c'est pour marquer les points important :)
0
informatique_c Messages postés 30 Date d'inscription mardi 22 juillet 2014 Statut Membre Dernière intervention 17 mars 2016 1
9 nov. 2014 à 18:36
meciiiiiiiii sambia39 j'apprend de nouveaux trucs avec vous comme ( le perror() ) par ex merci boucoup
0
informatique_c Messages postés 30 Date d'inscription mardi 22 juillet 2014 Statut Membre Dernière intervention 17 mars 2016 1
8 nov. 2014 à 16:06
j'attend vaux repenses avec impatience
0