Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme Liste chainee

    6 juillet 2018 à 13:42:00

    Bonjour a tous!

    Ma fonction reçoit une liste chaînée avec des cellules contenant des nombres contenant qu'un chiffre ou deux.Le but de ma fonction est d'afficher un nombre a deux chiffres par intermittence avec un nombre a un chiffre.

    Exemple:je recois : 1->2->3->12->22->56

                 je veux :12->1->22->2->56->3

    J'ai passe beaucoup de temps sur ce code,je ne vois pas l'erreur,l'ordi affiche rien.Votre aide m'est précieuse:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct node{
        int num;
        struct node *next;
    }Node;
    
    Node *build_list(Node *head,int num)
    {
        Node *p,*q;
        p=(Node *)malloc(sizeof(Node));
        if(p==0)
        {
            exit(1);
        }
        p->num=num;
        p->next=0;
        if(head==0)
        {
            head=p;
        }
        else
        {
            for(q=head;q->next!=0;q=q->next);
            q->next=p;
        }
        return head;
    }
    
    Node *duplicator(Node *head)
    {
        Node *p=0,*q=0,*h=0;
        Node *adress=0;
    
        for(p=head;p!=0;p=p->next)
        {
            if(p->num>=10)
            {
                q=build_list(q,p->num);
            }
        }
         for(p=head;p!=0;p=p->next)
        {
            if(p->num<=9)
            {
                h=build_list(h,p->num);
            }
        }
        for(;q!=0;q=q->next,h=h->next)
        {
            h->next= q->next;
            q->next = h;
    
        }
    
    return q;
    
    }
    
    int main()
    {
        Node *str=0,*p=0,*q=0;
        q=build_list(q,10);
        q=build_list(q,11);
        q=build_list(q,12);
        q=build_list(q,7);
        q=build_list(q,8);
        q=build_list(q,9);
        str=duplicator(q);
    
        for(p=str;p!=0;p=p->next)
        {
            printf("%d",p->num);
        }
    
        return 0;
    }
    



    • Partager sur Facebook
    • Partager sur Twitter
      6 juillet 2018 à 14:08:10

      Ligne 58 tu renvoie zero.
      • Partager sur Facebook
      • Partager sur Twitter
        6 juillet 2018 à 14:11:31

        merci de m'avoir lu!

        Pourquoi je renvoie zero?Je pensais renvoyer l'adresse du début de ma nouvelle liste...il y a un truc qui me passe a coté ,je ne sais pas quoi...

        • Partager sur Facebook
        • Partager sur Twitter
          6 juillet 2018 à 14:48:21

          La condition de sortie de ton for ligne 51 est q egal zero donc ligne 58 q vaut zero CQFD.

          Il faut que tu coonserves un pointeur sur le debut de la liste et que tu renvoies ce pointeur.

          • Partager sur Facebook
          • Partager sur Twitter
            6 juillet 2018 à 14:55:44

            effectivement ,grosse connerie ...mais mon code n'affiche toujours rien après modification...merci pour ta patience

            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            
            typedef struct node{
                int num;
                struct node *next;
            }Node;
            
            Node *build_list(Node *head,int num)
            {
                Node *p,*q;
                p=(Node *)malloc(sizeof(Node));
                if(p==0)
                {
                    exit(1);
                }
                p->num=num;
                p->next=0;
                if(head==0)
                {
                    head=p;
                }
                else
                {
                    for(q=head;q->next!=0;q=q->next);
                    q->next=p;
                }
                return head;
            }
            
            Node *duplicator(Node *head)
            {
                Node *p=0,*q=0,*h=0;
                Node *adress=0;
            
                for(p=head;p!=0;p=p->next)
                {
                    if(p->num>=10)
                    {
                        q=build_list(q,p->num);
                    }
                }
                 for(p=head;p!=0;p=p->next)
                {
                    if(p->num<=9)
                    {
                        h=build_list(h,p->num);
                    }
                }
                for(p=q;p!=0;p=p->next,h=h->next)
                {
                    h->next= p->next;
                    p->next = h;
            
                }
            
            return q;
            
            }
            
            int main()
            {
                Node *str=0,*p=0,*q=0;
                q=build_list(q,10);
                q=build_list(q,11);
                q=build_list(q,12);
                q=build_list(q,7);
                q=build_list(q,8);
                q=build_list(q,9);
                str=duplicator(q);
            
                for(p=str;p!=0;p=p->next)
                {
                    printf("%d",p->num);
                }
            
                return 0;
            }



            -
            Edité par yoco92 6 juillet 2018 à 14:56:08

            • Partager sur Facebook
            • Partager sur Twitter
              12 juillet 2018 à 8:25:34

              pour commencer tu as des memory leak de ouf, enfin tu as une mega fuite mémoire (malloc sans aucun free ^^), et ça c'est pas bien.

              A première vu je dirais que ton problème ce situe dans la boucle  ligne 51,

              après avoir essailé de dessiner le schéma de des pointeur... j'abandonne mais quoi qu'il en soit tu boucle sur q->next (second élément de la liste)

              sinon voila une version qui fonctionne (enfin si j'ai compris la demande ^^)

              #include <stdio.h>
              #include <stdlib.h>
              #include <string.h>
              
              typedef struct node{
              	int num;
              	struct node *next;
              }Node;
              
              
              void * cleanChaine ( Node *head )
              {
              	if ( !head )
              	{
              		return ( NULL );
              	}
              
              	if ( head->next )
              	{
              		head->next = cleanChaine ( head->next );
              	}
              
              	free ( head );
              
              	return ( NULL );
              }
              
              Node *build_list(Node *head,int num)
              {
              	Node *p,*q;
              	p=(Node *)malloc(sizeof(Node));
              	if(p==0)
              	{
              		exit(1);
              	}
              	p->num=num;
              	p->next=0;
              	if(head==0)
              	{
              		head=p;
              	}
              	else
              	{
              		// le point virgure est fait expres 
              		// on cherche la fin de chaîne
              		for(q=head;q->next!=0;q=q->next);
              
              		q->next=p;
              	}
              	return head;
              }
              
              Node *duplicator(Node *head)
              {
              	Node *p=0,*q=0,*h=0, *t=0, *u=NULL;
              	Node *adress=0;
              	int i = 0;
              
              
              	for(p=head;p!=0;p=p->next)
              	{
              		if(p->num>=10)
              		{
              			q=build_list(q,p->num);
              
              		}
              	}
              
              	for(p=head;p!=0;p=p->next)
              	{
              		if(p->num<=9)
              		{
              			h=build_list(h,p->num);
              
              		}
              	}
              
              	// pour eviter les memory leaks
              	t = q;
              	u = h;
              
              	i = 0;
              	p = NULL;
              	while ( 1 )
              	{
              		if ( i & 0x01 )
              		{
              			if ( !h )
              			{ // no element
              				break;
              			}
              
              			p = build_list ( p, h->num );
              			h = h->next;
              		}
              		else
              		{
              			if ( !q )
              			{ // no element
              				break;
              			}
              
              			p = build_list ( p, q->num );
              			q = q->next;
              		}
              
              		i++;
              	}
              
              	u = cleanChaine ( u );
              	t = cleanChaine ( t );
              
              	return ( p );
              }
              
              int main()
              {
              	Node *str=0,*p=0,*q=0;
              	q=build_list(q,10);
              	q=build_list(q,11);
              	q=build_list(q,12);
              	q=build_list(q,7);
              	q=build_list(q,8);
              	q=build_list(q,9);
              
              	str=duplicator(q);
              	for ( p = str; p != 0; p = p->next )
              	{
              		printf("%d ",p->num);
              	}
              	printf("\n");
              
              
              	q = cleanChaine ( q );
              	str = cleanChaine ( str );
              	return 0;
              }
              



              -
              Edité par ox223252 12 juillet 2018 à 8:45:36

              • Partager sur Facebook
              • Partager sur Twitter

              la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

              Mon GitHub

                12 juillet 2018 à 10:31:54

                Tu te compliques énormément la vie, en mélangeant deux niveaux : l'algorithmique générale (faire un certain travail sur une séquence), et les détails sordides des listes et pointeurs.

                Un problème à la fois. Remplace liste chainée par tableau.

                Nouvel énoncé

                on a un tableau de nombres (positifs)
                
                int t[] = { 1, 2, 12,  23, 3, 34 };
                
                afficher en alternant les nombres à un chiffre et les autres (>= 10).
                
                

                Pour ça, visiblement il faut deux indices, un qui parcourt le tableau pour trouver les nombres à un chiffre, et un autre pour les autres.

                Il faut aussi se demander ce qu'on fera si il n'y a pas autant de nombres des deux catégories.

                Une fois que tu auras résolu ce problème, il restera à remplacer "déplacement d'un indice dans une tableau" par "déplacement d'un pointeur dans une liste".



                -
                Edité par michelbillaud 12 juillet 2018 à 10:33:01

                • Partager sur Facebook
                • Partager sur Twitter

                Probleme Liste chainee

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown