Liste chainées et concatination

legeant16 Messages postés 6 Statut Membre -  
Sugel Messages postés 4293 Date d'inscription   Statut Membre Dernière intervention   -
bonjour tout le monde j'ai fait un code de débutant il s'agit de créer 2 listes ensuite les concaténer.
qui peux me corriger ce bout de code (nb: 1er erreur ici : element = (element*)malloc(sizeof(element));) :)
#include <stdio.h>
#include <stdlib.h>

typedef struct element element;
struct element{
int val;
struct element *nxt;
};
typedef element* llist;

element crer_element()
{
int nb;
element *element;
element = (element*)malloc(sizeof(element));
printf("Entrez un nombre à la liste : ");
scanf("%d", &nb);
element->val = nb;
element->nxt = NULL;
return element
}

l_list remplir_liste( l_list list)
{
int i=1,taille;
list *p=NULL,*q=&p
element ele;
while(i<=taille)
{
printf("Entrez le nombre d'element de la liste : ");
scanf("%d", &taille);
ele = crer_element()
  • q = ele; q=&ele->nxt; i=i+1; } return list; } void afficher(l_list list){ list *tmp; tmp = &list; printf("\nvotre liste est :\n"); while (tmp != NULL){ printf("%d\n", (*tmp).val); tmp = tmp->nxt;t } }l_list* concatination( l_list* list1, l_list* list2){ if(!list1) return list2; l_list* tmp=list1; while(tmp->nxt) tmp=tmp->nxt; tmp->nxt=list2; return list1;}int main(){ l_list *list1, *list2; list1 = (l_list *)malloc(sizeof(element)); list2 = (l_list *)malloc(sizeof(element)); list1 = remplir_liste(list1); afficher(list1); list2 = remplir_liste(list2); afficher(list2); list1=concatination( list1, list2); afficher(list1); system("PAUSE"); return 0; }

merci d'avance

3 réponses

  1. chris79 Messages postés 91 Date d'inscription   Statut Membre Dernière intervention   25
     
    Slt,
    Au sujet de ta fonction
    element crer_element()
    :
    Son prototype n'est pas adapté. Il faudrait qu'elle retourne un pointeur de type element.
    soit :
    element * crer_element()


    Cela ne parait pas net de nommer ta variable element du même nom que sa structure. On préférera donc :
    element *pElement = NULL;
    pElement = (element*)malloc(sizeof(*pElement));

    ;)
    0
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Son prototype n'est pas adapté. Il faudrait qu'elle retourne un pointeur de type element.
      Pas d'accord. Pourquoi devrait-il renvoyer un pointeur ? Il s'agit d'un élément, donc c'est bon.


      Cela ne parait pas net de nommer ta variable element du même nom que sa structure. On préférera donc :

      Yep. Encore mieux, mettre une majuscule au nom d'un type créé.
      Par exemple :
      Element *element;
      element=malloc(sizeof(*element));
      
      0
      1. Sugel Messages postés 4293 Date d'inscription   Statut Membre Dernière intervention   728 > fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Salut !

        Moi, je suis d'accord avec l'ami Chris:
        element crer_element() // ici, le prototype stipule que doit être retourné un élément de type "element"
        {
                int nb;
                element *element; // on déclare la le pointeur "element" de type "* element"
                element = (element*)malloc(sizeof(element)); // on alloue de la mémoire et définissons le pointeur
                printf("Entrez un nombre à la liste : ");
                scanf("%d", &nb);
                element->val = nb;
                element->nxt = NULL;
                return element // on retourne ce pointeur, de type "*element"
        }


        Donc, la valeur retournée n'est pas du type déclaré, et le compilateur nous gratifie du message d'erreur approprié.
        0
      2. chris79 Messages postés 91 Date d'inscription   Statut Membre Dernière intervention   25 > fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Pas d'accord. Pourquoi devrait-il renvoyer un pointeur ? Il s'agit d'un élément, donc c'est bon.
        Cette fonction renvoie actuellement un pointeur de type element :
        element crer_element()
        {
                int nb;
                element *element;
                ...
                return element
         }

        Le prototype n'est donc pas à jour avec le code de la fonction.
        0
    2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Oui, j'avais pas vu il y a un problème de cohérence entre la valeur renvoyée et le type.
      Pour autant, la valeur attendue dans le main() est bien element.
      Il devrait donc plutôt faire :
      element crer_element(void)
      {
           element el;
           return el;
      }
      

      Enfin, en tout cas on est d'accord. Il faut bien tout mettre en cohérence.
      0
    3. Sugel Messages postés 4293 Date d'inscription   Statut Membre Dernière intervention   728
       
      d'autant plus que la fonction génère bien un pointeur, il fait appel à malloc !
      0
  2. Sugel Messages postés 4293 Date d'inscription   Statut Membre Dernière intervention   728
     
    petite faute de frappe ici:

    typedef element* llist; 

    devrait être
    typedef element* l_list; 
    0
  3. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Bonjour,
    Ouh là, ton code est illisible après ele = crer_element()
    Peut-être est-ce parce que tu as oublié le ";" ?
    De même il manque un ';' après : *q=&p

    Tu as un "t" qui se balade tout seul.
    Bref, avant de regarder ce qui ne va pas, revois tout ça et fais une belle indentation :-).

    Note : utilise la balise "code c" pour mettre la couleur (et pas seulement "code"

    Cdlt,
    0