Bonjour bonjour, je débute en C et je suis confronté a un problème a propos de pointeurs et de liste chainées.
Ma structure de liste chainée est :
J'ai développée une fonction créant une liste chainée de mots, utilisant un pointeur sur mon type NoeudMot :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 typedef struct NoeudMot{ char mot[29]; struct NoeudMot *suivant; } NoeudMot;
Seulement, listeMot est censé contenir la première structure de ma liste, or je l’initialise a NULL et n'est plus modifiée après.
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 NoeudMot* creerListeMot(NoeudMot *listeMot, Noeud *liste) { Noeud *temp = liste; NoeudMot *templisteMot = NULL; listeMot =templisteMot; int i while (temp != NULL) { if (estDelimiteur(temp->caractere) == 1) { if (templisteMot != NULL) { templisteMot->mot[i] = '\0'; templisteMot = templisteMot->suivant; } } else { if (templisteMot == NULL) { templisteMot = malloc(sizeof(NoeudMot)); templisteMot->suivant = NULL; i = 0; } templisteMot->mot[i] = temp->caractere; i++; } temp = temp->suivant; } return listeMot; }
Comment retourner la tête de la liste de mots créée ?
[EDIT]: J'ai réussi en recodant ma fonction comme les méthodes classiques de création de listes chainées ce qui donne :
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 NoeudMot* creerListeMot(NoeudMot *listeMot, Noeud *liste) { Noeud *temp = liste; char chaine[30] = ""; int i; while (temp != NULL) { //Tant qu'il reste des caracteres dans la liste if (estDelimiteur(temp->caractere) == 1) { //Si le carac est un délimit if (strcmp(chaine, "") != 0) { //Et si la chaine est remplie de caracteres chaine[i] = '\0'; //On finalise la chaine listeMot = ajouterfinMot(listeMot, chaine); //On l'ajoute a la liste de Mots memset(chaine, 0, sizeof(chaine)); // On vide la chaine } } else { // Sinon si le carac est une lettre if (strcmp(chaine, "") == 0) { //Et si la chaine est vide i = 0; //On met l'indice a 0 } chaine[i] = temp->caractere; //On rentre la lettre i++; //On décale l'indice } temp = temp->suivant; //On décale le carac } return listeMot; } /* Ajout d'un noeud en fin de liste et renvoie la tete de liste */ NoeudMot *ajouterfinMot(NoeudMot *teteliste, char chaine[30]) { if (teteliste == NULL) { teteliste = ajouterteteMot(teteliste, chaine); } else { NoeudMot *temp = NULL; temp = teteliste; while (temp->suivant != NULL) { temp = temp->suivant; } NoeudMot *nouveauNoeudMot = (NoeudMot*)malloc(sizeof(NoeudMot)); strcpy(nouveauNoeudMot->mot, chaine); nouveauNoeudMot->suivant = NULL; temp->suivant = nouveauNoeudMot; } return teteliste; } /* Ajout d'un noeud en tete de liste et renvoie la nouvelle tete de liste */ NoeudMot *ajouterteteMot (NoeudMot *teteliste, char chaine[30]) { NoeudMot *nouveauNoeudMot = (NoeudMot*)malloc(sizeof(NoeudMot)); strcpy(nouveauNoeudMot->mot, chaine); nouveauNoeudMot->suivant = teteliste; teteliste = nouveauNoeudMot; return teteliste; }
Partager