Les langages de programmation

Venez apprendre les langages de programmation à votre rythme
 
AccueilGalerieCalendrierFAQRechercherS'enregistrerMembresGroupesConnexion

Partagez | 
 

 Liste doublement chaînée

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Invité
Invité



MessageSujet: Liste doublement chaînée   Mar 24 Avr - 8:51

Hello Smile

Voilà j'ai un soucis sûrement tout bête mais pas moyen de trouver.

tab.c

Code:
#include <stdio.h>
#include <stdlib.h>
#include "tab.h"

liste *creer()
{
    liste *nouvelle = malloc(sizeof(liste));
    nouvelle->first = nouvelle->last = NULL;
    nouvelle->len = 0;
    return nouvelle;
}

void ajouter(liste *ma_liste, char *ch)
{
    elt *elem = malloc(sizeof(elt));
    elem->chaine = ch;

    if(ma_liste->len == 0)
    {
        elem->prec = elem->suiv = NULL;
        ma_liste->first = ma_liste->last = elem;
    }
    else
    {
        elem->prec = ma_liste->last;
        elem->suiv = NULL;
        ma_liste->last = elem;
    }
    ma_liste->len++;
}

int main(int argc, char **argv)
{
    liste *List = creer();
    int i;

    for(i=0; i<argc; i++)
    {
        ajouter(List, argv[i]);
        printf("%s\n", List->first->chaine);
        List->first = List->first->suiv;
    }
    free(List);
    return EXIT_SUCCESS;
}

tab.h

Code:
#ifndef TAB_H_INCLUDED
#define TAB_H_INCLUDED

typedef struct
{
    char *chaine;
    struct elt *suiv;
    struct elt *prec;
} elt;

typedef struct
{
    elt *first;
    elt *last;
    int len;
} liste;

liste *creer();
void ajouter(liste *ma_liste, char *ch);

#endif

Quand je compile j'ai cette erreur --> /home/fred1599/Desktop/tab.c|25|warning: assignment from incompatible pointer type [enabled by default]|

et --> /home/fred1599/Desktop/tab.c|41|warning: assignment from incompatible pointer type [enabled by default]|

Donc ligne 25 et 41 qui sont :

Code:
elem->prec = ma_liste->last;

Code:
List->first = List->first->suiv;

Pourtant dans mon .h il ne me semble pas m'être trompé, bref un peu d'aide me serait utile Wink
Revenir en haut Aller en bas
Invité
Invité



MessageSujet: Re: Liste doublement chaînée   Mar 24 Avr - 13:01

Bon j'ai trouvé Razz

Il y a toujours des warnings, mais ça fait ce que je veux

Code:
#include <stdio.h>
#include <stdlib.h>
#include "tab.h"

liste *creer()
{
    liste *nouvelle = malloc(sizeof(liste));
    nouvelle->first = nouvelle->last = NULL;
    nouvelle->len = 0;
    return nouvelle;
}

void ajouter(liste *ma_liste, char *ch)
{
    elt *elem = malloc(sizeof(elt));
    elem->chaine = ch;

    if(ma_liste->len == 0)
    {
        elem->prec = elem->suiv = NULL;
        ma_liste->first = ma_liste->last = elem;
    }
    else
    {
        ma_liste->last->suiv = elem;
        elem->prec = ma_liste->last;
        elem->suiv = NULL;
        ma_liste->last = elem;
        ma_liste->last->prec = elem->prec;
    }
    ma_liste->len++;
}

void afficher(liste *ma_liste)
{
    elt *elem = ma_liste->first;

    while(elem != NULL)
    {
        printf("%s\n", elem->chaine);
        elem = elem->suiv;
    }
    free(elem);
}

int main(int argc, char **argv)
{
    liste *List = creer();
    int i;

    for(i=0; i<argc; i++)
    {
        ajouter(List, argv[i]);
    }
    afficher(List);
    free(List);
    return EXIT_SUCCESS;
}

J'avais oublié de pointer sur l'élément précédent de la liste ma_liste->last->prec = elem->prec

Edit : J'ai trouvé mon warning, c'était bien dans mon .h

Code:
typedef struct elt /* L'erreur de mettre une structure anonyme */
{
    char *chaine;
    struct elt *suiv;
    struct elt *prec;
} elt_t;

Revenir en haut Aller en bas
koija
Professeur
Professeur


Nombre de messages : 81
Age : 21
Réputation : 11
Date d'inscription : 13/02/2011

MessageSujet: Re: Liste doublement chaînée   Mer 25 Avr - 17:25

D'accord bien joué Smile ! Sinon, pour vrai concorder entre le nom de la structure elt_t et la déclaration de pointeurs sur lui même au milieu, tu peux aussi faire comme ceci:

Code:
typedef struct elt_t elt_t;
struct elt_t /* L'erreur de mettre une structure anonyme */
{
    char *chaine;

    elt_t *suiv;
    elt_t *prec;
};

Voilà ! Sinon, bien joué pour ton débugage Smile !

_________________


All humans will, without exception, eventually die.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://koija.no-ip.org
Invité
Invité



MessageSujet: Re: Liste doublement chaînée   Mer 25 Avr - 17:45

Citation :
tu peux aussi faire comme ceci

Je connais cette notation, j'aime pas du tout, enfin c'est moins naturel on va dire comme ça.

Citation :
Voilà ! Sinon, bien joué pour ton débugage

Oui je m'entraine beaucoup, du coup le C++ je le met un peu comme toi de côté, mais faut dire que la syntaxe est plus simple, mais on gratte (code) plus. proordi
Revenir en haut Aller en bas
Contenu sponsorisé




MessageSujet: Re: Liste doublement chaînée   

Revenir en haut Aller en bas
 
Liste doublement chaînée
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» [TV on PC] Liste des chaînes flux pour 2012
» Liste des chaînes BboxTV
» TVE i a disparu de la liste des chaînes
» Liste des chaînes avec Bbox TV Fibre
» Liste des chaînes Bbox TV

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Les langages de programmation :: Staff :: Bureau de Koija-
Sauter vers: