[C] remplissage liste chainée simple [Fermé]

Signaler
-
Edwyn
Messages postés
105
Date d'inscription
vendredi 20 juin 2008
Statut
Membre
Dernière intervention
31 mars 2011
-
Bonjour,

Je ne suispas très familiariser avec les listes chainées. Je sollicite votre aides.
Je voudrais écrire une fonction qui permet de remplir les élements de ma liste chainée par les lignes d'un fichier de données.
Quelqu'un pourait-il m'aider à réaliser?
Merci par avance.

9 réponses

Messages postés
105
Date d'inscription
vendredi 20 juin 2008
Statut
Membre
Dernière intervention
31 mars 2011
14
Bonjour,

Ca semble correcte, sauf que dans new_client ton p est de type node alors qu'il devrait être de type
client*
et que tu vérifie pas le retour de ton malloc et que son type de retour devrait être
client*

Pour ce qui est de ton ajout en tête le retour devrait être
client*

Pour ton affichage et ton free_list_client l'argument list devrait être de type
client* list
Puis check de pointeur null oublier dans le free.

Ou alors concernant les "*" oublier au niveau du type "client" tu peux juste changer ton typedef pour que "client" corresponde non pas à
struct list_client

mais à
struct list_client*


Cordialement,
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 74406 internautes nous ont dit merci ce mois-ci

Messages postés
105
Date d'inscription
vendredi 20 juin 2008
Statut
Membre
Dernière intervention
31 mars 2011
14
Je n'ai pas testé ce code donc il peut contenir des erreurs.

int main
{
/*ouverture du fichier de donnees pour lecture coordonnees client*/
	FILE * fichier;
	fichier = fopen("D:\\Codes \\n100mos.txt", "r");

	if(fichier == NULL)
	{
		printf("Impossible d'ouvrir fichier donnees .txt \n");
		exit (-1);
	}
        /* Création de la liste*/
        client* cl = null;
        client* tmp = cl;
	/*on commence à lire à la ligne 6: NODE_COORD_SECTION*/
	for(i=0;i<6;i++)
	while(fgetc(fichier)!='\n');
	for(i=0;i<5;i++)
        {
                tmp = malloc(sizeof(client));
                if (tmp == null)
                {
                        printf("Erreur malloc\n");
                        exit(-1);
                }
		if (fscanf(fichier, "%d %lf %lf", &(tmp->identifiant), &(tmp->abscisse), &(tmp->ordonnee))!=3)
		{
			printf("Erreur dans le format d'une ligne : ligne %d \n", i);
                        exit(-1);
                 }
                  tmp->next = cl;
                  cl = tmp;
	}	
        return 0;
}


Attention l'ajout se fait en début de Liste. Si tu veux tu peux utiliser la fonction ajout en tête si tu fait 2-3 modif.

Cordialement,


1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 74406 internautes nous ont dit merci ce mois-ci

Messages postés
105
Date d'inscription
vendredi 20 juin 2008
Statut
Membre
Dernière intervention
31 mars 2011
14
En fait le main que tu as écrit et que j'ai modifié fait ce que tu veux sans utiliser de fonction. Il lui faut juste ta structure client.

Si tu veux utiliser une fonction ajoutEnTete(..) Il faut soit modifier cette fonctioj pour pouvoir l'utiliser dans le main soit modifier le main pour pouvoir lui envoyer les bon arguments.

Cordialement,
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 74406 internautes nous ont dit merci ce mois-ci

Messages postés
105
Date d'inscription
vendredi 20 juin 2008
Statut
Membre
Dernière intervention
31 mars 2011
14
Bonjour,

Peux tu être un peu plus précis sur ton problème exactement, je veux dire sur ce que tu as déjà fait et ce que tu n'arrive pas à faire?

Cordialement,
Voilà ce que j'ai réalisé. Je ne sais pas comment remplir tout les élements de la liste.
Merci d'avance pour vos aides.
struct list_client{
   int identifiant;                 /*definition d'un type structure nommé client*/
   double abscisse;
   double ordonnee;
   int demande;                    /*demande du client*/
   int temps_service;
   int borne_inf_tw;
   int borne_sup_tw;
   struct list_client *suivant;    /*pointeur sur le noeud suivant*/

};
typedef struct list_client client;

/*creation liste client*/
client new_client (int identifiant, double abscisse, double ordonnee, int demande, int temps_service, int borne_inf_tw, int borne_sup_tw)
{
    node p;
    p = NULL;
    p = malloc(sizeof (liste_client));
    p->identifiant = identifiant;
    p->abscisse = abscisse;
    p->ordonnee = ordonnee;
    p->demande = demande;
    p->temps_service = temps_service;
    p->borne_inf_tw = borne_inf_tw;
    p->borne_sup_tw = borne_sup_tw;
    p->suivant = NULL;
    return p;
}

/*ajout des elements à la liste*/
List ajouterEntete(int identifiant, double abscisse, double ordonnee, int demande, int temps_service, int borne_inf_tw, int borne_sup_tw, client *liste)
{
    client *elem = malloc(sizeof(client));
    if (NULL == elem)
        exit(EXIT_FAILURE);
    elem->identifiant = identifiant;
    elem->abscisse = abscisse;
    elem->ordonnee = ordonnee;
    elem->demande = demande;
    elem->temps_service = temps_service;
    elem->borne_inf_tw = borne_inf_tw;
    elem->borne_sup_tw = borne_sup_tw;
    elem->suivant = liste;
    return elem;
}

/*affichage tout les elements de la liste*/
void affiche_list_client (client list)
{
    if(list != NULL)
    {
        do
        {
            printf(" (%d)(%lf)(%lf)(%d)(%d)(%d)(%d)\n", list->identifiant,list->abscisse,list->ordonnee, list->demande,list->temps_service, list->borne_inf_tw, list->borne_sup_tw);
            list = list->suivant;
        }while(list->suivant != NULL);
    }
}
/*  libère la mémoire de toute la chaîne
 *  par une fonction récursive.
 */
void free_list_client(client list)
{
    while(list->suivant != NULL)
    {
        list = list->suivant;
        free_list_client(list);
        free(list);
    }
}
Je n'ai pas compris l'histoire de pointeur comme argument dans la fonction affiche_list_client et free list_client?
Je n'ai pas encore récu une réponse par rapport à ma première question: écrire une fonction qui permet de remplir les élements de la liste à partir d'un fichier de donnée??
Merci.
J'ai ce petit bout de code qui permet de remplir les élements d'une structure. Comment faire pour remplir les élements d'une liste chainée?


int main
{
/*ouverture du fichier de donnees pour lecture coordonnees client*/
	FILE * fichier;
	fichier = fopen("D:\\Codes \\n100mos.txt", "r");

	if(fichier == NULL)
	{
		printf("Impossible d'ouvrir fichier donnees .txt \n");
		exit (-1);
	}

	/*on commence à lire à la ligne 6: NODE_COORD_SECTION*/
	for(i=0;i<6;i++)
	while(fgetc(fichier)!='\n');
	for(i=0;i<5;i++)
		if (fscanf(fichier, "%d %lf %lf", &(client[i].identifiant), &(client[i].abscisse), &(client[i].ordonnee))!=3)
		{
			printf("Erreur dans le format d'une ligne : ligne %d \n", i);
         exit(-1);
		
return 0;
}
Comment devient la fonction ajouterEntete si on voudrais lire les données sur les élements du fichier?
/*ajout des elements à la liste*/
List ajouter(int identifiant, double abscisse, double ordonnee, int demande, int temps_service, int borne_inf_tw, int borne_sup_tw, client *liste)
{
    client* elem = malloc(sizeof(client));
    if (elem == NULL)
        exit(EXIT_FAILURE);
/*ouverture du fichier de donnees pour lecture identifiant & coordonnees client*/
	FILE * fichier;
	fichier = fopen("D:\\Codes\\n100mos.txt", "r");

	if(fichier == NULL)
	{
		printf("Impossible d'ouvrir fichier donnees .txt \n");
		exit (-1);
	}
        client* cl = null;
        client* tmp = cl;
	/*on commence à lire à la ligne 6: NODE_COORD_SECTION*/
	for(i=0;i<6;i++)
	while(fgetc(fichier)!='\n');
	for(i=0;i<5;i++)
        {
                tmp = malloc(sizeof(client));
                if (tmp == null)
                {
                        printf("Erreur malloc\n");
                        exit(-1);
                }
		if (fscanf(fichier, "%d %lf %lf", &(tmp->identifiant), &(tmp->abscisse), &(tmp->ordonnee))!=3)
		{
			printf("Erreur dans le format d'une ligne : ligne %d \n", i);
                        exit(-1);
                 }
                  tmp->next = cl;
                  cl = tmp;
	}	

    elem->identifiant = identifiant;
    elem->abscisse = abscisse;
    elem->ordonnee = ordonnee;
    elem->demande = demande;
    elem->temps_service = temps_service;
    elem->borne_inf_tw = borne_inf_tw;
    elem->borne_sup_tw = borne_sup_tw;
    elem->suivant = liste;
    return elem;
}

??
Messages postés
3
Date d'inscription
mercredi 30 mars 2011
Statut
Membre
Dernière intervention
31 mars 2011

Là il me renvoie les erreurs suivantes :
C:\Documents and Settings\admin\Bureau\Mon algo\main.c|110|error: request for member 'identifiant' in something not a structure or union|
C:\Documents and Settings\admin\Bureau\Mon algo\main.c|110|error: request for member 'abscisse' in something not a structure or union|
C:\Documents and Settings\admin\Bureau\Mon algo\main.c|110|error: request for member 'ordonnee' in something not a structure or union|
C:\Documents and Settings\admin\Bureau\Mon algo\main.c|115|error: request for member 'next' in something not a structure or union|


Comment régler ça?
Merci
Edwyn
Messages postés
105
Date d'inscription
vendredi 20 juin 2008
Statut
Membre
Dernière intervention
31 mars 2011
14
Ecrit Le code en entier de ce que tu as essayé de compiler et d'executer stp
dety_2010
Messages postés
3
Date d'inscription
mercredi 30 mars 2011
Statut
Membre
Dernière intervention
31 mars 2011

Bonjour,

En fait, je suis au début de l'implméntation.
J'ai deux questions qui me tringue l'esprit là:
1. Qu'est ce que c'est la liste chainée circulaire? Quelle est la différence de cette liste avec celle de doublement chainée? Pourriez-vous me l'expliquer à l'aide d'un exemple?Peut-on dire par exemple que cette liste 0 1230 est une liste circulair?
2.Comment allouer dynamiquement un tableau de liste chainée?
Merci par avance de votre aide.

Cordialement
Edwyn
Messages postés
105
Date d'inscription
vendredi 20 juin 2008
Statut
Membre
Dernière intervention
31 mars 2011
14
Bonjour,

Alors une liste chainée circulaire est une liste chainée (une suite de maillons) dont le dernier pointe sur le premier. (au lieu de pointer sur null pour une liste normal)

Une liste doublement chainée est une liste qui contient en plus d'un pointeur next, un pointeur prev qui lui pointe sur le maillon précédent.

Une liste doublement chainée peut être circulaire ou non.

On allout pas dynamiquement un tableau de liste chainée, on allout un maillon qu'on chaine avec d'autre maillon, ce qui rend la liste chainée extensible et qui permet des insersions d'éléments rapides.

https://www.commentcamarche.net/contents/114-langage-c-les-listes-chainees

Cordialement,