Liste chainées et concatination

Fermé
legeant16 Messages postés 5 Date d'inscription lundi 11 février 2008 Statut Membre Dernière intervention 12 mai 2015 - 12 mai 2015 à 13:07
Sugel Messages postés 4076 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 - 13 mai 2015 à 18:34
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

chris79 Messages postés 97 Date d'inscription lundi 3 octobre 2005 Statut Membre Dernière intervention 1 février 2016 25
12 mai 2015 à 18:27
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
12 mai 2015 à 19:05
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
Sugel Messages postés 4076 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 725 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
12 mai 2015 à 19:53
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
chris79 Messages postés 97 Date d'inscription lundi 3 octobre 2005 Statut Membre Dernière intervention 1 février 2016 25 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
12 mai 2015 à 19:57
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
12 mai 2015 à 22:01
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
Sugel Messages postés 4076 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 725
13 mai 2015 à 18:34
d'autant plus que la fonction génère bien un pointeur, il fait appel à malloc !
0
Sugel Messages postés 4076 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 725
12 mai 2015 à 18:52
petite faute de frappe ici:

typedef element* llist; 

devrait être
typedef element* l_list; 
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
12 mai 2015 à 18:58
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