IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Affichage après Suppression element Listes Chainées


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Juin 2006
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Juin 2006
    Messages : 123
    Points : 59
    Points
    59
    Par défaut Affichage après Suppression element Listes Chainées
    Bonjour à tous! Je suis entrain de faire une petite application sur les LinkedList ~~ Autrement les liste chainées. Et mon problème se trouve au niveau de la suppression d'un node dans la chaine.
    Voici mon code pour la declaration de ma structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    struct _CUSTNAME;
    typedef struct _CUSTNAME {
    struct _CUSTNAME *NextCustomer; // Link to next, or NULL if none
    struct _CUSTNAME *PrevCustomer; // Link to previous, or NULL if none
    	char Cust_Name[50]; // 50 chars for name;
    	char Trans_Description[50]; // 50 chars for trans descrip; 
    	int Cust_Number; 
    	int nRecordNumber; // Which record number?
    	} CUSTNAME;
     
    	typedef CUSTNAME *NPCUSTNAME;
    	typedef CUSTNAME *PCUSTNAME;
     
    	FILE *DataFile;
    	PCUSTNAME FirstCustomer = NULL;
    	PCUSTNAME LastCustomer = NULL;
    	PCUSTNAME Customer = NULL;
    	PCUSTNAME TempCustomer = NULL;
    Et ici mon code pour supprimer un élément dans la liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    void removeNodeAt()
    	{
    printf("Display customers\n");
    // ici est mon code pour afficher les données de la liste avant suppression et il n'ya pas de problème a ce niveau
     
    // Après affichage je demande de choisir le numero a supprimer
    printf ("Please enter the customer number to remove : ");
    scanf("%d",&RemoveNumber);
     
    TempCustomer = FirstCustomer;
    found =0;
    do{
    	if (TempCustomer->Cust_Number==RemoveNumber)
    	{
    		found=1;
     
    //J'avais mis ce code mets cela me generait une erreur du genreUnhandled exception at .... and Access violation reading location...je l'ai donc mis en commentaire pour juste supprimer mon element et afficher la liste après suppression...
    /*TempCustomer->PrevCustomer->NextCustomer=TempCustomer->NextCustomer;
    		TempCustomer->NextCustomer->PrevCustomer=TempCustomer->PrevCustomer;*/
    		free(TempCustomer);
    	}else
    	TempCustomer=TempCustomer->NextCustomer;
    }while((TempCustomer) && (!found));
     
    	/* Display the list */
     
    	TempCustomer = FirstCustomer;
    	printf("\n List after deletion \n");
    	//	TempCustomer = TempCustomer->NextCustomer;
     
    while (TempCustomer)
    		{
     
    		printf("Name '%s' CustNumb '%d' TransDescr '%s' \n",TempCustomer->Cust_Name,TempCustomer->Cust_Number,TempCustomer->Trans_Description);
     
    		TempCustomer = TempCustomer->NextCustomer;}
     
    	}
    Et mon problème se trouve a ce niveau de l'affichage..J'ai l'impression que mon élément est bien supprimé mais l'affichage pose problème car si par exple j'ai 3 elements ..j'arrive à afficher les 2 elements non supprimés par contre la ligne supprimée est affichée avec des plein de lettres bizarres.... Et cela me plante mon programme avec un message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Unhandled exception at 0x0041207b in LinkedList.exe: 0xC0000005: Access violation reading location 0xfeeeff5a.

  2. #2
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    As tu penser a mettre a jour toutes les références sur les éléments je pense notamment à
    *NextCustomer
    *PrevCustomer

    si tu pointe sur un élément qui a été effacé en parcourant ta liste tu aura des soucis.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  3. #3
    Membre du Club
    Inscrit en
    Juin 2006
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Juin 2006
    Messages : 123
    Points : 59
    Points
    59
    Par défaut
    Merci pour ta reponse rapide..mais je ne suis pas un As de C...Donc pourrais tu un peu plus clair en disant de mettre à jour les references des autres pointeurs? Merci bien....
    OK si je comprend bien tu veux dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TempCustomer->PrevCustomer->NextCustomer=TempCustomer->NextCustomer;
    TempCustomer->NextCustomer->PrevCustomer=TempCustomer->PrevCustomer;
    Mais quand j'ai essayé cela je reçois aussi la meme erreur sur le premier TempCutomer....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Unhandled exception at 0x00412017 in LinkedList.exe: 0xC0000005: Access violation writing location 0x00000000.
    Merci bien.....

  4. #4
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    en faisaint vite je ferais ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    void removeNodeAt()
    {
      printf("Display customers\n");
      // ici est mon code pour afficher les données de la liste avant suppression et il n'ya pas de problème a ce niveau
     
      // Après affichage je demande de choisir le numero a supprimer
      printf ("Please enter the customer number to remove : ");
      scanf("%d",&RemoveNumber);
     
      TempCustomer = FirstCustomer;
      ToBeRemovedCustomer = NULL;
     
      found =0;
      do{
        if (TempCustomer->Cust_Number==RemoveNumber)
          {
    	found=1;
     
    	//J'avais mis ce code mets cela me generait une erreur du genreUnhandled exception at .... and Access violation reading location...je l'ai donc mis en commentaire pour juste supprimer mon element et afficher la liste après suppression...
    	TempCustomer->PrevCustomer->NextCustomer=TempCustomer->NextCustomer;
    	TempCustomer->NextCustomer->PrevCustomer=TempCustomer->PrevCustomer;
     
    	// sauvegarde du customer a retirer.
    	ToBeRemovedCustomer = TempCustomer;
    	if (ToBeRemovedCustomer == FirstCustomer) {
    	  //	  Recalcul de First Customer si c'est le premier element qui se fait retirer.
    	  FirsCustomer = TempCustomer->NextCustomer;
    	}
    	// passage a l'element suivant
    	TempCustomer=TempCustomer->NextCustomer;
    	// on vire l'element.
    	free(ToBeRemovedCustomer);
          }
      }while((TempCustomer) && (!found));
     
      /* Display the list */
    j'ai pas de compilo sous la main et il y'a peu etre des variables a déclarer.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  5. #5
    Membre du Club
    Inscrit en
    Juin 2006
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Juin 2006
    Messages : 123
    Points : 59
    Points
    59
    Par défaut
    OK merci bien pour ton aide....j'ai essayé ta methode mais j'ai été toujours bloqué au niveau de TempCustomer....J'ai donc changé de méthode en faisant des tests pour voir si je peux revenir en arrière ou pas, si oui, je fais mon truc, sinon c'est que c'est la première cellule qui doit être changée, dans ce cas c'est le grand pointeur général qui pointe sur la liste qu'il faudra changer, dans mon cas c'est FirstCustomer....
    Et ainsi de suite...Merci beaucoup

  6. #6
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    il faut que tu fasse bien attention a ne plus faire d'operation avec le truc que tu viens liberer sinon c'est plantage assuré.

    Ceci dit il y'a moyen de faire plus simple que ces queqlues lignes nocturnes ....
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  7. #7
    Membre du Club
    Inscrit en
    Juin 2006
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Juin 2006
    Messages : 123
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    il faut que tu fasse bien attention a ne plus faire d'operation avec le truc que tu viens liberer sinon c'est plantage assuré.

    Ceci dit il y'a moyen de faire plus simple que ces queqlues lignes nocturnes ....
    OK Merci bien pour ces conseils...desolé de repondre un peu tardivement....
    OK as tu une solution plus simple de faire cela apart les lignes nocturnes que j'ai ecrites? Je suis à l'écoute...Merci bien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/12/2007, 07h23
  2. Réponses: 4
    Dernier message: 26/09/2005, 22h36
  3. Réponses: 3
    Dernier message: 13/06/2005, 14h07
  4. liste chainée :suppression milieu par rapport à un caractère
    Par Pouyou le caribou dans le forum C++
    Réponses: 4
    Dernier message: 06/06/2005, 18h49
  5. Pb d'affichage apres une liste déroulante
    Par loic.440 dans le forum ASP
    Réponses: 13
    Dernier message: 19/01/2005, 14h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo