Liste chainée et pointeurs en programmation c

Résolu/Fermé
nabelou1 Messages postés 11 Date d'inscription dimanche 23 décembre 2007 Statut Membre Dernière intervention 5 mai 2008 - 2 janv. 2008 à 23:57
 fati - 23 févr. 2008 à 13:50
Bonjour,
j'aimerais qu'on m'aide à resoudre un probleme qui me depasse avec les pointeurs et listes chainées
voici le code
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef char chaine[20];
typedef struct voisin *pvoisin;

typedef struct{
chaine nom ;
int dist;
int typ;
pvoisin suiv;}voisin;
typedef struct noeud *pnoeud;

typedef struct{
chaine ville;
int nb;
int ens;
pvoisin vois;
pnoeud suivant;}noeud;

int cpt1,cpt2,n;
chaine orig,dest;
pnoeud tete,courant;
void datasource(chaine fiche)
{
FILE *f;
pnoeud nod1,nod2; pvoisin vnod1,vnod2;
f=fopen(fiche,"r");
fscanf(f,"%d",&n);fscanf(f,"\n");
for(cpt1=0;cpt1<n;cpt1++)
{
nod2=tete;
nod1=(pnoeud)malloc(sizeof(noeud));
fscanf(f,"%s %d\n",nod1->ville,nod1->nb);
for(cpt2=0;cpt2<nod1->nb;cpt2++)
{
vnod2=nod1->vois;
vnod1=(pvoisin)malloc(sizeof(voisin));
fscanf(f,"%s %d %d",vnod1->nom,vnod1->dist,vnod1->typ);
nod1->vois=vnod1;vnod1->suiv=vnod2;
}fscanf(f,"\n\n");
nod1->suivant=nod2;tete=nod1;
}
printf("data load succefully");
}
main()
{
chaine fichier;
printf("entrez le nom du fichier contenant les données");
scanf("%s\n");
datasource(fichier) ;
}

et j'ai une ceci lors de la compilation

C:\Documents and Settings\nabelou\Bureau\tp3\liste.c: In function `datasource':
34: error: dereferencing pointer to incomplete type
34: error: dereferencing pointer to incomplete type
35: error: dereferencing pointer to incomplete type
:37: error: dereferencing pointer to incomplete type
:39: error: dereferencing pointer to incomplete type
39: error: dereferencing pointer to incomplete type
:39: error: dereferencing pointer to incomplete type

40: error: dereferencing pointer to incomplete type
40: error: dereferencing pointer to incomplete type

42: error: dereferencing pointer to incomplete type
43: error: syntax error before '}' token

merci d'avance

7 réponses

nabelou1 Messages postés 11 Date d'inscription dimanche 23 décembre 2007 Statut Membre Dernière intervention 5 mai 2008 3
5 janv. 2008 à 12:29
t'avais raison je n'ai plus les problemes de dereferencent
ais il e seble qu'il y'a autre cose car le programme s'arrete de lui même quand je tape le nom de mon fichjer.
voici le code

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef char chaine[20];
typedef struct voisin{
chaine nom ;
int dist;
int typ;
struct voisin *suiv;};
typedef voisin *pvoisin;
typedef struct noeud *pnoeud;
typedef struct noeud{
chaine ville;
int nb;
int ens;
pvoisin vois;
pnoeud suivant;};

int cpt1,cpt2,n;
chaine orig,dest;
pnoeud tete,courant;
void datasource(chaine fiche)
{
FILE *f;
pnoeud nod1,nod2; pvoisin vnod1,vnod2;
f=fopen(fiche,"r");
fscanf(f,"%d",&n);fscanf(f,"\n");
for(cpt1=0;cpt1<n;cpt1++)
{
nod2=tete;
nod1=(pnoeud)malloc(sizeof(noeud));
fscanf(f,"%s %d\n",&(nod1->ville),&(nod1->nb));
for(cpt2=0;cpt2<nod1->nb;cpt2++)
{
vnod2=nod1->vois;
vnod1=(pvoisin)malloc(sizeof(voisin));
fscanf(f,"%s %d %d",&(vnod1->nom),&(vnod1->dist),&(vnod1->typ));
nod1->vois=vnod1;vnod1->suiv=vnod2;
}fscanf(f,"\n\n");
nod1->suivant=nod2;tete=nod1;
}
printf("data load succefully");
}
main()
{
chaine fichier;
printf("entrez le nom du fichier contenant les données\n");
scanf("%s",&fichier);
datasource(fichier) ;
}
1
BloodyAngel Messages postés 1482 Date d'inscription mardi 21 juin 2005 Statut Contributeur Dernière intervention 21 juin 2018 402
3 janv. 2008 à 00:02
Bin déjà je m'arrêterais à deux choses :
scanf ça pue... je serais toi j'utiliserait gets()

Deuxièmement, tu utilises "chaine"... c'est quoi exactement ?
0
Doctor C Messages postés 627 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 19 février 2016 398
3 janv. 2008 à 00:22
chaine c'est un un tableau de char ( regarde le typedef au début)
0
Doctor C Messages postés 627 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 19 février 2016 398
3 janv. 2008 à 00:26
et pour ton problème... peut-être que je suis rouillé en C mais, je crois bien que dans tes fscanf (pas tous...), tu fais une petite erreur.

i.e.:

fscanf(f,"%s %d\n",nod1->ville,nod1->nb);

tu devrais plutôt placer tes valeurs dans l'adresse ( &(nod1->nb) ) et non dans la variable elle-même.

plutôt comme ça:

fscanf(f,"%s %d\n",&(nod1->ville), &(nod1->nb));

(pour le ville, je suis pas certains que ce soit nécessaire étant donné qu'il s'agit d'une chaîne de caractères mais, pour le nb, ça me parait être la cause de ton erreur)
s'il s'agit de ton erreur, tu l'as répétée dans quelques autres fscanf
0
nabelou1 Messages postés 11 Date d'inscription dimanche 23 décembre 2007 Statut Membre Dernière intervention 5 mai 2008 3
4 janv. 2008 à 13:36
nod1 est deja une adresse
c'est un pointer et je crois que & n'est pas necessaire avec les pointeur
0
Doctor C Messages postés 627 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 19 février 2016 398
4 janv. 2008 à 23:11
J'espère ne pas me tromper dans ce que je vais dire par la suite:

oui, nod1 est un pointeur, mais les propriétés de ta structure ( "pointées" par les -> ) ne sont pas des pointeurs (pour la majorité). Ce sont des variables.

au pire, tu pourrais simplement l'essayer et me dire le résultat!
il est possible que je me trompe...

tiens-moi au courant!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nabelou1 Messages postés 11 Date d'inscription dimanche 23 décembre 2007 Statut Membre Dernière intervention 5 mai 2008 3
6 janv. 2008 à 00:30
j'ai fini par resoudre le probleme en faisant le dereferencement avec & comme tu l'avais dit Doctor c
je vous remercie pour le coup de main.
0
Doctor C Messages postés 627 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 19 février 2016 398
6 janv. 2008 à 04:04
un problème de moins dans le monde!

heureux de t'avoir aidé!
0
slt je veux bien un bon cour avec des explications et des exercices parce que je ne viens pas de comprendre la methode d'ecrire un programme
merci bien
0