IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Tri fusion d'une liste chainée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 36
    Par défaut Tri fusion d'une liste chainée
    Bonjour tout le monde,

    Je suis entrain de coder ls pour mes cours. J'ai presque fini le projet, il me reste plus qu'a lister les informations dans le meme ordre que le vrai ls (Tri par date ou ascii). Dans un premier temps, je m'occupe du tri dans l'ordre ascii.

    J'ai un petit problème avec ma fonction de tri sur des listes chainées

    J'ai utilisé l'algo de wiki pour réaliser le tri. Mais j'ai un problème. J'ai un segfault dans la fonction de fusion... Pouvez-vous m'aider svp? Voici mon code :
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    #include "sort.h"
    #include "info.h"
    #include <stdio.h>
     
    int					tri_ascii(void *a1, void *b1)
    {
    	char				*tmp;
    	char				*a;
    	char				*b;
    	unsigned int		i;
     
    	a = (char*)a1;
    	b = (char*)b1;
    	i = 0;
    	while (a[i] == (char)b[i] && a[i] != '\0' && a[i] != '\0')
    		i++;
    	if ((b[i] < a[i] && a[i] != '\0') || (b[i] == '\0' && a[i] != '\0'))
    		return (1);
    	return (0);
    }
     
    void				switch_link(t_info **p, t_info **q)
    {
    	t_info			*t;
     
    	t = (*q)->next;
    	(*q)->next = t->next;
    	(*q)->next->prev = (*q);
    	t->prev = (*p);
    	t->next = (*p)->next;
    	(*p)->next->prev = t;
    	(*p)->next = t;
    }
     
    t_info				**fusion(t_info **beg, int nb_link_beg, t_info **end,
    		int nb_link_end)
    {
    	while (1)
    	{
    		if (tri_ascii((*beg)->name, (*end)->name) == 1)
    		{
    			switch_link(beg, end);
    			if (nb_link_end == 1)
    				break ;
    			nb_link_end--;
    		}
    		else
    		{
    			if (nb_link_beg == 1)
    			{
    				while (nb_link_end >= 1)
    				{
    					(*end) = (*end)->next;
    					nb_link_end--;
    				}
    			}
    			nb_link_beg--;
    		}
    		(*beg) = (*beg)->next;
    	}
    	return (end);
    }
     
    t_info				**sort(t_info **lst, int nb_link)
    {
    	int				nb_link_deb;
    	int				nb_link_fin;
    	t_info			**lst_sort;
     
    	nb_link_fin = nb_link / 2;
    	nb_link_deb = nb_link - nb_link_fin;
    	if (nb_link_deb >= 2)
    	{
    		lst_sort = sort(lst, nb_link_deb);
    		if (nb_link_fin >= 2)
    			lst = sort(lst_sort, nb_link_fin);
    	}
    	else
    		*lst_sort = (*lst)->next;
    	lst_sort = fusion(lst, nb_link_deb, lst_sort, nb_link_fin);
    	return (lst_sort);
    }

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    pointeur, pointeur, pointeur...
    Un pointeur doit être initialisé avant tout déréférencement.

    fonction sort:
    1er test le else : on déréférence lst_sort qui n'a jamais été initialisé.

    Je n'ai pas lu au-delà

    Dalfab

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    Dans la lignée de ce que dit Daflab, depuis maintenant 17 ans (si le standard C99 porte bien son nom) il n'est plus nécessaire de déclarer une variable en début de bloc. La bonne pratique c'est donc de la déclarer le plus près de l'endroit où elle est utilisée et de l'initialiser immédiatement, pour s'éviter ce genre de problèmes.

    Par ailleurs, utiliser la librairie standard n'est pas faillir! Pourquoi n'utilises-tu pas qsort? Pourquoi au moins n'utilises-tu pas strcmp? Ou si tu ne les utilises pas, crée-toi ta propre librairie standard petit à petit en écrivant des algorithmes un peu plus généraux: tri_ascii doit être un argument de fusion, pas gravée dedans; ou bien vas-tu faire un copier/coller pour le tri par date?

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 36
    Par défaut
    bonjour, merci pour vos réponses.

    dalfab:
    c'est vrai, je ne l'ai pas initialisé je vais allouer cette mémoire directement dans mon else, comme stendhal666 dit. émoticône glasses

    stendhal666 :
    Dans mon école, nous avons le droits a presque aucune lib standard. Nous avons le droit a "malloc free open write read" plus après des fonctions propres au sujet. Comme opendir readdir... pour faire ls.
    J'ai donc ma propre lib.
    Pour tri_ascii j'y ai pensé quand j'avais fini ce bout de code a utiliser strcmp. Cette fonction fonctionne, donc je ne l'ai pas changé. Je pense le faire quand j'aurai fini mon code.
    il est prévu que j'utilise un pointeur sur fonction dans mon tri fusion, ceci explique le type void des 2 chaines de caractères de tri_ascii. Je n'aurai pas fait de copier coller
    Je ne connais pas qsort, je vais regarder le man.

Discussions similaires

  1. Tri par insertion sur une liste chainé simple.
    Par loula427 dans le forum Débuter
    Réponses: 6
    Dernier message: 21/03/2011, 14h54
  2. tri dans une liste chainée.
    Par cedrico2010 dans le forum Débuter
    Réponses: 2
    Dernier message: 18/02/2011, 17h51
  3. tri une liste chainée
    Par dharkan dans le forum Débuter
    Réponses: 3
    Dernier message: 09/03/2010, 14h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo