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 :

delete de liste chainee


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Points : 171
    Points
    171
    Par défaut delete de liste chainee
    Bonjour,
    J'essaye de faire un analyseur syntaxique pour des expressions mathematique. Histoire de m'habituer un peu à la manipulation des liste chainee.
    J'ai considéré que:
    1. Une Expression est composee d'une liste chainee d'entité lexicale (une entité etant un nombre ou un operateur)
    2. Une Expression possede une valeur qui sera calculée apres
    3. Une Expression est formée par une chaine de caractères

    J'ai un soucis avec ma liste chainee.
    La fonction de lecture de la chaine semble satisfaisante, mais j'ai un soucis au niveau du clear.

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
     
    typedef struct Entite
    {
    	string valeur;	// valeur de l'entite actuelle
    	Entite * avant;	// entite positionnee avant celle-ci
    	Entite * apres;	// entite positionnee apres celle-ci
    }Entite;
     
     
    //-- Une expression mathematique est une liste chainee
    // d'entites ou d'unites lexicales.
    class Expression
    {
    public:
     
    private:
    	string valeur;		//valeur de l'expression
    	string nom;			// nom de l'expression
    	string chaine;		// chaine de caracteres correspondant a l'expression
    	Entite tete;		// expression decomposee en entites
     
    public:
    	Expression(string lpchaine);		//initialise les elements
    	virtual ~Expression();	//vide l'entite
    	//-- Creer une structure expression a partir d'une chaine de caracteres
    	//-- si la chaine ne respecte pas la grammaire ou le vocabulaire,la structure ne peut
    	//-- etre creee
    	//-- retourne 0 en cas de succes		
    	int Create(); 
     
    	// met a zero la liste chainee des entites lexicales
    	void ClearTete();
     
    	//retourne la chaine de l'expression
    	string Getchaine();
     
    	void ViewEntite();
    private:
    	int Resolve();
    }; 
     
    //-- vide la liste chainee des entitees
    void ClearEntite(Entite * lpTete)
    {
    	try
    	{
    		Entite * tmp1;
    		tmp1 = lpTete;
    		Entite * tmp2 =0;
    		while(tmp1 !=0)
    		{
    			tmp2 = tmp1->apres;
    			delete []tmp1;   //Access Violation Ici
    			tmp1 = tmp2;
    		}
    	}
    	catch(...)
    	{
    		cout<<"\nErreur Ici: ClearEntite()\n";
    	}
    }
     
    void ViewEntite(Entite * lpTete)
    {
    	try
    	{
    		Entite * tmp1;
    		tmp1 = lpTete;
    		Entite * tmp2 =0;
    		while(tmp1 !=0)
    		{
    			tmp2 = tmp1->apres;
    			cout<<"\n entite:"<<tmp1->valeur;  //pas d'acces violation et lecture correcte
    			tmp1 = tmp2;
    		}
    	}
    	catch(...)
    	{
    		cout<<"\nErreur Ici: ViewEntite()\n";
    	}
    }

  2. #2
    Membre émérite
    Avatar de lakitrid
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    1 535
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 535
    Points : 2 388
    Points
    2 388
    Par défaut Re: delete de liste chainee
    ma preatique en C++ est limitée mais bon :

    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
     
    void ClearEntite(Entite * lpTete)
    {
    	try
    	{
    		Entite * tmp1;
    		tmp1 = lpTete;
    		Entite * tmp2 =0;
    		while(tmp1 !=0)
    		{
    			tmp2 = tmp1->apres;
    			delete tmp1;   // ta structure n'est pas un tableau ! pas de []
    			tmp1 = tmp2;
    		}
    	}
    	catch(...)
    	{
    		cout<<"\nErreur Ici: ClearEntite()\n";
    	}
    }
    Ensuite pourquoi t'embarassé à faire un chaînage bouble (avant arrière) alors que c'est inutile ?
    de plus dans ta classe tu déclare un Entite tete, pourquoi ne met tu pas un pointeur ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Points : 171
    Points
    171
    Par défaut
    Merci d'avoir repondu.
    J'étais desespéré, c'est pourquoi j'ai mis [].
    Je pense avoir trouvé la solution.
    Car en fait, ma fonction Clear est correcte, mais je lui fourni en entrée un objet qui pointe vers un membre privé de ma classe Epression (Entite tete).

    Remarque: lorsque je declare Epression::Entite tete comme public, mon code fonctionne et je n'ai pas d'access violation.

    1. Concernant la double liste chainee, je n'utilise pas encore cette particularité, mais je pense m'en servir pour analyser qu'une expression est grammaticalement correcte.
    Exemple: l'expression 4x+3x^2 est correcte car non seulement les chiffres ou lettres sont autorisés, mais en plus, on a une belle succession d'opérandes et d'opérateur.
    par contre, l'expression 6++8 n'est pas correcte. mais mon algorithme decompose cette expression en 4 entité: 6 + + 8 . je pense que la double liste chainee est necessaire pour une reelle connaissance des proches voisins.

    2.
    ta classe tu déclare un Entite tete, pourquoi ne met tu pas un pointeur ?
    C'est pareil. et en plus, j'evite une allocation dynamique d'une zone memoire sur une seule entité.

  4. #4
    Membre émérite
    Avatar de lakitrid
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    1 535
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 535
    Points : 2 388
    Points
    2 388
    Par défaut
    Citation Envoyé par Luther13
    ta classe tu déclare un Entite tete, pourquoi ne met tu pas un pointeur ?
    C'est pareil. et en plus, j'evite une allocation dynamique d'une zone memoire sur une seule entité.
    Oui mais du coup tu as un traitement particulier sur la première entité de ton chaînage.
    Et question subsidiaire :

    Pourquoi tu utilise une structure pour ton chaînage au lieu d'une classe ?
    ce te permettrais pas mal de choses comme mettre en place le destrcuteur et faire un clear recursif ...

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

Discussions similaires

  1. [LG]probleme d'ajout dans une liste chainée...
    Par misteryann dans le forum Langage
    Réponses: 5
    Dernier message: 08/03/2004, 20h28
  2. [LG]Listes chainées avec pointeur
    Par PaowZ dans le forum Langage
    Réponses: 2
    Dernier message: 17/02/2004, 19h49
  3. [LG]liste chainee + pointeur + affichage
    Par k_ro dans le forum Langage
    Réponses: 6
    Dernier message: 17/01/2004, 13h58
  4. [LG]Tri par insertion dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2003, 22h34
  5. [LG]suppression dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 9
    Dernier message: 16/12/2003, 21h20

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