Liste chainées et concatination

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. 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. Contributeur
      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
    2. @fiddySalut !

      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
    3. @fiddyPas 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
    4. Contributeur
      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
    5. d'autant plus que la fonction génère bien un pointeur, il fait appel à malloc !
      0
  2. petite faute de frappe ici:

    typedef element* llist; 

    devrait être
    typedef element* l_list; 
    0
    1. Contributeur
      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