Bonjour à tous et à toutes,

Depuis quelques jours j'ai construit une Skiplist à l'aide de la structure suivante :

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;
};
C'est une colonne qui pointe sur d'autres colonnes, etc ...
ç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 :

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;
 
}
A chaque mot_lu je l'ajoute sous forme de colonne, en donnant ma première colonne : head en argument.

J'ajoute donc cette colonne à l'aide de la fonction column_add() :
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;		
}
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
 
void
column_set_word(Column *current_column, char word[CHAR_MAX])
{
	strcpy(current_column -> word, word);
}
Pour copier le mot, et j'initialise tout le reste

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 :
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");
}
J'ai soit un SIGSEGV.

Sinon si je fais :
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);
Alors dans ce cas j'ai ce que j'ai mis au début.

Voilà si quelqu'un à une idée ça serait super sympa !

Je vous remercie d'avance !