Main Page | File List | Globals

table.c

Go to the documentation of this file.
00001 
00010 #include"table.h"
00011 #include<stdlib.h>
00012 #include<stdio.h>
00013 #include<string.h>
00014 #include"erreur.h"
00015 
00016 /*Implementation de la table par liste chainee,
00017  la liste chainee a une cellule vide en tete.
00018 */
00019 
00020 /* La structure pour chaque cellule de la liste */
00021 struct TABLE{
00022   /* Le nom du symbole */
00023   const char* symbole;
00025   int valeur;
00026   /* Pointeur sur la cellule suivante */
00027   table_t suivant;
00028 };
00029 
00030 /* Insere une nouvelle cellule en tete de la liste next et
00031    retourne l'adresse de la nouvelle cellule de tete */
00032 
00033 static table_t nouvelle_cellule(table_t next, const char* s, int val){
00034   table_t n=(table_t) malloc(sizeof(struct TABLE));
00035   n->symbole=s;
00036   n->valeur=val;
00037   n->suivant=next;
00038   return n;
00039 }
00040 
00041 table_t init_table(){
00042   /* On cree la cellule de tete */
00043   return nouvelle_cellule(NULL, NULL, 0);
00044 }
00045 
00046 void free_table(table_t t){
00047   table_t tmp;
00048   if(!t) return;
00049   while( (tmp=t->suivant) ){
00050     if(tmp->symbole) free((char*)tmp->symbole);
00051     t->suivant=tmp->suivant;
00052     free(tmp);
00053   }
00054   free(t);
00055 }
00056 
00057 int find(const table_t t, const char* s, int *val){
00058   table_t tmp;
00059   /* On part de la deuxieme cellule */
00060   for(tmp=t->suivant; tmp!=NULL; tmp=tmp->suivant)
00061     if(strcmp(tmp->symbole,s)==0){
00062       *val = tmp->valeur;
00063       return 1;
00064     }
00065   num_erreur=E_NOT_FOUND;
00066   return 0;
00067 }
00068 
00069 int add_symbole(table_t t, const char* s, int val){
00070   int x;
00071   char *symb;
00072   /* Si s existe deja dans la table, il y a erreur */
00073   if( find(t, s, &x)){
00074     num_erreur= E_EXISTS;
00075     return 0;
00076   }
00077   /* Sinon, on en fait une copie pour le stocker*/
00078   symb=(char*) malloc(1+strlen(s));
00079   strcpy(symb,s);
00080   /* On insere en tete de la table, c'est-a-dire juste apres la cellule de tete */
00081   t->suivant= nouvelle_cellule(t->suivant, symb, val);
00082   return 1;
00083 }
00084 
00085 void print_table(const table_t t){
00086   table_t tmp;
00087   printf("_______________\n");
00088   /* On part de la deuxieme cellule */
00089   for(tmp=t->suivant; tmp!=NULL; tmp=tmp->suivant)
00090     printf("|  %s  |%7d|\n",tmp->symbole, tmp->valeur);
00091   printf("¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\n");
00092 }

Generated on Mon Nov 10 16:02:57 2008 for Calculette by  doxygen 1.3.9.1