[c]insertion liste chainee
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

[c]insertion liste chainee



  1. #1
    invite8b421ec7

    Unhappy [c]insertion liste chainee


    ------

    Bonjour,

    Je souhaiterais insérer les élements contenant de ma première liste dans un champ de ma deuxième liste. Cette dernière contient un pointeur sur la première liste.
    Voici mon essai. Mais ceci ne fait rien. Pourriez-vous m'aider?
    Mervi par avance.
    Code:
    struct node
    {
        struct node *p_next;
        struct node *p_prev;
    
    };
    typedef struct vertex
    {
        int taille;
        struct node *p_tail;
        struct node *p_head;
    }vertex_t;
     typedef struct node node_t;
    struct vehicle
    {
    
        vertex_t * vertex;
       struct vehicle *p_prev;
       struct vehicle *p_next;
    };
    typedef struct driver
    {
        int taille;
        struct vehicle *p_tail;
        struct vehicle *p_head;
    }driver_t;
    typedef struct vehicle vehicle_t;
    //fonction d'insertion
    driver_t *driver_insert_first (driver_t *d_list,vertex_t *v )
    {
         if (d_list != NULL)
        {
            vehicle_t  *d = malloc(sizeof *d);
             node_t *n;
            for(d =d_list->p_head; d!=NULL;d->p_next)
           {
                d->vertex->p_head = n;
                n = n->p_next;
    
           }
        }
    
        return d_list;
    }

    -----

  2. #2
    bzh_nicolas

    Re : [c]insertion liste chainee

    Salut,
    ton programme ne fait rien ou il plante ? Je penche pour la 2ème solution.
    Rien qu'en compilant, j'ai un warning sur cette ligne :
    Code:
    d->vertex->p_head = n;
    qui suffit à expliquer que cela ne "fasse rien".

    P.S. (et plus grave même si ça compile comme ça chez toi) : j'ai également une erreur à la compil sur cette ligne si je la laisse tel quelle :
    Code:
    vehicle_t  *d = malloc(sizeof *d);
    Soit dit en passant, tu as vraiment relu cette ligne ???

    P.S. 2 : concernant la ligne précédente, je ne vois pas trop l'intérêt de faire un malloc pour un pointeur...
    P.S. 3 : si tu fais un malloc, fais un free à la fin de ta fonction sinon bonjour la consommation mémoire...
    P.S. 4 : j'ai déjà dû te le dire sur un autre post, mais je le redis : tu dois avoir une option activée à la compilation qui diminue (voir supprime carrément) les warnings et erreurs affichés. Ca n'aide pas forcément car certains warning vont se traduire quasiment à chaque fois par un plantage du programme (les pointeurs non initialisé par exemple, que ton compilateur ne semble pas t'indiquer).
    Il me semble que tu utilises mingW, je ne le connais pas trop, mais un rapide coup d'oeil à la doc m'incite à te dire d'essayer de lui passer l'option -pedantic (quelqu'un qui connait mieux que moi mingW pourra surement te conseiller les bonnes options pour qu'il t'indique les warnings et erreurs pertinents).

  3. #3
    invite8b421ec7

    Re : [c]insertion liste chainee

    Bonjour,
    merci pour votre réponse.
    Citation Envoyé par bzh_nicolas Voir le message
    Salut,
    ton programme ne fait rien ou il plante ? Je penche pour la 2ème solution.
    Il ne fait rien.
    Citation Envoyé par bzh_nicolas Voir le message
    Rien qu'en compilant, j'ai un warning sur cette ligne :
    Code:
    d->vertex->p_head = n;
    qui suffit à expliquer que cela ne "fasse rien".
    En fait je cherche à insérer les données que j'ai dans la liste vertex_t dans ma liste driver_t. Comment faire?
    Citation Envoyé par bzh_nicolas Voir le message

    P.S. (et plus grave même si ça compile comme ça chez toi) : j'ai également une erreur à la compil sur cette ligne si je la laisse tel quelle :
    Code:
    vehicle_t  *d = malloc(sizeof *d);
    Soit dit en passant, tu as vraiment relu cette ligne ???

    P.S. 2 : concernant la ligne précédente, je ne vois pas trop l'intérêt de faire un malloc pour un pointeur...
    J'ai pensé qu'il faut faire l'initilisation du pointeur.
    Citation Envoyé par bzh_nicolas Voir le message

    P.S. 3 : si tu fais un malloc, fais un free à la fin de ta fonction sinon bonjour la consommation mémoire...
    D'accord.
    Citation Envoyé par bzh_nicolas Voir le message

    P.S. 4 : j'ai déjà dû te le dire sur un autre post, mais je le redis : tu dois avoir une option activée à la compilation qui diminue (voir supprime carrément) les warnings et erreurs affichés. Ca n'aide pas forcément car certains warning vont se traduire quasiment à chaque fois par un plantage du programme (les pointeurs non initialisé par exemple, que ton compilateur ne semble pas t'indiquer).
    Il me semble que tu utilises mingW, je ne le connais pas trop, mais un rapide coup d'oeil à la doc m'incite à te dire d'essayer de lui passer l'option -pedantic (quelqu'un qui connait mieux que moi mingW pourra surement te conseiller les bonnes options pour qu'il t'indique les warnings et erreurs pertinents).
    Je suis sous codeblocks. Le compilateur gcc. J'ai activé l'option -W.

  4. #4
    bzh_nicolas

    Re : [c]insertion liste chainee

    oups trop tard pour éditer mon post :
    Concernant ce passage de mon message :
    Soit dit en passant, tu as vraiment relu cette ligne ???

    P.S. 2 : concernant la ligne précédente, je ne vois pas trop l'intérêt de faire un malloc pour un pointeur...
    J'avais mal lu ton code désolé, oublie ça. Le reste reste valable.

  5. A voir en vidéo sur Futura
  6. #5
    bzh_nicolas

    Re : [c]insertion liste chainee

    Citation Envoyé par celine2 Voir le message
    En fait je cherche à insérer les données que j'ai dans la liste vertex_t dans ma liste driver_t. Comment faire?
    Ben justement, si tu veux insérer les données contenues dans v (et pas dans vertex_t vu qu'il s'agit d'un type et pas d'une variable ), pourquoi insérer les données contenues dans ta variable n (qui n'est pas initialisée et donc qui peut contenir n'importe quoi) , plutôt que les celles contenues dans v ?

    Au passage, je ne vois pas trop ce que tu veux faire :
    les infos contenues dans vertex sont la taille et 2 pointeurs sur des nodes. Que veux-tu insérer dans ta liste de driver_t ? La taille ?

  7. #6
    invite8b421ec7

    Unhappy Re : [c]insertion liste chainee

    Citation Envoyé par bzh_nicolas Voir le message
    Ben justement, si tu veux insérer les données contenues dans v (et pas dans vertex_t vu qu'il s'agit d'un type et pas d'une variable ), pourquoi insérer les données contenues dans ta variable n (qui n'est pas initialisée et donc qui peut contenir n'importe quoi) , plutôt que les celles contenues dans v ?

    Au passage, je ne vois pas trop ce que tu veux faire :
    les infos contenues dans vertex sont la taille et 2 pointeurs sur des nodes. Que veux-tu insérer dans ta liste de driver_t ? La taille ?
    En fait voici la déclaration de ma liste node_t (je me suis trompée en fesant copier coller de la cellule node)
    Code:
    struct node
    {
        int no;
        double x;
        double y;
        struct node *p_next;
        struct node *p_prev;
    
    };
    typedef struct vertex
    {
        int taille;
        struct node *p_tail;
        struct node *p_head;
    }vertex_t;
     typedef struct node node_t;
    Je voudrais insérer les données contenues dans la liste de vertex_t dans ma liste de drivert_t.
    Code:
    struct vehicle
    {
    
        vertex_t * vertex;
        int no;
        double cost;
        double distance;
        struct vehicle *p_prev;
        struct vehicle *p_next;
    };
    typedef struct driver
    {
        int taille;
        struct vehicle *p_tail;
        struct vehicle *p_head;
    }driver_t;
    typedef struct vehicle vehicle_t;
    comment faire?
    Merci.

  8. #7
    bzh_nicolas

    Re : [c]insertion liste chainee

    un truc du genre
    Code:
    d->vertex = v

  9. #8
    invite8b421ec7

    Question Re : [c]insertion liste chainee

    Citation Envoyé par bzh_nicolas Voir le message
    un truc du genre
    Code:
    d->vertex = v
    Merci.

    Je cherche à insérer en premier le premier élément contenu dans la liste vertex_t dans la liste de driver_t. Ensuite pour tous les autres éléments restant dans la liste de vertex_t on calcule le cost (on calcule la distance entre tous les élements contenus dans la liste de vertex_t). on choisi l'élément qui minimise ce cout et on insére en fin de la liste de driver_t. Puis on supprime cet élément de la liste de vertex_t.
    Voici mon essai. Est ce logique?
    Merci.
    Code:
    driver_t * algo_insert_vertex(driver_t * d_list, vertex_t * v)
    {	
    	double best_cost = INFINI;
    	vertex_t * v_best = NULL;
    	vertex_t * v_best_drop = NULL;
    	node_t * n = malloc( sizeof *n);
    	vehicle_t * d_best = NULL;
    	
    	vehicle_t * d = driver_insert_first(d_list, v);
    	while(d_list != NULL)
    	{
    		vehicle_t * d1 = d->p_head;
         driver_t *driver_insert_last(d_list, d1);
          double cost = calcul_cost(d_list);//calcul_cost : fonction
          if(cost < best_cost)
          {
    	v_best = d;
    	d_best = d1;
    	best_cost = cost;
          }//end if
          driver_supprimer_vertex(d_list,v);//fonction supprimer l'element de la liste vertex_t
    				
          v = v->p_head->p_next;
    			
          
       }//end while
    		
       d_list = d->p_head->p_next;
    	
       return d_best;
    }
    
    driver_t *driver_insert_last(driver_t *p_list, vertex_t *v)
    {
        if (p_list != NULL)
        {
           vehicle_t *d = malloc(sizeof *d);
            if (d != NULL)
            {
                d->vertex = v;
                d->p_prev = NULL;
                if (p_list->p_tail == NULL)
                {
                    d->p_next = NULL;
                    p_list->p_head = d;
                    p_list->p_tail = d;
                }
                else
                {
                    p_list->p_head->p_prev = d;
                    d->p_next = p_list->p_head;
                    p_list->p_head = d;
                }
                p_list->taille++;
           }
        }
        return p_list;
    }

Discussions similaires

  1. [C]Liste chainée
    Par invite8b421ec7 dans le forum Programmation et langages, Algorithmique
    Réponses: 29
    Dernier message: 09/04/2011, 11h09
  2. liste chainée
    Par invite69686042 dans le forum Programmation et langages, Algorithmique
    Réponses: 7
    Dernier message: 01/01/2011, 19h18
  3. liste chainée en C
    Par invite69686042 dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 01/01/2011, 11h31
  4. liste chainée
    Par invite69686042 dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 11/12/2010, 15h35
  5. Liste chaînée en C - Changer un élément.
    Par invite61ab3646 dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 04/11/2010, 10h40