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. 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
    1. petite faute de frappe ici:

      typedef element* llist; 

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