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 :

Accéder à un élément d'une liste liée


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Accéder à un élément d'une liste liée
    Bonsoir, j'ai un problème tout simple, que je n'arrive pas à résoudre.
    Je souhaiterais créer une fonction permettant de retourner le contenu de ma liste chainée à un rang donné en paramètre. Comme lorsque l'on fait tab[i] avec un tableau.

    Merci de votre aide,

    J'avais réalisé ceci auparavant en m'aidant d'un site :

    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
    typedef struct element element;
    struct element
    {
        int val;
        struct element *nxt;
    };
     
    typedef element* llist;
     
     
    llist add(llist liste, int valeur)
     
    {
        element* nouvelElement = malloc(sizeof(element));
        nouvelElement->val = valeur;
        nouvelElement->nxt = NULL;
        if(liste == NULL)
        {
            return nouvelElement;
        }
        else
        {
            element* temp=liste;
            while(temp->nxt != NULL)
     
            {
                temp = temp->nxt;
            }
            temp->nxt = nouvelElement;
            return liste;
        }
    }
     
    int size(llist liste)
    {
        if(liste == NULL)
            return 0;
        return size(liste->nxt)+1;
     
    }
     
    void disp(llist liste)
    {
        element *tmp = liste;
        while(tmp != NULL)
        {
            printf("%d ", tmp->val);
            tmp = tmp->nxt;
        }
    }
    je précise que je sais comment procéder, mais je ne sais pas l'écrire en langage C

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Il ne te manque vraiment pas grand chose, c'est l'histoire d'une ou deux lignes. Si l'algorithme est clair pour toi, qu'est-ce qui te bloque exactement ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Le problème c'est que ce n'est pas moi qui ai fait ce code. Car je ne connais pas cette partie du langage C, je comprends pas grand chose. Je pense procéder ainsi : parcourir chaque valeur de la liste jusqu'à i. Avec un while ou je ne sais quoi, mais je ne sais pas comment le faire la, merci.

  4. #4
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    La programmation impérative, quelque soit le langage, reste fondamentalement de la programmation impérative. Y'a vraiment rien de sorcier. Lis un cours d'initiation au C, propose quelque chose et nous t'aiderons.

  5. #5
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    En cherchant un peu et avec l'aide d'un camarade je suis arrivé à faire ceci, mais il y a une erreur quand je compile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int nthvalue(llist liste, int rang) 
    { 
    if(liste == NULL  || rang <= 0 ) 
    	return NULL; 
    else 
    	if (rang==1)
    		return liste.valeur;
    	else
    		return nthvalue(liste->nxt,rang-1);
    }
    Voici l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    serie1.c:61:15: error: request for member ‘val’ in something not a structure or union
       return liste.val;
                   ^

  6. #6
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    j'ai résolu le problème j'avais fait une faute de frappe en le recopiant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int prt(llist liste, int rang) 
    { 
    if(liste == NULL  || rang <= 0 ) 
    	return 0; 
    else 
    	if (rang==1)
    		return liste->val;
    	else
    		return prt(liste->nxt,rang-1);
    }

  7. #7
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    C'est bien. Si on analyse ta proposition à présent, elle suppose que :

    • il existe une valeur portant une signification particulière pour les éléments de la liste (ici l'entier 0), puisque c'est elle qu'on retourne dans les cas particuliers (liste vide, paramètre invalide..) ;
    • on n'ait pas besoin de la partie topologique de l'information puisque l'on retourne directement la valeur contenue plutôt que son conteneur brut (le nœud de la liste) ;
    • la numérotation des éléments débute à 1, et non à 0 comme c'est le cas la plupart du temps.


    Voici une alternative :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct element *get_at(struct element *list, size_t i) {
        while (list && i-- > 0)
            list = list->nxt;
     
        return list;
    }
    Elle comporte les altérations suivantes :

    • l'invariant qui contraint le paramètre de rang à être positif est ici implicitement assuré grâce à un type non signé ;
    • on suppose une numérotation débutant à 0 ;
    • on évite de recourir à une valeur d'élément à signification spéciale puisqu'on retourne le conteneur de l'élément demandé, ou NULL s'il n'a pas été trouvé ;
    • elle met en œuvre une approche itérative plutôt que récursive (empiler les contextes se justifie ici difficilement).

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Haktarus Voir le message
    J'avais réalisé ceci auparavant en m'aidant d'un site :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct element element;
    struct element
    {
        int val;
        struct element *nxt;
    };
     
    typedef element* llist;
    Bonjour

    Probablement un site aux 3/4 moisi. Déjà il y aune grosse incohérence dans ton code: tu considères que la liste c'est "un élément". Ben non, une liste ça peut être beaucoup plus que ça. Ca peut être en effet le premier élément ; mais ça peut aussi être le dernier (si par exemple on veut la parcourir dans les 2 sens) ; ça peut être aussi en plus le nb d'éléments ; ça peut aussi être en plus un pointeur sur l'élément courant ; etc.

    Donc au lieu de faire un typedef, moi je mettrais une structure...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct s_element
    {
        int val;
        struct s_element *nxt;
    } t_element;
     
    typedef struct {
        t_element *first;
    } t_liste;

    C'est pour le moins pareil que toi sauf que là, tu peux ensuite facilement faire évoluer le truc. Et la solution de Matt_Houston convient parfaitement.

    Citation Envoyé par Haktarus Voir le message
    je précise que je sais comment procéder, mais je ne sais pas l'écrire en langage C
    Ben c'est quand-même la base que de l'apprendre au préalable...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2015
    Messages : 53
    Points : 85
    Points
    85
    Par défaut
    Parfaitement daccord avec toi, un detail mais personellement j'ai pour habitude de rajouter le nombre d'éléments dans la 2eme structure, on peut parfaitement sans passer mais moi j'aime bien.

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct s_element
    {
        int val;
        struct s_element *nxt;
    } t_element;
     
    typedef struct {
        t_element *first;
        int size_list;
    } t_liste;

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nibors Voir le message
    un detail mais personellement j'ai pour habitude de rajouter le nombre d'éléments dans la 2eme structure
    Ben oui, c'est ce que je disais dans la phrase "tu peux facilement faire évoluer le truc" => rajouter le nombre d'éléments, le dernier élément utilisé, etc etc etc...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Demande d'aide Urgent SVP :(
    Par amineLFSI dans le forum Général Java
    Réponses: 0
    Dernier message: 07/05/2013, 18h18
  2. [Débutant] aide urgente svp
    Par djdidi2010 dans le forum C#
    Réponses: 1
    Dernier message: 25/02/2013, 09h07
  3. SVP j'ai besoin d'aide Flex/Bison (urgent)
    Par t_imed dans le forum Linux
    Réponses: 0
    Dernier message: 16/04/2008, 17h06

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