Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.25 KB | None | 0 0
  1. // liste-contacts.c
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>  // Optional.
  5. #include <string.h>
  6. #include "liste-contacts.h"
  7.  
  8. NOEUD *debut; // Pointeur vers le premier noeud de la liste.
  9.  
  10. int main() {
  11.    
  12.     int option;
  13.  
  14.     debut = NULL;  // La liste est vide au début du programme.
  15.     do {
  16.         option = afficher_menu();
  17.         switch (option) {
  18.             case INSERER:
  19.                 inserer_contact();
  20.                 break;
  21.             case EFFACER:
  22.                 effacer_contact();
  23.                 break;
  24.             case RECHERCHER:
  25.                 rechercher_contact();
  26.                 break;
  27.             case IMPRIMER:
  28.                 imprimer_liste();
  29.                 break;
  30.             case SORTIR:
  31.                 effacer_liste();
  32.                 break;
  33.             default:
  34.                 printf("\nOption inconnue! Choisissez une option à nouveau\n");
  35.         }
  36.     } while (option != SORTIR);
  37.    
  38.     return 0;
  39.  
  40. }
  41.  
  42. int afficher_menu() {
  43.  
  44.     int option;
  45.  
  46.     printf("\n*** Menu Principal ***\n");
  47.     printf("\n1. Insérer contact\n");
  48.     printf("2. Effacer contact\n");
  49.     printf("3. Rechercher contact\n");
  50.     printf("4. Imprimer liste de contacts\n");
  51.     printf("5. Sortir\n");
  52.     printf("\nChoisissez votre option (1-5): ");
  53.     scanf("%d", &option);
  54.    
  55.     return option;
  56.    
  57. }
  58.  
  59. void inserer_contact() {
  60.  
  61.     char prenom[21];
  62.     long numtel;
  63.     NOEUD *p, *q, *r;
  64.    
  65.    
  66.     printf("\nEntrez le prénom (jusqu'à 20 caractères): ");
  67.     scanf("%s", prenom);
  68.     printf("\nEntrez le numero: ");
  69.     scanf("%ld", &numtel);
  70.  
  71.     p = creer_noeud(prenom);
  72.     if (p != NULL)  // Si l'allocation de mémoire a réussi.
  73.         p->numtel = numtel;
  74.     else {
  75.         printf("Il n'y a plus de mémoire pour insérer nouveau contact!\n");
  76.         return;  // Retourner sans rien faire.
  77.     }
  78.    
  79.     if (debut == NULL)  // Si la liste est vide.
  80.         debut = p;
  81.     else {  // Si la liste contient au moins un élément.
  82.         r = debut;
  83.         while (r != NULL) {
  84.             if (strcmp(prenom, r->prenom) > 0) {  // Si prenom est alphabétiquement plus grand que r->prenom.
  85.                 q = r;
  86.                 r = r->suivant;
  87.             } else if (strcmp(prenom, r->prenom) == 0) {  // Si prenom est égal à r->prenom.
  88.                 r->numtel = numtel;
  89.                 free(p->prenom);  // Libère l'espace mémoire alloué pour le prénom.
  90.                 free(p);  // Libère l'espace mémoire alloué pour le noeud.
  91.                 return;
  92.             } else
  93.                 break;
  94.         }
  95.         if (r == debut)  // Si l'insertion doit avoir lieu au début de la liste.
  96.             debut = p;
  97.         else
  98.             q->suivant = p;
  99.         p->suivant = r;
  100.     }
  101.  
  102. }
  103.  
  104. void effacer_contact() {
  105.  
  106.     char prenom[21];
  107.     NOEUD *q, *r;
  108.  
  109.     printf("\nEntrez le prénom du contact a effacer: ");
  110.     scanf("%s", prenom);
  111.    
  112.     r = debut;
  113.     while (r != NULL) {
  114.         if (strcmp(prenom, r->prenom) != 0) {  // Si prenom est différent à r->prenom.
  115.             q = r;
  116.             r = r->suivant;
  117.         } else
  118.             break;
  119.     }
  120.    
  121.     if (r != NULL) {
  122.         if (r == debut)  // Si le noeud à effacer se trouve au début de la liste.
  123.             debut = r->suivant;
  124.         else // Si le noeud à effacer se trouve au milieu ou à la fin de la liste.
  125.             q->suivant = r->suivant;
  126.         free(r->prenom);  // Libère l'espace mémoire alloué pour le prénom.
  127.         free(r);  // Libère l'espace mémoire alloué pour le noeud.
  128.         printf("\nContact effacé!\n");
  129.     } else
  130.         printf("\nLe contact n'existe pas sur la liste!\n");
  131.    
  132. }
  133.  
  134. void rechercher_contact() {
  135.  
  136.     char c;  // Stocke la première lettre du contact recherché.
  137.     NOEUD *r;
  138.     int aucun_contact;  // Variable booléenne.
  139.  
  140.     printf("\nEntrez la première lettre du contact recherché: ");
  141.     c = getchar();  // Capture la dernière frappe de la touche ENTRER!
  142.     c = getchar();
  143.    
  144.     printf("\n");
  145.     aucun_contact = 1;  // Initialiser à vrai.
  146.     r = debut;
  147.     while (r != NULL) {
  148.         if (c == r->prenom[0]) {  // Si la première lettre de r->prenom est égale a c.
  149.             printf("%-20s  0%ld\n", r->prenom, r->numtel);
  150.             aucun_contact = 0;  // Affecter faux puisqu'il y a au moins un contact.
  151.         }
  152.         r = r->suivant;
  153.     }
  154.    
  155.     if (aucun_contact)
  156.         printf("Aucun contact a pu être trouvé sur la liste!\n");
  157.    
  158. }
  159.  
  160. void imprimer_liste() {
  161.    
  162.     NOEUD *p;
  163.  
  164.     printf("\n");
  165.     p = debut;
  166.     while (p != NULL) {
  167.         printf("%-20s  0%ld\n", p->prenom, p->numtel);
  168.         p = p->suivant;
  169.     }
  170.  
  171. }
  172.  
  173. void effacer_liste() {
  174.  
  175.     NOEUD *p;
  176.  
  177.     while (debut != NULL) {
  178.         p = debut;
  179.         debut = debut->suivant;
  180.         free(p->prenom);  // Libère l'espace mémoire alloué pour le prénom.
  181.         free(p);  // Libère l'espace mémoire alloué pour le noeud.
  182.     }
  183.     printf("\nLa liste de contacts a été effacée de la mémoire :-)\n");
  184.  
  185. }
  186.  
  187. NOEUD *creer_noeud(char *prenom) {
  188.  
  189.     NOEUD *p;  // Pointeur vers un noeud.
  190.     char *q;  // Pointeur vers une chaîne de caractères.
  191.    
  192.     p = (NOEUD *) malloc(sizeof(NOEUD)); // Allocation d'espace mémoire pour un noeud.
  193.     q = (char *) malloc(strlen(prenom) + 1);  // Allocation d'espace mémoire pour prenom.
  194.     if ((p != NULL) && (q != NULL)) {
  195.         strcpy(q, prenom);
  196.         p->prenom = q;
  197.         p->suivant = NULL;
  198.         return p;
  199.     }
  200.     else {
  201.         free(p);
  202.         free(q);
  203.         return NULL;
  204.     }
  205.  
  206. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement