[C] Liste chainée dans liste chainée.

Résolu/Fermé
jerémiethe7 Messages postés 152 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 27 février 2009 - 22 avril 2008 à 12:10
jerémiethe7 Messages postés 152 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 27 février 2009 - 22 avril 2008 à 17:50
Bonjour,

j'ai une liste chainée de contacts (nom+prénom+tel+mail). Pour chaque contacts, je souhaiterait créer une liste chainée à l'intérieur de celle çi. Mon problème est que je n'arrive pas à mettre NULL dans les (et non la) liste chainée imbriquée.
Voilà ce que j'ai pour l'instant :


//structure stockage Mail (le message)
typedef struct {
char SMS[tailleSMS+1],date[150],horloge[128]; // on rajoute toujours +1 pour avoir la place pour le "\0"
}Sms;
///////////////////////////////////////////////////////////////////////////////////////////////////


//structure liste chainée (donnée + pointeur)
typedef struct liste_sms{
Sms UnSMS;
liste_sms *p_suivant;
}liste_sms;
///////////////////////////////////////////////////////////////////////////////////////////////////


//structure stockage contact (les données)
typedef struct {
char numerotel[T+1]; // on rajoute toujours +1 pour avoir la place pour le "\0"
char name[N+1], pren[N+1],adrmail[M+1];
liste_sms UnSMS;
}Contact;
///////////////////////////////////////////////////////////////////////////////////////////////////




//structure liste chain?e (donnée + pointeur)
typedef struct fiche{
Contact UnContact;
fiche *p_suivant;
}fiche;
///////////////////////////////////////////////////////////////////////////////////////////////////

voilà donc ensuite j'essaye d'initialiser les pointeurs de type liste_mail par NULL.

Dans mon main(), je déclare *p-liste de type fiche, je rempli tous les "jetons" de type Contact exepté liste_mail, que je ne touche pas encore.
Puis j'envoie p_liste (qui pointe sur la tête de la liste chainée c'est certain) vers une fonction, qui renvoie p_liste vers une autre fonction (sans y toucher).Voiçi l'appel depuis de main() :

envoyerSMS(p_liste,nom_a_supprimer,prenom_a_supprimer,tel_a_supprimer,presence_contact);
// elle renvoie p_liste à Ecrire SMS

Puis voici ma fonction Ecrire_SMS :

void EcrireSMS(char *nomSMS, char *prenomSMS,char *telSMS,char *mailSMS,fiche *p_liste,int nombre_contact)
{
FILE* listeSMS = NULL;
char lettreSMS,SMS[tailleSMS+1],horloge[128],date[150];
int i=0,fin=0;
fiche *ptr=p_liste;
_tzset();
_strtime(horloge);
time_t time_of_day; //valeur contenant le temps écoulé depuis le 01/01/1970
time_of_day = time( NULL ); //récupérer le temps passé
strftime(date,150,"%Y/%m/%d",localtime( &time_of_day ) ); //inscrire dans la chaîne buffer notre string telle que nous la voulons

listeSMS=fopen("SMS.txt","w+");
system("cls");
printf("Entrez votre SMS (160 caractères au maximun)\n");
while (lettreSMS!=13&&i<tailleSMS)
{
lettreSMS=getch();
printf("%c",lettreSMS);
SMS[i]=lettreSMS;
i++;
}SMS[i-1]='\0';
while (fin==0) // C'EST ICI QUE J'ESSAIE DE L'INITIALISER
{
ptr->UnContact.UnSMS.p_suivant=NULL;
if(ptr->p_suivant==NULL)
fin=1;
else
ptr=ptr->p_suivant;
} // apparement j'ai essayer de faire printf("%s",ptr->UnContact.UnSMS.p_suivant); ça me met null. ok

if (listeSMS) // ICI J'AIMERAI CREER UN JETON DE TYPE LISTE_SMS mais mon pointeur ptr ne pointe plus sur le même endroit et donc je ne sais pas comment ré-atteindre le bon endroit
{
printf(listeSMS,"%s|%s|%s|%s|%s|%s|%s|\n",nomSMS,prenomSMS,telSMS,mailSMS,date,horloge,SMS);
fclose(listeSMS);
}
}

J'aimerai créer un jeton de la manière suivante :

liste_sms* nouveau=(liste_sms*)malloc(sizeof(liste_sms)); // on crée un nouveau jeton de type liste_sms
creation_jetonSMS(nouveau,date,horloge,SMS);
(*nouveau).p_suivant=(*p_liste).UnContact.UnSMS.
(*p_liste).UnContact.UnSMS.p_suivant=nouveau;

mais bon je ne sais pas si c'est avec p_liste que je doit le faire.

Merci et si vous avez des questions, n'hésitez pas je reveindrait régulièrement pour regarder vos commentaires.
+++
A voir également:

2 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
22 avril 2008 à 14:25
Voici un exemple
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct A_{
	char ville[30];
	struct A_ *suivant;
}Adresse;

typedef struct L_{
	char nom[30];
	char prenom[30];
	char tel[15];
	char mail[30];
	struct L_ *suivant;
	Adresse *l_imbriquee; // liste imbriquée
}Liste;

void InsertionEnTete(Liste **pp_L,char *nom,char *prenom,char *tel,char *mail);
void InsertionEnTete2(Adresse **pp_A,char *ville);
void AfficherListe(Liste *L);
void AfficherAdresse(Adresse *A);

int main()
{
	Liste *L;
	Adresse *A;
	char adresse[100];
	char ville[30];
	char nom[30];
	char prenom[30];
	char tel[15];
	char mail[30];
	
	L=NULL;A=NULL;

	printf("----------------------------\n");
	printf("Nom? ");
	scanf("%s",nom);
	printf("Prénom? ");
	scanf("%s",prenom);
	printf("Téléphone? ");
	scanf("%s",tel);
	printf("Mail? ");
	scanf("%s",mail);
	InsertionEnTete(&L,nom,prenom,tel,mail);
	printf("Ville? ");
	scanf("%s",ville);
	InsertionEnTete2(&L->l_imbriquee,ville);

	printf("Données personnelles : \n");
	printf("----------------------------\n");
	AfficherListe(L);
	printf("----------------------------\n");
	printf("Adresse : \n");
	AfficherAdresse(L->l_imbriquee);
	printf("----------------------------\n");
	printf("Nom? ");
	scanf("%s",nom);
	printf("Prénom? ");
	scanf("%s",prenom);
	printf("Téléphone? ");
	scanf("%s",tel);
	printf("Mail? ");
	scanf("%s",mail);
	InsertionEnTete(&L,nom,prenom,tel,mail);
	printf("Ville? ");
	scanf("%s",ville);
	InsertionEnTete2(&L->l_imbriquee,ville);
	printf("Ville2? ");
	scanf("%s",ville);
	InsertionEnTete2(&L->l_imbriquee,ville);

	printf("Données personnelles : \n");
	AfficherListe(L);
	printf("----------------------------\n");
	printf("Adresse : \n");
	AfficherAdresse(L->l_imbriquee);
	return 0;
}

void InsertionEnTete(
		Liste **pp_L,
		char *nom,char *prenom,char *tel,char *mail){
	Liste *nouveau;
	nouveau=(Liste*)malloc(sizeof(Liste));
	strcpy(nouveau->nom,nom);
	strcpy(nouveau->prenom,prenom);
	strcpy(nouveau->tel,tel);
	strcpy(nouveau->mail,mail);
	nouveau->l_imbriquee=NULL;
	nouveau->suivant=*pp_L;
	*pp_L=nouveau;
}

void InsertionEnTete2(Adresse **pp_A,char *ville){
	Adresse *nouveau;
	nouveau=(Adresse*)malloc(sizeof(Adresse));
	strcpy(nouveau->ville,ville);
	nouveau->suivant=*pp_A;
	*pp_A=nouveau;
}

void AfficherListe(Liste *L){
	Liste *courant;
	for(courant=L;courant!=NULL;courant=courant->suivant){
		printf("%s\n",courant->nom);
		printf("%S\n",courant->prenom);
		printf("%s\n",courant->tel);
		printf("%s\n",courant->mail);
	}
}

void AfficherAdresse(Adresse *A){
	Adresse *courant;
	for(courant=A;courant!=NULL;courant=courant->suivant)
		printf("%s\n",courant->ville);
	
}
Et le test
lami20j@ubuntu:~$ ./a.out
----------------------------
Nom? azerty
Prénom? aaa
Téléphone? 0111111111
Mail? azerty@yahoo.fr
Ville? paris
Données personnelles :
----------------------------
azerty
0111111111
azerty@yahoo.fr
----------------------------
Adresse :
paris
----------------------------
Nom? qwerty
Prénom? bbb
Téléphone? 0211111111
Mail? qwerty@hotmail.com
Ville? washington
Ville2? boston
Données personnelles :
qwerty
0211111111
qwerty@hotmail.com
azerty
0111111111
azerty@yahoo.fr
----------------------------
Adresse :
boston
washington
lami20j@ubuntu:~$
2
jerémiethe7 Messages postés 152 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 27 février 2009 32
22 avril 2008 à 17:50
ok merci lami20j, j'ai juste un peu testé ton programme mais j'pense que ça ira j'pourrais prendre exemple sur ce dernier.

merci bien !!
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
22 avril 2008 à 12:26
Salut,

Pour chaque contacts, je souhaiterait créer une liste chainée à l'intérieur de celle çi.

Pourquoi pas ajouter plusieurs champs dans la structure?

En ce cas chaque contact devrais être la tête de la liste correspondante.
Bref, tu crées un pointeur de type liste par exemple liste_imbriquee pour obtenir ta liste imbriquée
0
jerémiethe7 Messages postés 152 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 27 février 2009 32
22 avril 2008 à 12:44
euh j'ai pas tout compris lami20j, dans quelle structure ???

Moi ce que j'ai pensé c'était de faire :

une structure avec :

mail
prenom
nom
tel
1_liste_chainée
0