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 :

Probleme structure et liste


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Par défaut Probleme structure et liste
    Bonjours a toutes et a tous,
    Voila mon probleme:
    Dans mon programme C j'ai crée une liste (structure) qui contient struct liste suite et struct information InfoListe comme suite:
    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
    typedef struct
    {
    	int ID;
    	int num;
    	int CP;
    	int tel;	
    	char nom[Si];
    	char pre[Si];
    	char rue[Si];
    	char ville[Si];
     
    }information;
     
    //Declaration de la structure Sliste
    struct liste
    {
    	information InfoListe;
    	 struct liste *suite;
    };
    typedef struct  liste Sliste;
    alors pour encoder mes info (plus qu'un) ca fonctionne tres bien mais pour l'affichage il me sort toujours le 1er que j'ai encoder et pour le reste il trouve pas ... Certrainement un prob de pointeur mais pas moyen de trouve
    Dans mon main j'ai:
    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
    do
    				{
    					system("cls");
    					InsererElement(&deb);						//Le & est necessaire pour le double pointeur
    					NbrIns++;
    					printf("Encoder un nouvel element ? ('o' pour continuer)");
    					fflush(stdin);
    					scanf("%c",&again);
    				}while(again == 'o' || again == 'O');
     
    			}break;
     
    			//Afficher les element de la liste
    			case 2:
    			{
    				for(i=0; i<NbrIns; i++)
    				{
    					system("cls");
    					AfficherInfo(&(deb+i)->InfoListe);
    					getch();
    				}
    			}break;
    Pour inserer Encoder et Afficher j'ai les fonctions suivantes:
    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
    void EncoderInfo(information *info)
    {
    	system("cls");
    	printf("Entrer l'identifiant : ");
    	fflush(stdin);
    	scanf("%d",&info->ID);
    	printf("Entrer votre nom     : ");
    	fflush(stdin);
    	gets(info->nom);
    	printf("Entrer votre prenom  : ");
    	fflush(stdin);
    	gets(info->pre);
     
    	printf("Entrer le numero     : ");
    	fflush(stdin);
    	scanf("%d",&info->num);
    	printf("Entrer votre rue     : ");
    	fflush(stdin);
    	gets(info->rue);
     
    	printf("Entrer le code postal: ");
    	fflush(stdin);
    	scanf("%d",&info->CP);
    	printf("Entrer la ville      : ");
    	fflush(stdin);
    	gets(info->ville);
    	printf("Entrer le num de tel : ");
    	fflush(stdin);
    	scanf("%d",&info->tel);
    }
     
    //Declaration de la fonction AfficheInfo (uniquement avec la struct information)
    void AfficherInfo(information *info)
    {
    	while(info)
    	{printf("Votre identifiant: %d",info->ID);
    	printf("\nVotre nom        : ");
    	puts(info->nom);
     
    	printf("Votre prenom     : ");
    	puts(info->pre);
     
    	printf("Votre numero     : %d",info->num);
    	printf("\nVotre rue        : ");
    	puts(info->rue);
     
    	printf("Votre code postal: %d",info->CP);
    	printf("\nVotre ville      : ");
    	puts(info->ville);
    	printf("Votre telephone  : %d",info->tel);}
    }
    void InsererElement(Sliste **deb)
    {
    	Sliste *parcours,*inserer,*precedent;
    	parcours = *deb;
    	precedent = NULL;
    	inserer=(Sliste*)malloc(sizeof(Sliste )); 
     
    	EncoderInfo(&((inserer)->InfoListe));
    	while (parcours !=NULL)
    	{
    		precedent = parcours;
    		parcours = parcours->suite;
    	}
     
    	inserer->suite = parcours;
    	if (precedent == NULL)
    	{	
    		*deb=inserer;
    	}
    	else
    	{
    		precedent->suite = inserer;
    	}
    }
    Merci d'avance pour l'aide que vous pourrez me fournir
    Xillion

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 803
    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 803
    Billets dans le blog
    1
    Par défaut
    Dans ta boucle d'affichage, tu utilises "deb" comme s'il s'agissait d'un tableau. Or, il me semble que deb ce n'est que le pointeur vers le premier élément de ta liste. En tout état de cause, "deb + i" pointera donc n'importe où et "&(deb + i)" ne sera que l'adresse de ce n'importe où...

    PS: Il ne faut pas confondre "liste" et "élément de liste". Ce que toi tu appelles "liste" n'est en fait qu'un maillon de cette liste donc un noeud.
    Une liste c'est une structure qui contient
    - le premier noeud
    - eventuellement d'autres infos comme le nb d'éléments, le noeud courant et autres trucs que tu juges utile. Voir à ce sujet le tuto qui explique le principe des listes => http://nicolasj.developpez.com/articles/listesimple
    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]

  3. #3
    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
    En plus, pourquoi y a t'il un while(info) dans AfficherInfo alors que info n'est pas modifié dans la boucle ?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Par défaut
    Alors il faudrait que j'utilise un autre pointeur que deb ?
    Mais logiquement deb pointe bien sur mon 1er element de liste et 'deb+i' devrait normalement pointeur sur l element suivant non ?
    Je cherche toujours mais ca fait deja tellement longtemps

    Pour tout te dire diogene ce while est la car j'etais assez desesperée :s mais ca va je viens de le retirer

  5. #5
    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
    Citation Envoyé par xillion Voir le message
    Alors il faudrait que j'utilise un autre pointeur que deb ?
    Mais logiquement deb pointe bien sur mon 1er element de liste et 'deb+i' devrait normalement pointeur sur l element suivant non ?
    Je cherche toujours mais ca fait deja tellement longtemps
    Non. Ce nest pas un tableau mais une liste .Si deb pointe sur ton premier élément (donc est non NULL), deb->suite pointe sur le suivant (ou est NULL)

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Par défaut
    Ok ok ca va merci beaucoup de votre aide j'ai continue a chercher et pour fini j'ai fait comme suite:
    J'ai cree une nouvelle fonctione AfficheListe qui appel la fonction AfficherInfo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void AfficheListe(Sliste *v)
    {
    	while(v)
    	{
    		system("cls");
    		AfficherInfo(&(v)->InfoListe);
    		v=(v)->suite;
    		getch();
    	}
    }
    Sans oublier que dans mon main je n'appelle plus la fonction AfficherInfo mais bien AfficheListe.
    En tout cas merci de vos conseilles ca m'a bien aidé

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 803
    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 803
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par xillion Voir le message
    Ok ok ca va merci beaucoup de votre aide j'ai continue a chercher et pour fini j'ai fait comme suite:
    J'ai cree une nouvelle fonctione AfficheListe qui appel la fonction AfficherInfo

    void AfficheListe(Sliste *v)
    {
    while(v)
    {
    system("cls");
    AfficherInfo(&(v)->InfoListe);
    v=(v)->suite;
    getch();
    }
    }

    Sans oublier que dans mon main je n'appelle plus la fonction AfficherInfo mais bien AfficheListe.
    En tout cas merci de vos conseilles ca m'a bien aidé
    Les parenthèses autour de "v" sont inutiles

    Citation Envoyé par xillion Voir le message
    Pour tout te dire diogene ce while est la car j'etais assez desesperée
    Le C ce n'est pas de l'alchimie. On ne résout pas un problème en mettant des instructions "au petit bonheur" mais plutôt en analysant le déroulement du code tel qu'on l'a écrit...
    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]

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

Discussions similaires

  1. [MySQL] Problème avec une liste déroulante
    Par leloup84 dans le forum SQL Procédural
    Réponses: 19
    Dernier message: 24/01/2006, 12h57
  2. Réponses: 7
    Dernier message: 22/12/2005, 09h56
  3. probleme avec zone liste modifiable en mode continu
    Par hellosct1 dans le forum Access
    Réponses: 3
    Dernier message: 16/11/2005, 13h47
  4. Réponses: 8
    Dernier message: 09/08/2005, 10h27
  5. [langage] probleme avec les listes dans des listes
    Par pqmoltonel dans le forum Langage
    Réponses: 7
    Dernier message: 27/04/2004, 12h32

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