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 :

inverser une liste chainee


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Points : 77
    Points
    77
    Par défaut inverser une liste chainee
    Bonsoir!

    je suis en ce moment sur la manipulation des listes chaines et je n'arrive pas a inverser la liste, je n'arrive meme pas a demarrer je sait seulement que c'est un jeu de pointeurs pouvez vous m'eclairer?
    voici le 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
     
    typedef struct s_list
    {
      char *data;
      struct s_list *next;
    }              t_list;
     
    int	my_put_in_list(t_list **begin, char *data)
    {
      t_list	*new_elem;
     
      new_elem = malloc(sizeof(*new_elem));
      new_elem->data = data;
      new_elem->next = begin;
      *begin = new_elem;
    }
    void	my_putchar(char c)
    {
      write(1, &c, 1);
    }
     
    void	my_putstr(char *str)
    {
      while (*str)
        my_putchar(*(str++));
    }
     
    int	my_rev_list(t_list **begin)
    {
      while (begin != 0)
        {
         ???????? 
        }
    }
     
    int	my_show_str_list(t_list *begin)
    {
      while (begin != 0)
        {
          my_putstr(begin->data);
          my_putchar('\n');
          begin = begin->next;
        }
    }
    int	main(int ac, char **av)
    {
      int	x;
      t_list	*begin;
     
      begin = 0;
      x = 1;
      while (ac > 0)
        {
          my_put_in_list(&begin,av[x++]);
          ac--;
        }
      return (0);
    }
    merci encore!

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Essaie un peu ceci.
    Si ça marche, essaie de le comprendre.
    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	my_rev_list(t_list **ppBegin)
    {
    	t_list *pPrev = NULL;
    	t_list *pCur = NULL;
     
    	if(NULL == ppBegin)
    		return -1;
     
    	pCur = *ppBegin;
    	while(NULL != pCur)
    	{
    		/* Prend l'adresse de la structure suivante */
    		t_list *pNext = pCur->next;
     
    		/* Redirige le pointeur suivant sur la précédente */
    		pCur->next = pPrev;
    		/* Garde la structure courante comme précédente */
    		pPrev = pCur;
    		/* Passe à la suivante. */
    		pCur = pNext;		
    	}
    	*ppBegin = pPrev;
     
    	return 0;
    }

  3. #3
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Points : 77
    Points
    77
    Par défaut ok
    merci pour ta reponse mais lors de la compil il m'affiche:
    my_rev_list.c:40: error: `NULL' undeclared (first use in this function)
    my_rev_list.c:40: error: (Each undeclared identifier is reported only once
    my_rev_list.c:40: error: for each function it appears

    j'essaye de comprendre au mieux mais au premier aspect c'est pas evident.......

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    L'idée, pour inverser une liste chainée, est "relativement" simple:

    Pour chaque élément de la liste, tu le sépare de ta liste de départ
    tu l'ajoutes au début d'une liste temporaire
    tu renvoie la liste temporaire...

    Exemple:
    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
     
    /* inverse la liste fournie en parametre et la renvoie */
    t_list* Inverse(t_list* entree)
    {
        /* un élément temporaire */
        t_list* travail=NULL;
        /* la liste inversée */
        t_list* retour=NULL;
        /* on parcoure la liste entree tant qu'il y a un élément */
        while(entree!=NULL)
        {
            /* on prend le premier element de la liste */
            travail=entree;
            /* le début de la liste devient l'élément suivant */
            entree=travail->next;
            /* on libère l'élélement de la liste  et on le place en début de la
                 liste à renvoyer*/
            travail->next=retour;
            /* l'élément qu'on vient de mettre en début de liste devient
                le début de la liste de à renvoyer */
            retour=travail;
        }
        /* YAPUKA renvoyer la liste inversée */
        return retour;
    }

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Points : 77
    Points
    77
    Par défaut ok
    Merci pour votre aide, je vais y reflechir et y travailler.............

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    NULL est défini dans <stddef.h>, dans <stdlib.h>, et sans doute dans d'autres.
    Il suffit d'inclure un header standard (pratiquement n'importe lequel) pour l'avoir.

Discussions similaires

  1. probleme d affichage une liste chainee
    Par lhagames dans le forum C
    Réponses: 10
    Dernier message: 25/03/2006, 11h33
  2. [LG]inserer dans une liste chainee
    Par jaabouc dans le forum Langage
    Réponses: 4
    Dernier message: 19/04/2004, 00h44
  3. [LG]probleme d'ajout dans une liste chainée...
    Par misteryann dans le forum Langage
    Réponses: 5
    Dernier message: 08/03/2004, 20h28
  4. [LG]Tri par insertion dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2003, 22h34
  5. [LG]suppression dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 9
    Dernier message: 16/12/2003, 21h20

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