#define _C_td7 /* * ---------------------------------------------------------------------------- * * Fichier : td7.c * Langage : C ANSI * Auteur : F. Boyer * Creation : 7 septembre 1997 * ---------------------------------------------------------------------------- * Description : * Gestion d'un repertoire telephonique. Implantation avec une liste * globale chainee et ordonnee / nom des personnes. * Hypotheses : 2 personnes differentes ont des noms differents * et toute personne n'a qu'1 numero de telephone. * ---------------------------------------------------------------------------- * Interventions * >>>>>>>>>>>>> * ---------------------------------------------------------------------------- * Fonctions definies * Locales : * Exportees : install_rep * main. * * ---------------------------------------------------------------------------- */ /****************************************************************************/ /*------------------- INCLUSION DES INTERFACES SYSTEMES --------------------*/ /****************************************************************************/ #include /****************************************************************************/ /*----------------- INCLUSION DES INTERFACES APPLICATIVES ------------------*/ /****************************************************************************/ #include "td7.h" /****************************************************************************/ /*------------------- CONSTANTES, MACROS & TYPES LOCAUX --------------------*/ /****************************************************************************/ typedef struct s_elt { t_nom nom; t_tel tel; struct s_elt *svt; } t_elt; /****************************************************************************/ /*------------------- SIGNATURES DES FONCTIONS LOCALES ---------------------*/ /****************************************************************************/ /****************************************************************************/ /*------------------- DEFINITIONS DES VARIABLES LOCALES --------------------*/ /****************************************************************************/ static t_elt *Rep; /****************************************************************************/ /*------------------- IMPLANTATION DES FONCTIONS LOCALES -------------------*/ /****************************************************************************/ /****************************************************************************/ /*------------------ IMPLANTATION DES FONCTIONS EXPORTEES ------------------*/ /****************************************************************************/ /* * ---------------------------------------------------------------------------- * * Fonction : installRep * Resultat : 0 si succes, code d'erreur sinon * Parametres : * Nom Type Role * * Description : * Initialise le repertoire * ---------------------------------------------------------------------------- */ unsigned short installRep ( void ) { Rep = NULL; } /* * ---------------------------------------------------------------------------- * * Fonction : ajout * Resultat : 0 si succes, code d'erreur sinon * Parametres : * Nom Type Role * nom t_nom le nom de la personne a ajouter * tel t_tel le tel de la personne a ajouter * Description : * Ajoute le couple (nom,tel)dans le repertoire, si nom n'appartient pas * deja au repertoire. * ---------------------------------------------------------------------------- */ unsigned short ajout (t_nom nom, t_tel tel) { t_elt *elt; t_elt *cur; t_elt *pre; unsigned short ret; short n; if ((elt = (t_elt *) malloc(sizeof(t_elt))) == NULL) { printf("ajout: Erreur dans l'allocation memoire\n"); return(1); } strncpy(elt->nom, nom, TAILLE_NOM); strncpy(elt->tel, tel, TAILLE_TEL); if (Rep == NULL) /* insertion en tete dans repertoire vide */ { elt->svt = Rep; Rep = elt; ret = 0; } else { pre = Rep; cur = Rep; while (cur != NULL) { n = strcmp(cur->nom, nom); if (n > 0) { elt->svt = cur; ret = 0; if (pre == cur) /* insertion en tete */ Rep = elt; else /* insertion au milieu */ pre->svt = elt; break; } else if (n==0) /* element deja present */ { ret = 1; free(elt); break; } else { pre = cur; cur = cur->svt; } } if (cur == NULL) /* insertion en en queue */ { elt->svt = cur; pre->svt = elt; ret = 0; } } return(ret); } /* * ---------------------------------------------------------------------------- * * Fonction : modifie * Resultat : 0 si succes, code d'erreur sinon * Parametres : * Nom Type Role * * Description : * Associe tel a nom dans le repertoire, si non appartient au repertoire. * ---------------------------------------------------------------------------- */ unsigned short modifie (t_nom nom, t_tel tel) { t_elt *elt; t_elt *cur; unsigned short ret; short n; cur = Rep; ret = 1; while (cur != NULL) { n = strcmp(cur->nom, nom); if (n > 0) /* element non present */ { ret = 1; break; } else if (n==0) /* element trouve */ { strcpy(cur->tel, tel); ret = 0; break; } else /* continue la recherche */ cur = cur->svt; } return(ret); } /* * ---------------------------------------------------------------------------- * * Fonction : supprime * Resultat : 0 si succes, code d'erreur sinon * Parametres : * Nom Type Role * nom t_nom le nom de la personne a supprimer * Description : * Supprime la personne de nom donne du repertoire, si elle y appartient. * ---------------------------------------------------------------------------- */ unsigned short supprime (t_nom nom) { t_elt *cur; t_elt *pre; unsigned short ret; short n; pre = Rep; cur = Rep; ret = 1; while (cur != NULL) { n = strcmp(cur->nom, nom); if (n > 0) /* element non present */ { ret = 1; break; } else if (n==0) /* element trouve */ { if (pre == cur) /* element en tete */ Rep = cur->svt; else /* element au milieu */ pre->svt = cur->svt; free(cur); ret = 0; break; } else /* continue la recherche */ { pre = cur; cur = cur->svt; } } return(ret); } /* * ---------------------------------------------------------------------------- * * Fonction : consulte * Resultat : le numero de tel de la personne de nom donne (chaine * vide si la personne n'appartient pas au repertoire). * Parametres : * Nom Type Role * nom t_nom le nom de la personne dont on veut recuperer le tel * Description : * Retourne le tel associe au nom donne, si ce nom appartient au repertoire. * ---------------------------------------------------------------------------- */ char *consulte (t_nom nom) { t_elt *cur; char *ret = ""; short n; cur = Rep; while (cur != NULL) { n = strcmp(cur->nom, nom); if (n > 0) /* element non present */ break; else if (n==0) /* element trouve */ { ret = cur->tel; break; } else /* continue la recherche */ cur = cur->svt; } return(ret); } /* * ---------------------------------------------------------------------------- * * Fonction : parcours * Resultat : * Parametres : * Nom Type Role * Description : * Affiche l'ensemble des couples (nom,tel) contenus dans le repertoire * ---------------------------------------------------------------------------- */ void parcours ( void) { t_elt *cur; printf("----------------\n"); cur = Rep; while (cur != NULL) { printf("%32s %s \n", cur->nom, cur->tel); cur = cur->svt; } } /* * ---------------------------------------------------------------------------- * * Fonction : main * Resultat : int Code d'erreur commande. * Parametres : * Nom Type Role * * Description : * Point d'entree du programme "td7" obtenu par compilation du fichier * "td7.c" (cc -o td7 td7.c). Uniquement utilise pour les tests. * * ---------------------------------------------------------------------------- */ int main() { installRep(); ajout("coco","00000003"); ajout("bobo","00000002"); parcours(); ajout("dodo","00000004"); ajout("aoao","00000001"); parcours(); modifie("coco","00000030"); modifie("bobo","00000020"); modifie("dodo","00000040"); modifie("aoao","00000010"); parcours(); supprime("coco"); parcours(); supprime("aoaoooo"); parcours(); supprime("aoao"); parcours(); supprime("dodo"); parcours(); return(0); }