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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct SPersonne
{
char* nom;
unsigned int age;
unsigned int number;
char* adresse;
struct SPersonne **amis;
};
typedef struct SPersonne Personne;
/*Prototypes*/
/*Au début une personne n'a pas d'amis, son nom ne change pas mais son adresse peut*/
void naissance(Personne** quidam,char* nom, unsigned int age, char* adresse);
/*Crée un lien d'amitié symétrique */
void sont_amis(Personne *a,Personne *b);
int affinites(Personne a,Personne b);
void demenage(Personne a, char* adresse);
void affiche(Personne* a);
int
main(int argc, char *argv[])
{
/*
Nelly Bord (NB) et ALbert Zweinstein (AZ) sont amis
Ahmas Pamouzh (AP) et Pierre Kiroul sont amis
Claude During (CD), Georges Chatnonne (GC) et Alan Boule (AB) sont tous 3 amis
NB, AP, GC et CD sont amis
Affichez le nombre d'amis communs à AB et AP puis le nombre d'amis communs à GC et CD
Faire déménager NB et l'afficher.
*/
Personne* NB;
naissance(&NB,"Bord Nelly", 28, "Rue du Petit-chêne");
Personne* AZ;
naissance(&AZ, "Albert Zweinstein",34,"Rue de Lyon");
Personne* AP;
naissance(&AP, "Albert Zweinstein",45,"Rue du Lac");
Personne* PK;
naissance(&PK, "Pierre Kiroul",23,"Rue des Alpes");
Personne* CD;
naissance(&CD, "Claude During",89,"Rue des Oliviers");
Personne* GC;
naissance(&GC, "Georges Chatnonne",67,"Rue du Port");
Personne* AB;
naissance(&AB, "Alan Boule",7,"Rue du Commerce");
sont_amis(NB,AZ);
sont_amis(NB,AB);
sont_amis(NB,CD);
/* printf(NB.amis[1].nom); */
/* demenage(&NB,"Rue des Acacias"); */
affiche(NB);
/* clear(&NB); */
/* clear(&AB); */
/* clear(&GC); */
/* clear(&CD); */
/* clear(&PK); */
/* clear(&AP); */
/* clear(&AZ); */
/* clear(&NB); */
return 0;
}
/* ================================================================== */
void
naissance(Personne** quidam,char* nom,unsigned int age, char* adresse)
{
*quidam=malloc(sizeof(Personne));
(*quidam)->nom = calloc(strlen(nom)+1,sizeof(char));
if((*quidam)->nom !=NULL)
{
strcpy((*quidam)->nom, nom);
}
(*quidam)->adresse = calloc (strlen(adresse)+1, sizeof(char));
if((*quidam)->adresse != NULL)
{
strcpy((*quidam)->adresse, adresse);
}
(*quidam)->age = age;
(*quidam)->number = 0;
}
/* ================================================================== */
void
sont_amis(Personne *a,Personne *b)
{
static int reentrant = 0;
if (a->number == 0) // Pas encore d'amis
{
/* On alloue un espace mémoire de la taille de Personne puis on ajoute b */
a->amis= malloc(sizeof (Personne));
a->amis[0] = b;
/* On incrémente le nombre d'amis pour a */
a->number++;
/* Il faut maintenant traiter le problème pour b. Un peu de récurcivité ne */
/* fait jamais de mal ;). On inverse simplement les pointeurs a et b. */
/* La variable reentrant permet de sortir de la récurcivité. */
if (reentrant==0)
{
reentrant=1;
sont_amis (b, a);
reentrant =0;
}
}
else // Il y a déjà au moins un ami
{
/* On alloue un espace mémoire supplémentaire de la taille de Personne */
/* puis on ajoute b */
a->amis= realloc(a->amis, (a->number+1) * sizeof (Personne));
a->amis[a->number]=b;
/* On incrémente le nombre d'amis pour a */
a->number++;
/* Il faut maintenant traiter le problème pour b. L'idée est la même que */
/* lorsqu'il n'y a pas d'amis */
if (reentrant==0)
{
reentrant=1;
sont_amis (b, a);
reentrant =0;
}
}
}
/* ================================================================== */
void
affiche(Personne* a)
{
int i = 0;
printf("nom : %s\n ",a->nom);
printf("age : %d\n",a->age);
printf("adresse : %s\n\n",a->adresse);
printf("Nombre d'amis : %d\n", a->number);
printf("---------------\n");
for (i = 0; i < a->number; i++)
{
printf ("ami avec %s\n", a->amis[i]->nom);
}
} |
Partager