Salut tout le monde,
Il y a un moment que je n'ai pas posté sur ce forum,
ça fait plaisir de voir qu'il y a toujours pas mal de monde prêt
à vous aider
Je suis en train de faire un programme ( sous visual c++ )
qui lis dans un fichier, répertorie les mots trouvés dans une liste chainée triée, et les comptes.
Bref le programme fonctionne très bien sauf pour les gros fichier,
ce qui me pose problème.
La liste chainée est récursive. Mon fichier est un dictionnaire des mots
français. Pour le moment vous me direz pas d'intérêt. ( environ 6Mo,
mais ce n'est pas la quantité de mémoire qui le freine. ).
Ensuite de comparer deux liste chainées, mais bon je pense vous
avez compris, c'est pour faire de la correction d'orthographe.
C'est le stack overflow, après quelques petites recherche, je pense
que c'est le call stack overflow qui lui pose un soucis. Donc si je vire
monde code récursif pour un code linéaire à boucle cela devrais tourner.
j'aimerais passer outre la limitation ( et conserver la récursion ),
ou une autre astuce pour pas trop modifier le code.
( c'est pas un code spécialement long mais bon ... le but est de faire
de <<l'art>> plutôt que code pour du code. ).
Et justement au passage j'ai souvent du code récursif, à dimension limité,
et parfois à dimension inconnue, d'où justement pouvoir récupérer la valeur pour éviter le crash.
Au passage, je cherche quelques exemples de code de tri sur une liste
chainée que l'on passe en arbre pour faire le tri, le cas ou ma liste est pas
triée, j'aimerais faire du code en n(log(n)) plutôt que du n*(n+1)/2.
le proto de ma structure, et de ma fonction d'ajout triée.
Et au passage, le code dois rester sur du C, bien que je travaille
sous visual c++, c'est de << l'entrainement>> pour faire du C embarqué.
merci d'avance
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 struct liste{ char mot[32]; int nbreocc; struct liste *suivant; }; typedef liste *pt; void ajout(char mot[32],pt *L) { if(*L==NULL) { *L = (pt)malloc(sizeof(liste)); strcpy((*L)->mot,mot); (*L)->suivant=NULL; (*L)->nbreocc = 1; return; } if( strcmp((*L)->mot,mot)>0 ) { pt peaux; peaux=(pt)malloc(sizeof(liste)); peaux->suivant= *L; *L=peaux; strcpy((*L)->mot,mot); (*L)->nbreocc = 1; return; } else ajout(mot,&((*L)->suivant)); }![]()
Partager