IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

un problème avec les listes chainées


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2012
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 12
    Points : 6
    Points
    6
    Par défaut un problème avec les listes chainées
    bonjour, l'exercice nous demande d implementer les primitives sur une liste chainé suivants:
    1-creer une liste chainé
    2-ajout a l'entete
    3-affiche la liste
    4-insertion d'un element dans une position
    5-tester si la liste est vide ou non
    6-calculer la taille de la liste
    7-rechercher un element donné dans la liste
    8- trier la liste dans l'ordre decroissant
    9-supprimer le premier element


    j'ai fait un essai il est executable mais tjrs ily a un probleme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    #include<stdio.h>
     
    #include<stdlib.h>
    struct element
    {
    	int val;
    struct	element* next;
    };
     
    typedef element*  liste;
    void  creer(liste  l )
    {
     l=NULL;
     
    }
     void ajout(liste l,int e)
    {
    	 liste t;
       t =(element*) malloc(sizeof(element));
     
     
    t->val=e;
     
     t->next=l;
      return(t);
     
     
    }
    void affiche (liste l)
    {
    	element*p=l;
    	while (p!=NULL)
    	{
    		printf ("la valeur de %d element de cette liste= %d\n\n",p->val);
    		p=p->next;
    	}
    }
     
     
    int test(liste l)
    {
     
    	return(l==NULL);
    }
     
    void insertion (liste l,int pos, int e)
    {
    	int i=0;
    liste aux;
    liste aux1;
     aux=(element*)malloc(sizeof(element));
     aux1=(element*)malloc(sizeof(element));
     
     
     aux->val=e;
     
     
    	while ((i<pos)&&(l->next!=NULL))
    	{
    		aux1=l;
         l=l->next;
    	}
     
     aux1->next=aux;
     aux->next=l;
    }
     
     
     
     
    int  taille(liste l)
    {
    	int i=0;
    liste p=l;
    	if (test(l)==0)
    		return(0);
    		else
    	{
    	while  (p!=NULL)  
    	{
     
           i++;
     
    		p=p->next;
    	}
    	}
    	return (i);
    }
     
     
     
    int position(liste l,int e)
    {
    liste aux =l;
    	int i=0;
    	while((aux!=NULL)&&(aux->val!=e))
    	{
    		i++;
    		aux=aux->next;
    	}
    	if(aux==NULL)
    		return(0);
    		else 
    		return(i);
    }
     liste tri (element*l)
    {
    	liste l1;
     
    int i=0;
    l1=(element*)malloc(sizeof(element));
    	int max;
    	max= l-> val;
     
     
     
     
    while (i< taille (l))
    {
    while (l!=NULL)
    {
    	if (l->val>max)
    		max=l->val;
    	l=l->next;
    }
     
    l1->val=max;
    i++;
    }
    return(l1);
     
     }
     
     
    void supprimer (liste l) 
    {
    	element * aux=l ;
    	element*aux1=l;
     
     
      if (taille(l)==1)
    {
    l->next =NULL;
    free(l);
    }
    else 
    while(aux->next!=NULL)
    {
    aux1=aux;
    aux=aux->next;
    }
     
     
     
     
    aux1->next=NULL;	
     
    free(aux);
    }
     
    void main ()
    {
    liste l;
    int i;
    int e;
      int pos;
    	creer(l);
    	printf("saisir l element a ajouter\n");
    	scanf("%d",&i);
    	ajout(l,i);
    	affiche(l);
    printf("saisir l element a inserer");
    scanf("%d",&e);
    printf("saisir la position volu  ");
    scanf("%d",&pos);
     
     
     insertion(l,pos,e);
    affiche(l);
    if (test(l)==0)
    printf("la liste est vide");
    else
    printf("la liste est pleine");
     
    printf (" la taille de cette liste=%d",taille(l));
    tri(l);
     
    supprimer (l);
    affiche (l);
    }

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Quelques remarques en vrac sans étudier le code proprement dit :

    1- Respectez l'indentation et évitez les lignes vides inutiles. En clair, soignez la présentation du code. La lecture en sera grandement facilitée.

    2- typedef element* liste;. Ce n'est pas un bon choix que de masquer un pointeur dans un typedef : cela ajoute une difficulté pour la lecture du code.
    Comme il est demandé une fonction retournant le nombre d'éléments de la liste, il peut être interessant de stocker ce nombre au lieu de devoir parcourir toute la liste qui peut être longue.
    Je suggère d'envisager plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct
    {
      element * liste;
      size_t nbElements;
    } liste;
    3-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void  creer(liste  l )
    {
     l=NULL;
     
    }
    Ne fait rien, modifie la variable locale l, mais pas l'argument utilisé pour appeler la fonction.

    4-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void ajout(liste l,int e)
    {
    ...
      return(t);
    }
    Une fonction qui ne retourne rien ne peut rien retourner !

    5- void insertion (liste l,int pos, int e).... Cette fonction doit pouvoir modifier la tête de liste si l'insertion se fait en tête. Ce prototype ne le permet pas

    6- liste tri (element*l) { .... On doit spécifier une valeur de retour. Le int implicite est obsolete.

    7- void supprimer (liste l).... Cette fonction doit pouvoir modifier la tête de liste si la suppression se fait en tête. Ce prototype ne le permet pas

    6- void main ()main doit retourner un int. Vous devez spécifier le prototype de main() : int main (void){... return 0;} .

  3. #3
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 654
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 654
    Points : 11 149
    Points
    11 149
    Par défaut
    bonjour,

    une petite remarque supplémentaire : évitez d'appeler vos variables "l" ( lettre "L" minuscule) car avec certaines polices de caractères utilisées par des éditeurs on peut confondre avec le chiffre 1.

    Le mieux est de donner un nom plus explicite :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    typedef struct
    {
      element * liste;
      size_t nbElements;
    } liste;
     
    int main(void)
    {
        liste  maListe;
       /* suite du code... */
    }

  4. #4
    Futur Membre du Club
    Inscrit en
    Mai 2012
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    j' arrive pas vraiement à comprendre vos renseignements pouvez vous me donner le programme aprés la correction

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 137
    Points
    23 137
    Par défaut
    Permettez que je réponde à leur place : Non.

    S'il te passent directement le programme corrigé, est-ce que tu auras réellement appris quelque chose?

    Si tu ne comprend pas quelque chose, fait des recherches dans le man, sur internet, ou pose des questions un peu plus précise ici afin que tu puisses "comprendre [leur] renseignements".

    Il faut comprendre que programmer c'est aussi apprendre à chercher.

    Déjà il y a quelques remarques que tu pourrais mettre en place dans ton code.
    Tu pourrais déjà nous montrer ce que tu as réussi à faire (en prenant en compte leurs remarques) que l'on voie où tu en est, ce que tu as compris et ce que tu n'as pas compris de leurs remarques.

    Si tu ne comprend pas le 1,4,6,6bis de Diogene, c'est que tu n'as pas cherché à comprendre...


    EDIT : Ce n'est pas à nous de faire ton exercice. Je pense que Diogene et Auteur savent déjà très bien faire des listes chaînées et ils n'ont pas besoin de s'entraîner pour en faire, contrairement à toi.
    Un exercice, ce n'est pas quelque chose que les profs te donnent pour de souler ou pour que tu montre que tu sais utiliser un moteur de recherche pour trouver une solution toute faite.

    C'est de par ses erreurs qu'on apprend le plus, donc essaye de faire le maximum par toi-même, trompes-toi et apprend.
    S'ils te donnent la solution, tu ne pourras pas te tromper et tu apprendras donc beaucoup moins que si tu avais essayé.

Discussions similaires

  1. Problème avec les listes chainées
    Par Naswd_94 dans le forum Débuter
    Réponses: 8
    Dernier message: 09/03/2015, 11h40
  2. Problème avec les listes chainées
    Par t-mac06 dans le forum Débuter
    Réponses: 12
    Dernier message: 26/01/2012, 21h57
  3. petit problème avec les listes chainées
    Par djinpark1 dans le forum Débuter
    Réponses: 4
    Dernier message: 30/06/2009, 18h11
  4. Problème avec les listes chainées
    Par reeda dans le forum C++
    Réponses: 10
    Dernier message: 23/04/2008, 17h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo