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

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    août 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : août 2017
    Messages : 20
    Points : 9
    Points
    9

    Par défaut compréhension liste chaînée

    Bonjour,
    j'aimerai je suis débute en langage C et actuellement je travaille les listes chaînée mais j'arrive pas comprendre quelques notions.
    J'aimerai savoir quelle est la différence entre PTR!=NULL et PTR->SUIVANT!=NULL
    Ma question peu paraître un peu stupide mais j'arrive pas à résoudre des problème à cause de ça.
    Exemple
    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
    maliste SupprimerEnFin(maliste tete){
    	maliste tmp;
    	tmp=tete;
    	ptr=tmp->suivant;
    	while(tmp->suivant!=NULL)
    	{
    		ptr=tmp;
    		tmp=tmp->suivant;
    	}
     
    free(ptr->suivant);
    ptr->suivant=NULL;
    tete=ptr;
    return tete;
    }
    Ce programme affiche mais ne donne pas le résultat souhaiter il supprime deux élément le dernier et l'avant dernier.
    Merci bien de m'aider

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    7 275
    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 : 7 275
    Points : 20 720
    Points
    20 720
    Billets dans le blog
    1

    Par défaut

    Bonjour

    Citation Envoyé par steph_ntic Voir le message
    J'aimerai savoir quelle est la différence entre PTR!=NULL et PTR->SUIVANT!=NULL
    Ce ne sont pas les mêmes pointeurs.

    Le premier désigne le pointeur courant. Il peut ne pas exister (donc être NULL). Ou alors il peut exister (donc contenir des infos) mais l'une de ces infos c'est qu'il n'a pas de suivant. Donc il existe, mais son suivant est à NULL.

    Citation Envoyé par steph_ntic Voir le message
    Ma question peu paraître un peu stupide mais j'arrive pas à résoudre des problème à cause de ça.
    Déjà ton premier souci c'est que tu masques les pointeurs derrière un type ("maliste"). Et ça ce n'est pas à faire. Le pointeur est un élément primordial du C. Le programmeur doit les voir. Là par exemple, je ne sais absolument pas combien il y a d'étoiles derrière ce type et je ne peux pas aller plus loin. Surtout que d'un côté je me dis "il doit y en avoir deux" (puisque la fonction modifie un pointeur elle doit recevoir son adresse qui sera stockée dans un pointeur double) mais ton algo semble indiquer qu'il n'y en a qu'un seul (puisque tu l'utilises aussi comme maillon).

    Ton second souci, c'est que tu n'as aucun type pour gérer ta liste. Tu gères un maillon, oui, mais gérer l'ensembe des maillons non. D'où ce type "maliste" destiné à combler ce vide mais qui ne le comble qu'imparfaitement.
    Ici un exemple complet de liste chainée. Il y a un type dédié à un maillon, et un type dédié à la liste elle-même. Tu verras que ça simplifie ensuite le codage...

    Citation Envoyé par steph_ntic Voir le message
    je débute en langage C
    Il y a une section spéciale de cette partie du forum dédiée aux débutants
    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

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    août 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : août 2017
    Messages : 20
    Points : 9
    Points
    9

    Par défaut

    Merci infiniment Sve@r pour ta réponse elle m'aidera énormément dans ma méthode de travaille.
    Le pointeur dont tu parles pour tous les maillon je l'ai nommé tete.
    J'ai fait cette déclaration avant d'écrire les différente fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef struct liste
    {
    	int donnee;
    	struct liste *suivant;
    }liste;
     
    typedef liste *maliste;
    liste *tete;
    liste *ptr, *ptr1;

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    7 275
    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 : 7 275
    Points : 20 720
    Points
    20 720
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par steph_ntic Voir le message
    J'ai fait cette déclaration avant d'écrire les différente fonction
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct s_noeud {
    	int donnee;
    	struct s_noeud *suivant;
    } t_noeud;
     
    typedef struct {
    	t_noeud *tete;
    } t_liste;
    Repars de là. Après-tout, tu débutes donc ton code ne doit pas être si important que tu ne puisses pas le réécrire. Utilises de petites fonctions très simples qui ne font qu'une chose (initialisation liste, remplissage noeud, positionnement noeud, etc). Et fais-le sans globales. Ce sera un peu galère au début mais ensuite tu verras que tu t'amuseras bien plus dans des codes que tu maitriseras et que tu pourras modifier facilement.

    Je te donne le début
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void liste_init(t_liste *l) {
    	l->tete=NULL;
    }
     
    int main() {
    	t_liste maListe;
    	liste_init(&maListe);
    }
    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

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    août 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : août 2017
    Messages : 20
    Points : 9
    Points
    9

    Par défaut

    J'ai appris énormément de chose par cette petite discussion qu'on a eu et j'ai aussi cherché. J'ai pris note de tout et par contre j'ai pu écrire la fonction et elle marche bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    maliste SupprimerEnFin(maliste tete){
    	ptr1=tete;
    	while(ptr1!=NULL &&  ptr1->suivant!=NULL)
    	{
    		ptr=ptr1;
    		ptr1=ptr->suivant;
    	}
    ptr->suivant=NULL;
    free(ptr1);
    return tete;
    }
    Merci beaucoup pour tout. Même que je m'amuse déjà

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/10/2005, 19h20
  2. Liste chaînée
    Par kilinette dans le forum C
    Réponses: 6
    Dernier message: 17/10/2005, 23h45
  3. Listes chaînées circulaires
    Par gege2061 dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 11/05/2005, 13h44
  4. Construction de liste chaînées
    Par fomblardo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 15/03/2005, 21h19
  5. Insertion d'un noeud dans une liste chaînée
    Par habib106 dans le forum Assembleur
    Réponses: 8
    Dernier message: 07/04/2004, 22h34

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