Bonjour à tous et à toutes,
Depuis quelques jours j'ai construit une Skiplist à l'aide de la structure suivante :
C'est une colonne qui pointe sur d'autres colonnes, etc ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 typedef struct Column Column; struct Column{ int height; char word[CHAR_MAX]; Column **following_columns; };
ça ressemble un peu aux listes chaînées.
Le problème est le suivant :
Je dois lire dans un fichier texte les mots les uns à la suite des autres pour les ajouter sous forme de colonne et construire ma skiplist.
J'ai donc créer un fichier test.txt avec le mot : "un" à l'intérieur.
Tout à l'air de très bien fonctionner, mais lors de l'affichage le mot "un" que je viens d'ajouter ne s'affiche pas correctement.
Ce que je devrais avoir : a -> un -> NULL
avec "a" le mot de ma première colonne que j'ai moi - même créée.
Ce que ça m'affiche : a -> ??? -> NULL
Avec un losange noir contenant un point d'interrogation ( code ascii : -1 ) et un carré dans lequel est écrit 007F (code ascii : 127) à la place des ???.
Mon main :
A chaque mot_lu je l'ajoute sous forme de colonne, en donnant ma première colonne : head en argument.
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 int main (void) { Column head; FILE *f; char mot_lu[CHAR_MAX] = ""; srand(time(NULL)); column_allocate_and_initialize(&head, "a"); f = fopen("test.txt", "r"); if( f == NULL) exit(1); while( fscanf(f, "%s", mot_lu) != EOF ) column_add(&head, mot_lu); display_all_linked_lists(&head); return 0; }
J'ajoute donc cette colonne à l'aide de la fonction column_add() :
Lors de l'initialisation de la colonne à créer j'utilise strcpy () :
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 int column_add (Column *current_column, char word[CHAR_MAX]) { int current_height; Column column_to_add; /* Je regarde si la colonne existe, si ce n'est pas le cas alors je renvoie. sinon je renvoie sa hauteur actuelle */ current_height = search_column_height(current_column, word); if(column_does_not_exist(current_height)){ column_allocate_and_initialize (&column_to_add, word); } while(height_is_positive(current_height)){ while ( following_column_exist(current_column, current_height) && following_word_is_not_reached(current_column, current_height, word)) current_column = current_column -> following_columns[current_height]; column_connect_to_the_linked_list(current_column, &column_to_add, current_height); current_height--; } return 0; }
Pour copier le mot, et j'initialise tout le reste
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 void column_set_word(Column *current_column, char word[CHAR_MAX]) { strcpy(current_column -> word, word); }
Rappel : J'utilisais déjà column_allocate_and_initialize (); pour ma première colonne et ça marche très bien.
Résultat : a -> NULL
Sauf qu'à l'affichage , lorsque je veux parcourir ma liste
Voici la fonction :
J'ai soit un SIGSEGV.
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 void display_all_linked_lists(Column *head) { int current_height; Column *current_column; current_height = 0; printf(" lvl %d\t[", current_height); while(head != NULL){ printf(" %s ->", current_column -> word); current_column = current_column -> following_columns[current_height]; } printf(" NULL ]\n"); }
Sinon si je fais :
Alors dans ce cas j'ai ce que j'ai mis au début.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 printf(" %s ->", current_column -> word); current_column = current_column -> following_columns[current_height]; printf(" %s ->", current_column -> word);
Voilà si quelqu'un à une idée ça serait super sympa !
Je vous remercie d'avance !
Partager