[C] liste chainée

Cow_B Messages postés 41 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 5 avril 2006 - 17 mars 2004 à 16:59
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 - 18 mars 2004 à 09:58
Bonjour, g un tout petit souci...

lors de la compilation d'un programme contenant cette fonction, ca plante... ca fait plus de 12h maintenant que j'essaye de comprendre pourquoi...

Mer ci pour l'aide que vous pourrez m'apporter !!! :)


//	Structure
typedef struct liste *ptr_liste;

typedef struct liste
{
char mot[5];
char type;
ptr_liste *suivant;
}liste;

//	Permet de faire l'insertion d'un mot d'une règle en fin de liste chainée.
void insertion_un_mot(char mot_regle[5], ptr_liste *p)
{
ptr_liste *courant, *nouv;
int j=0;

courant = (ptr_liste*) malloc (sizeof(liste));
//	On prépare le nouveau maillon à insérer
nouv = (ptr_liste*) malloc (sizeof(liste));

for(j=0; j<5; j++)
{
((*nouv)->mot[j]) = mot_regle[j];
}
(*nouv)->suivant = NULL;

//	Si la chaine est vide, la tête de la liste sera le maillon nouv...
if (*p == NULL)
{
p = nouv;
}
//	... sinon, on va à la fin de la liste chainée et on insert en dernier le maillon nouv.
else
{
courant = p;
do
{
courant = (*courant)->suivant;
}while(courant != NULL);
courant = nouv;
}
}

Cow-B
-----------------------------------------------
C'est au pied du mur.... qu'on voit le mieux le mur
-----------------------------------------------

8 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
17 mars 2004 à 18:06
tu es sur que c'est un problème de compilation que tu as? vs me compile ca sans problème
0
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
17 mars 2004 à 18:09
C'est pas un probleme de compilation, apres un bref regard on se rend compte que tu geres la création de ta liste chainée (*p == NULL), sans retourner rien du tout à l'appelant

ce qui fait que l'appelant ne sera au courant de rien ; c'est à dire que si tu ne retournes pas ce que tu as crée, ca sera perdu (il faut retourner p)

j'ai pas vraiment regarder à fond le code, mais utilise le debugger pour te rendre compte

sinon, tu peux faire une initialisation à la main si tu veux pas retourner de pointeur et utilise juste ta méthode pour l'ajout en fin de liste

ex :

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

// Structure
typedef struct maListe
{
char mot[5];
char type;
maListe *suivant;
}liste;

void ajoute(liste* maListeDeChaine, char *laChaine, char leType)
{
liste * p_current = maListeDeChaine;
while (p_current->suivant != NULL)
p_current = p_current->suivant;
p_current->suivant = (liste*) malloc (sizeof(liste));;
strcpy(p_current->suivant->mot, laChaine);
p_current->suivant->type = leType;
p_current->suivant->suivant = NULL;
}

int main(int argc, char* argv[])
{
liste a;
strcpy(a.mot,"abc");
a.type = 'c';
a.suivant = NULL;

ajoute(&a,"bcd",'d');
ajoute(&a,"cde",'e');

return 0;
}

0
Cow_B Messages postés 41 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 5 avril 2006
17 mars 2004 à 18:32
une fois que je compile, je fais une saisie pour remplir mon tableau "mot_regle[5]", et ensuite, la saisie terminée, le programme plante. Voici l'erreur qui s'affiche :

"Exception non gérée à 0x00411cb2 dans Compi123.exe:0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0xcdcdcdcd."

VS pointe cette ligne pour l'erreur :

((*nouv)->mot[j]) = mot_regle[j];


Je c pas ce ke ca vut dire exactement...

Cow-B
-----------------------------------------------
C'est au pied du mur.... qu'on voit le mieux le mur
-----------------------------------------------
0
Cow_B Messages postés 41 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 5 avril 2006
17 mars 2004 à 18:35
Sinon, Nicolas,

je ne suis pas sure de comprendre ce que tu veux dire.
Donc, j'ai un peu du mal à réagir par rapport à ca...

Cow-B
-----------------------------------------------
C'est au pied du mur.... qu'on voit le mieux le mur
-----------------------------------------------
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
17 mars 2004 à 19:03
Simplement, que la liste est mal pensée

imaginons la premiere création

ptr_liste * maListe = NULL;
insertion_un_mot("truc", maListe);

indépendement de ce que le code fait, maListe vaudra toujours NULL;

il faudrait donc qqchose du genre :
maListe = insertion_un_mot("truc", maListe);

sachant que la fonction insertion_un_mot retournerait l'adresse de la premiere cellule

il y aurait donc plusieurs solutions
- avec une variable globale qu'on utiliserait dans la fonction d'ajout
- une fonction qui retourne l'@ à utiliser
- ou alors un cas dans lequel on ne traite pas dans l'ajout le premier cas (ce que je t'ai rapidement fait comme code)
0
Cow_B Messages postés 41 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 5 avril 2006
17 mars 2004 à 19:19
Escuse moi d'insister, mais je ne comprends vraiment pas en quoi elle est mal pensé. En fait, je pense que le principe est bon (par contre, la mise en oeuvre ne l'ai surement pas : preuve en est avec le plantage dont je n'arrive pas à sortir)...
Bref, toujours est-il que théoriquement, il ne me semblais pas mauvais de faire :
* préparer le nouveau maillon à insérer
* si la liste est nulle, alors insérer le maillon
* si la liste n'est pas nulle, alors aller jusqu'au bout de la liste et seulement à ce moment, insérer le nouveau maillon.

Sur cette remarque, je V essayer de méditer sur les issues que tu me proposes.

MERCI !!! :big)

Cow-B
-----------------------------------------------
C'est au pied du mur.... qu'on voit le mieux le mur
-----------------------------------------------
0
Cow_B Messages postés 41 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 5 avril 2006
17 mars 2004 à 21:43
hé bien...

sans changer ma structure, je n'arrive à rien du tout... snif

et même en changeant....

Là je commence à devenir légèrement fou... Limite je commence à cracker... mais très légèrement... Pour le moment, je n'ai casser qu'une seule planche de l'étagère à coté de mon bureau...

Cow-B
-----------------------------------------------
C'est au pied du mur.... qu'on voit le mieux le mur
-----------------------------------------------
0
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
18 mars 2004 à 09:58
Ben, ca me parraissait clair, ta méthode ne t'indique pas l'adresse du maillon que tu as crée, donc dans l'appelant, tu ne sais pas ce qui s'est passé, où retrouver le maillon

compile juste ca, ca va peut-etre t'éclairer

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

// Structure
typedef struct maListe
{
char mot[5];
char type;
maListe *suivant;
}liste;

void ajoute(liste * laListe)
{
laListe = (liste*) malloc (sizeof(liste));
printf("Pendant appel : %p\n",laListe);
}

main()
{

liste * testListe = NULL;

printf("Avant appel : %p\n",testListe);
ajoute(testListe);
printf("Après appel : %p\n",testListe);

return 0;
}
0
Rejoignez-nous