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 :

creation d'une liste


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 36
    Par défaut creation d'une liste
    voici mes instructions:Instructions

    1. Read the contents of file "p2data.txt" into a linked list which for now I
    will refer to as link1.
    2. Traverse link1 and copy the contents of link1 into a new linked list which I will call link2.
    3. Traverse link1 and while traversing write the content to a text file call "link12out.txt" .
    4. Write 3 blank lines to the file "link12out.txt" .
    5. Traverse link2 and while traversing write the contents to the text file "link12out.txt"
    6. (NOTE) The content of the input file "p2data.txt" has the same format as the files that we have been using in class, i.e. a first name, last name, rank, and a grade.


    j`ai ajoute les pieces jointe des fichiers original et celui a ecrire a l`interieure.et comme vous le constaterai link12out.txt est mon resultat final ce qui n`est pas le resultat recherche.p2data.txt ..est parcontre le fichier original dans lequel on recupere les infos


    voici mon code
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    struct stud_info
    {
    char fname[15];
    char lname[15];
    int rank ;
    float grade;
    struct stud_info* next;
    };
     
    int main ()
    	{
    	struct stud_info* newnode;
        struct stud_info* link1;
    	struct stud_info* link2;
    	struct stud_info* read;
     
     
    		FILE * infile ;
    		FILE* outfile;
    		infile= fopen ( "p2data.txt", "r");
    		outfile= fopen("link12out.txt","w");
     
    		newnode = (struct stud_info*)  malloc(sizeof(struct stud_info));
    		newnode->next = NULL;
    		link1 = newnode;
     
    		fscanf(infile,"%s %s %d %f",newnode->fname,newnode->lname,&newnode->rank,&newnode->rank);
     
    		//built link1
    		while(!feof(infile))
    		{
    			newnode = (struct stud_info*) malloc(sizeof(struct stud_info));
    			newnode->next = link1;
    			link1 = newnode;
    		    fscanf(infile,"%s %s %d %f",newnode->fname,newnode->lname,&newnode->rank,&newnode->grade);
    		}
    		read = link1;
     
            //built link2
            	newnode = (struct stud_info*) malloc(sizeof(struct stud_info));
    		    newnode->next = NULL;
    		    link2 = newnode;			
    		while(read != NULL)
    		{
    			newnode= (struct stud_info*) malloc(sizeof(struct stud_info));
    			newnode->next = link2;
    			link2 = newnode;
    			newnode = read;
     
    			printf("%s %s %d %f\n",link2->fname,link2->lname,link2->rank,link2->grade);
     
    			read = read->next;
    		}
     
    		//print link1 in file
    		while(link1 != NULL)
    		{
    			fprintf(outfile,"%-20s %-20s %-4d %-8.2f\n", link1->fname,link1->lname,link1->rank,link1->grade);
    			link1=link1->next;
     
    		}
     
    		while(link2 != NULL)
    		{
    			fprintf(outfile,"\n\n\n %-20s %-20s %-4d %-8.2f\n",link2->fname,link2->lname,link2->rank,link2->grade);
     
    			link2 = link2->next;
    		}
     
    		fclose(infile);
    		fclose(outfile);
     
    return(0);
     
    }//end of fonction main
    mon probleme survient serieusement a partir de la list2(link2) qd je dois tranferer le contenu de la liste1(link1) vers la liste2, je n`y arrive pas et j`ai des resultats bizare....aidez moi....

    ....SMALTO...
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    Le forum C++ n'est pas ce qu'il y a des plus adaptés aux corrections d'exo de C (!).

    Là, il est un peu trop tard pour que je cherche à quel moment tu t'es planté dans tes gardes de fins de liste. Mais cherche de ce côté tout de même..
    Un conseil : n'ai pas peur de faire des fonctions. Ton code est trop massif pour donner envie de s'y plonger.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Bonjour,

    Où sont les tests pour vérifier si tes ouvertures de fichiers se sont bien déroulés ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        	    	if(infile==NULL || outfile==NULL)
    		   return EXIT_FAILURE;
    Ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    newnode = (struct stud_info*)  malloc(sizeof(struct stud_info));
    On ne fait pas de cast sur le retour de malloc et on peut faire mieux que le sizeof(struct stud_info) et bien sûr on teste le retour de malloc, cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    newnode = malloc(sizeof(*newnode));
    if(newnode==NULL)
       return EXIT_FAILURE;
    On n'utilise pas fscanf mais fgets avec après strtod pour les entiers et strtof pour les flottants et d'ailleurs tu as ce warning par rapport au fscanf que tu n'as pas vu :

    link.c: In function 'main':
    link.c:30: warning: format '%f' expects type 'float *', but argument 6 has type 'int *'
    (copié-collé mal fait de ta part, newnode->rank apparait deux fois...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	//built link1
    		while(!feof(infile))
    		{
    			newnode = (struct stud_info*) malloc(sizeof(struct stud_info));
    			newnode->next = link1;
    			link1 = newnode;
    		        fscanf(infile,"%s %s %d %f",newnode->fname,newnode->lname,&newnode->rank,&newnode->grade);
    		}
    Non, on n'utilise pas feof, on teste le retour de fscanf. Mais ici tu alloue un nouveau maillon sans savoir si tu as encore des résultats. Cela ne semble pas te choquer...

    Je passe les mêmes remarques sur les malloc suivants et j'arrive à ta deuxième boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    		while(read != NULL)
    		{
    			newnode= (struct stud_info*) malloc(sizeof(struct stud_info));
    			newnode->next = link2;
    			link2 = newnode;
    			newnode = read;
     
    			printf("%s %s %d %f\n",link2->fname,link2->lname,link2->rank,link2->grade);
     
    			read = read->next;
    		}
    Encore une fois le malloc est mal fait, pas de test de retour mais plus grave :

    Tu crois que cela copie quelque chose ?
    Non ! Il faut le faire à la main ou utiliser memcpy si tu sais ce que tu est en train de faire (memcpy fera une copie superficielle des données, donc tout tableau dynamique ne sera pas copié, seul l'adresse vers ce tableau le sera...).

    Tu devrais donc faire ceci :

    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
    		while(read != NULL)
    		{
    			newnode = malloc(sizeof(*newnode));
    			if(newnode==NULL)
    			    return EXIT_FAILURE;
     
    			newnode->next = link2;
    			link2 = newnode;
     
    			strcpy(newnode->fname,read->fname);
    			strcpy(newnode->lname,read->lname);			
    			newnode->rank = read->rank;
    			newnode->grade = read->grade;
     
    			printf("%s %s %d %f\n",link2->fname,link2->lname,link2->rank,link2->grade);
     
    			read = read->next;
    		}
    En bref, beaucoup de choses à revoir, trop de choses faites rapidement... Reprends ton cours/livre...

    Jc

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Un bon conseil : Fait un module séparé juste pour la liste avec ses fonctions !

    Ton programme sera plus lisible et ton main sera grandement allégé, une liste s'implémente pas de cette façon, en mettant simplement le tout dans le main, c'est du barbare ca
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut
    Citation Envoyé par fearyourself

    On ne fait pas de cast sur le retour de malloc et on peut faire mieux que le sizeof(struct stud_info) et bien sûr on teste le retour de malloc, cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    newnode = malloc(sizeof(*newnode));

    Pourquoi ne pas faire le cast? (Raisons majeures?)
    Bien que le compilateur ne l'exige pas il peut améliorer la lisibilité du code.
    Enfin, c'est mon opinion.

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par vdumont
    Pourquoi ne pas faire le cast? (Raisons majeures?)
    Bien que le compilateur ne l'exige pas il peut améliorer la lisibilité du code.
    Enfin, c'est mon opinion.
    Ca alourdi le code inutilement, ça n'apporte rien et ça peut masquer un bug grave...

    http://emmanuel-delahaye.developpez....tes.htm#malloc

  7. #7
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 36
    Par défaut merci le prog marche. mais !!!!
    mais j`ai simplement utilise le code de FEARYOURSELF al fin de son intervention
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    strcpy(newnode->fname,read->fname);
    strcpy(newnode->lname,read->lname);			
    newnode->rank = read->rank;
    newnode->grade = read->grade;
    mais j`ai une question pourquoi ne peut on pas utiliser le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    car celui ci ne marche pas du tout,erreur je crois
    newnode->fname=read->fname;
    newnode->lname=read->lname;
    
    au lieu de
    
    strcpy(newnode->fname,read->fname);
    strcpy(newnode->lname,read->lname);

    en tout cas tout marche je cherche a comprendre en profondeur maintenant, je note toutes les remarques que vous avez donner, mais il y a certaines choses que je ne comprends pas, et c`est minatenant que je vais les parcourires etape par etape...merci encore...comm les cast etc..

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par smalto
    mais j`ai une question pourquoi ne peut on pas utiliser le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    car celui ci ne marche pas du tout,erreur je crois
    newnode->fname=read->fname;
    newnode->lname=read->lname;
    
    au lieu de
    
    strcpy(newnode->fname,read->fname);
    strcpy(newnode->lname,read->lname);
    Il est techniquement possible de faire comme dans le premier cas, c'est à dire de reopier la valeur d'un pointeur dans un autre pointeur. On a alors créé un 'alias', c'est à dire un deuxème pointeur qui pointe sur le même objet que le premier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       char *a = "hello";
       char *b = a;
     
       puts(a);
       puts(b);
    Mais l'objet original reste unique.

    Si pour une raison ou pour une autre, son adresse devenait invalide, elle le serait pour les 2 pointeurs a et b. On a pas copié les données...

    Si on utilise strcpy(), c'est parce qu'on veut faire une copie de la zone pointée (ici une chane).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       char *a = "hello";
       char b[123];
     
       strcpy (b, a);
     
       puts(a);
       puts(b);
    Apparement, rien n'a changé. mais si "hello" devient invalide, la copie subsistera.

    Le besoin de copie dépend du contexte d'utilisation des données (bonjour la langue de bois...)

  9. #9
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 36
    Par défaut pas trop claire!!
    je comprend que l`on fait une copie pour ne pas ,endomager l`original en cas de probleme....
    mais dans mon cas precis pourquoi l`utilisation de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    pourquoi on peut utiliser les lignes suivantes 
    newnode->rank = read->rank;
    newnode->grade = read->grade;
    car ces lignes ci en haut fonctionnent
    
    et non celle ci
    
    newnode->fname=read->fname;
    newnode->lname=read->lname;
    ces lignes ci par contre donne directement des erreurs.
    ou pourquoi ne pas avoir utilise directement strcpy pour tout
    comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    strcpy(newnode->fname,read->fname);
    strcpy(newnode->lname,read->lname);
    strcpy(newnode->rank,read->rank);
    strcpy(newnode->grade,read->grade);

  10. #10
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 36
    Par défaut je ne comprends pas le message d`erreur suivant...
    quand je fait le code suivant juste pour comprendre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    newnode->fname=read->fname;
    newnode->lname=read->lname;			
    newnode->rank = read->rank;
    newnode->grade = read->grade;
    il m`affiche ce message d`erreur.
    error C2106: '=' : left operand must be l-value
    qu`est ce que cela signifie je ne comprends pas

    et ma question veritable est quelle est la difference entre les deux premieres ligne et les deux dernieres pour que le message d`erreur qu`il affiche ne concerne pas les deux dernieres lignes aussi...

  11. #11
    Expert confirmé
    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
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2106: '=' : left operand must be l-value
    L'erreur est ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    newnode->fname=read->fname;
    newnode->lname=read->lname;
    Les champs fname et lname sont définis comme des tableaux. L'identificateur d'un tableau représente l'adresse du premier élément du tableau qui n'est pas modifiable.
    Autrement dit :
    Il est impossible d'écrire tab = qq chose si tab est un identificateur de tableau. tab ne peut être seul à gauche de = (ce n'est pas une leftvalue)

  12. #12
    Expert confirmé
    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
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strcpy(newnode->rank,read->rank);
    strcpy(newnode->grade,read->grade);
    strcpy est une fonction qui copie une chaîne de caractères c'est à dire un tableau de char terminé par la valeur '\0'. Elle ne permet pas de copier des int ou des float. Copier un int ou un float dans un autre se fait directement par =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    newnode->rank = read->rank;
    newnode->grade = read->grade;
    Par contre, on l'utilisera pour les champs fname et lname pour recopier la chaîne de caractères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strcpy(newnode->fname,read->fname);
    strcpy(newnode->lname,read->lname);

Discussions similaires

  1. creation d'une liste chainée
    Par naniate dans le forum C
    Réponses: 3
    Dernier message: 03/11/2007, 17h51
  2. [Access97] Creation d'une liste a bascule ou similaire
    Par Cyric dans le forum VBA Access
    Réponses: 2
    Dernier message: 25/07/2007, 11h09
  3. [XHTML] [Debutant] Creation d'une liste
    Par bon4000 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 20/07/2007, 16h40
  4. Réponses: 9
    Dernier message: 14/01/2007, 17h09
  5. Création d'une liste déroulante ?
    Par ultracoxy dans le forum Struts 1
    Réponses: 7
    Dernier message: 25/07/2006, 09h03

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