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 de liste chainée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 3
    Par défaut Tri de liste chainée
    Bonjour,

    Je travaille actuellement sur les liste chainées et je rencontre quelques problèmes au niveau du tri d'une liste chainée.

    J'ai réussit a faire quelques manipulation sur une liste mais lorsque je veux par exemple trier seulement les 2 premiers ou derniers nombres de ma liste je bloque.

    Si vous pourriez m'aider a réaliser cela ça m'aiderais beaucoup a avancer.

    Merci

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Si tu ne nous donnes pas le code, on ne peut pas vraiment t'aider.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 3
    Par défaut
    Citation Envoyé par jeroman Voir le message
    Si tu ne nous donnes pas le code, on ne peut pas vraiment t'aider.
    Salut voila ce que j'ai commence

    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
    typedef	struct	s_word
    {
      char		*word;
      struct s_word	*next;
    }		t_word;
     
     
    void	aff_list(t_word *word_list)
    {
      while(word_list)
        {
          printf("%s\n", word_list->word);
          word_list = word_list->next;
        }
    }
     
    void		insert_word(t_word **list, char *line)
    {
      t_word	*new;
      t_word	*tmp;
      t_word	*save;
     
      for (tmp = 0, save = *list; *list && strcmp((*list)->word, line) < 0;)
        {
          tmp = *list;
          (*list) = (*list)->next;
        }
      new = malloc(sizeof(*new));
      new->word = strdup(line);
      if (!*list)
        {
          new->next = 0;
          if (!save)
    	save = *list = new;
          else
    	tmp->next = new;
        }
      else
        if (tmp)
          {
    	new->next = tmp->next;
    	tmp->next = new;
          }
        else
          {
    	save = new;
    	new->next = *list;
          }
      *list = save;
    }
     
     
    typedef	struct	s_word
    {
      char		*arg;
      struct s_list	*next;
    }		t_list;
     
     
    void            my_print_list(t_list *params)
    {
    	t_list        *moove;
     
    	moove = params;
    	while (moove != NULL)
        {
    		puts(moove->arg);
    		moove = moove->next;
        }
    }
     
    void            my_params_in_list(t_list **params, char **av)
    {
    	int           y;
    	t_list        *new;
    	t_list        *moove;
     
    	y = 0;
    	while (av[y] != NULL)
        {
    		new = malloc(sizeof(*new));
    		new->arg = malloc((strlen(av[y]) + 1) * (sizeof(*new->arg)));
    		new->next = NULL;
     
    		strcpy(new->arg, av[y]);
     
    		if (*params == NULL)
    			*params = new;
    		else
            {
    			moove = *params;
    			while (moove->next != NULL)
    				moove = moove->next;
    			moove->next = new;
            }
    		y++;
        }
    }
     
    int     main(int ac, char **av)
    {
    	t_list        *params = NULL;
     
    	my_params_in_list(&params, av);
    	my_print_list(params);
     
    	return EXIT_SUCCESS;
    }

  4. #4
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 784
    Par défaut
    Bonjour,

    Pour commencer, tu devrais déclarer toutes les variables globales en début de programme, ça facilite la lecture (bien que ça change le scoop de la variabe) et ça évite des erreurs: tu déclares la structure s_word en ligne 2, puis tu la redéclares en ligne 54.
    Conclusion: a)ton compilateur te donne une erreur, b) considère que tu redéclares le pointeur next, et c) ne connait pas s_list!
    Si tu veux, corrige et renvoye.
    En attendant, je vais parcourir ton pgm.
    Amicalement,
    Edgar.

  5. #5
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 784
    Par défaut
    J'ai survolé ton pgm, plusieurs choses ont attiré mon attention.
    D'abord, av dans main(). Il faut savoir que av[0] contient toujours le nom du programme qui s'exécute (et donc pas le 1er élément que tu as passé en paramètre).
    Ensuite, ac contient le nombre de paramètre passé au programme. Donc, en appelant ton programme avec 1 paramètre, ac=2 puisque av[0] est fourni, et av[1] pointe sur ton paramètre.
    Enfin, sizeof(). Il faut fournir à sizeof() un type de variable, et pas une quantité. sizeof(t_word) ok, sizeof(*new->arg) non! Par contre, sizeof(arg) ok puisque arg est de type char* (donc, réservation de 4 octets puisque arg est de type pointeur).
    Corrige tout ça, puis on verra.
    Cdlt.
    Edgar.

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Enfin, sizeof(). Il faut fournir à sizeof() un type de variable, et pas une quantité. sizeof(t_word) ok, sizeof(*new->arg) non!
    On ne doit pas écrire sizeof(), ce n'est pas une fonction mais un opérateur.
    D'un point de vue du C, les deux expressions sont correctes (la seconde a des parenthèses qui ne sont pas obligatoires)

    sizeof est un opérateur admettant comme opérande
    - un type placé entre parenthèses (même syntaxe que pour un cast)
    - ou un objet auquel cas c'est le type de l'objet qui est pris en compte
    - ou une expression auquel cas c'est le type du résultat de l'expression qui est pris en compte (mais l'expression n'est pas évaluée)

  7. #7
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    D'abord, av dans main(). Il faut savoir que av[0] contient toujours le nom du programme qui s'exécute (et donc pas le 1er élément que tu as passé en paramètre).
    Juste une petite précision, av[0] (au passage, on utilise plus généralement argv et argc que av et ac) peut également contenir une chaîne vide.


    pierre.volant91, d'une part j'ai l'impression que le code que tu as fourni contient enf ait deux tentatives de programme et d'autre part, je ne vois rien concernant un quelconque tri et se rapportant à ton problème initial.

  8. #8
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 784
    Par défaut
    Citation Envoyé par gl Voir le message
    pierre.volant91, d'une part j'ai l'impression que le code que tu as fourni contient enf ait deux tentatives de programme et d'autre part, je ne vois rien concernant un quelconque tri et se rapportant à ton problème initial.
    J'ai l'impression qu'il n'en est pas encore là.

  9. #9
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 784
    Par défaut
    Ok, merci pour la précision. Ce que je voulais dire par sizeof(*new->arg) pas ok, c'est que dans le contexte du programme, cela ne donnera pas le résultat escompté, mais la remarque est parfaitement justifiée.
    Merci Diogène.

Discussions similaires

  1. Tri de liste chainée par sélection
    Par adrian07 dans le forum Débuter
    Réponses: 2
    Dernier message: 18/06/2010, 10h01
  2. tri une liste chainée
    Par dharkan dans le forum Débuter
    Réponses: 3
    Dernier message: 09/03/2010, 14h37
  3. Tri sur liste chainée
    Par SevSof dans le forum C
    Réponses: 16
    Dernier message: 27/05/2007, 00h45
  4. Algo de tri par liste chainée
    Par Treuze dans le forum C
    Réponses: 3
    Dernier message: 30/12/2005, 14h05
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25

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