begin process at 2012 05 27 13:53:22
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > BIBLIOTHÈQUE DE GESTION DES PILES DYNAMIQUES EN C

BIBLIOTHÈQUE DE GESTION DES PILES DYNAMIQUES EN C


 Information sur la source

Note :
Aucune note
Catégorie :Divers Classé sous :piles, pile, stack, lifo, langage c Niveau :Débutant Date de création :07/05/2007 Date de mise à jour :07/10/2007 00:19:53 Vu / téléchargé :6 560 / 321

Auteur : Sunglasses

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note


 Description

(Plus de détails sur mon site : http://perso.orange.fr/beorn/progra_c/pile_dynamiq ue.html )

Les fichiers pile.c et pile.h forment une bibliotheque permettant de gérer des piles dynamiques.

Le type utilisé pour les piles est "pile_t".
La pile est dite dynamique car de nouveaux tableaux sont alloués pour le stockage des éléments au fur et à mesure des besoins. La pile possède donc un nombre d'éléments théoriquement illimité.

Les différentes fonctions sont :
- vide : vaut 1 si la pile est vide, 0 sinon
- init : alloue une pile en mémoire (le paramètre de cette fonction est la taille d'allocation des tableaux/sections de la pile) et renvoie son adresse
- empile : permet d'empiler un nouvel élément sur la pile
- depile : dépile le dernier élément rajouté (renvoie 1 si la pile est vide, 0 sinon)
- supprime : libère tout l'espace mémoire utilisé par une pile

Plus de précisions dans les commentaires... :-)

Vous trouverez dans le .zip un petit main.c utilisant la bibliothèque et faisant deux ou trois manipulations élémentaires...
Pour ceux qui utilisent Dev-C++, vous avez même le fichier .dev correspondant.


Source

  • pile.h :
  • #ifndef _pile_h_
  • #define _pile_h_
  • #include <stdlib.h>
  • typedef int variant; /* remplacer int par le type de donnees a empiler */
  • /*---------------- STRUCTURES DE PILE.C --------------------------------------------*/
  • /*
  • Structure :
  • Nom : section
  • Fct : structure definissant une section d'elements de type "variant"
  • */
  • typedef struct section
  • {
  • variant * tab; /* tableau representant la section proprement dite */
  • struct section * suiv; /* pointeur sur la section suivante */
  • struct section * prec; /* pointeur sur la section precedente */
  • } section_t;
  • /*
  • Structure :
  • Nom : pile
  • Fct : structure definissant une pile d'elements de type "variant"
  • */
  • typedef struct pile
  • {
  • int n; /* nombre d'elements presents dans la pile moins un */
  • int pas; /* nombre d'elements dans une section de pile */
  • section_t * tete; /* pointeur de tete de la pile */
  • section_t * sect; /* pointeur sur la dernière section ajoutée */
  • } pile_t;
  • /*---------------- FONCTIONS DE PILE.C ---------------------------------------------*/
  • /*
  • Nom : vide
  • Fct : retourne un booleen indiquant si la pile est vide
  • Entree : (p) adresse de la pile
  • Sortie : booleen indiquant que la pile est vide
  • */
  • unsigned short int vide(pile_t * p);
  • /*
  • Nom : init
  • Fct : cree une nouvelle pile et retourne son adresse
  • Entree : (maxi) nombre maximal d'elements de la pile
  • Sortie : adresse de la nouvelle pile
  • */
  • pile_t * init(int pas);
  • /*
  • Nom : empile
  • Fct : empile un nouvel element sur la pile
  • Entree : (p) adresse de la pile
  • (x) element a rajouter
  • */
  • void empile(pile_t * p, variant x);
  • /*
  • Nom : depile
  • Fct : depile un element de la pile et renvoie un booleen indiquant que tout s'est bien passe
  • Entree : (p) adresse de la pile
  • (x) adresse de stockage de l'element depile
  • Sortie : booleen indiquant que tout s'est bien passe
  • */
  • unsigned short int depile(pile_t * p, variant * x);
  • /*
  • Nom : supprime
  • Fct : libère toute la mémoire occupée par une pile
  • Entree : (p) adresse de la pile
  • */
  • void supprime(pile_t * p);
  • #endif
  • pile.c :
  • #include "pile.h"
  • /*
  • Nom : vide
  • Fct : retourne un booleen indiquant si la pile est vide
  • Entree : (p) adresse de la pile
  • Sortie : booleen indiquant que la pile est vide
  • */
  • unsigned short int vide(pile_t * p)
  • {
  • return ((p->n) == -1); /* la pile est vide si n = -1 */
  • }
  • /*
  • Nom : init
  • Fct : cree une nouvelle pile et retourne son adresse
  • Entree : (pas) nombre d'elements d'une section de la pile
  • Sortie : adresse de la nouvelle pile
  • */
  • pile_t * init(int pas)
  • {
  • pile_t * adr_pile = NULL; /* l'adresse de la pile est NULL si l'allocation echoue */
  • adr_pile = (pile_t *)malloc(sizeof(pile_t)); /* adresse de la pile cree */
  • if ( adr_pile )
  • {
  • adr_pile->n = -1; /* nombre d'elements presents (aucun) */
  • adr_pile->pas = pas; /* nombre d'elements par section */
  • adr_pile->tete = NULL; /* la pile est vide */
  • adr_pile->sect = NULL; /* la pile est vide */
  • }
  • return adr_pile;
  • }
  • /*
  • Nom : empile
  • Fct : empile un nouvel element sur la pile
  • Entree : (p) adresse de la pile
  • (x) element a rajouter
  • */
  • void empile(pile_t * p, variant x)
  • {
  • if ( vide(p) ) /* si la pile est vide */
  • {
  • p->tete = (section_t *)malloc(sizeof(section_t)); /* creation d'une premiere section */
  • p->sect = p->tete;
  • p->sect->tab = (variant *)malloc((p->pas) * sizeof(variant)); /* allocation de la nouvelle section */
  • p->sect->suiv = NULL; /* pas de section suivante */
  • p->sect->prec = NULL; /* pas de section precedente */
  • }
  • else
  • {
  • if (!((p->n + 1) % (p->pas))) /* si la section est pleine */
  • {
  • p->sect->suiv = (section_t *)malloc(sizeof(section_t)); /* rajout d'une nouvelle section */
  • p->sect->suiv->prec = p->sect; /* maj section precedente */
  • p->sect = p->sect->suiv; /* maj derniere section */
  • p->sect->tab = (variant *)malloc((p->pas) * sizeof(variant)); /* allocation de la nouvelle section */
  • p->sect->suiv = NULL; /* pas de section suivante */
  • }
  • }
  • p->n = p->n + 1; /* incrementation du nombre d'elements */
  • *(p->sect->tab + (p->n) % (p->pas)) = x; /* rajout du nouvel element sur la pile */
  • }
  • /*
  • Nom : depile
  • Fct : depile un element de la pile et renvoie un booleen indiquant que tout s'est bien passe
  • Entree : (p) adresse de la pile
  • (x) adresse de stockage de l'element depile
  • Sortie : booleen indiquant que tout s'est bien passe
  • */
  • unsigned short int depile(pile_t * p, variant * x)
  • {
  • unsigned short int succes = 0;
  • if ( !vide(p) )
  • {
  • *x = *(p->sect->tab + (p->n) % (p->pas)); /* sortie du dernier element rajoute */
  • p->n = p->n - 1; /* decrementation du nombre d'elements */
  • if (!((p->n + 1) % (p->pas))) /* si la section est vide */
  • {
  • if ( p->sect->prec != NULL ) /* s'il y a au moins une section */
  • {
  • p->sect = p->sect->prec; /* mise a jour de la derniere section */
  • free(p->sect->suiv); /* liberation de la derniere section */
  • p->sect->suiv = NULL; /* pas d'element suivant sur la derniere section */
  • }
  • else
  • {
  • free(p->tete); /* liberation de la section */
  • p->sect = NULL; /* raz du pointeur de derniere section */
  • }
  • }
  • succes = 1; /* marquage de la reussite */
  • }
  • return succes;
  • }
  • /*
  • Nom : supprime
  • Fct : libère toute la mémoire occupée par une pile
  • Entree : (p) adresse de la pile
  • */
  • void supprime(pile_t * p)
  • {
  • section_t * cour = p->tete, * suiv;
  • if ( cour != NULL ) /* s'il existe au moins une section */
  • {
  • suiv = p->tete->suiv;
  • while ( cour != NULL ) /* tant qu'il reste des sections non supprimees */
  • {
  • suiv = cour->suiv; /* progression du pointeur suivant */
  • free(cour->tab); /* liberation du contenu de la section courante */
  • free(cour); /* liberation de la section courante */
  • cour = suiv; /* progression du pointeur courant */
  • }
  • }
  • free(p); /* liberation de la structure pile */
  • }
pile.h :

#ifndef _pile_h_
#define _pile_h_

#include <stdlib.h>

typedef int variant; /* remplacer int par le type de donnees a empiler */

/*---------------- STRUCTURES DE PILE.C --------------------------------------------*/

/*
  Structure :
  Nom  :  section
  Fct  :  structure definissant une section d'elements de type "variant"
*/

typedef struct section
{
  variant * tab;     /* tableau representant la section proprement dite */
  struct section * suiv;  /* pointeur sur la section suivante */
  struct section * prec;  /* pointeur sur la section precedente */
} section_t;

/*
  Structure :
  Nom  :  pile
  Fct  :  structure definissant une pile d'elements de type "variant"
*/

typedef struct pile
{
  int n;             /* nombre d'elements presents dans la pile moins un */
  int pas;           /* nombre d'elements dans une section de pile */
  section_t * tete;  /* pointeur de tete de la pile */
  section_t * sect;  /* pointeur sur la dernière section ajoutée */
} pile_t;


/*---------------- FONCTIONS DE PILE.C ---------------------------------------------*/

/*
  Nom  :  vide
  Fct  :  retourne un booleen indiquant si la pile est vide
  Entree  :  (p) adresse de la pile
  Sortie  :  booleen indiquant que la pile est vide
*/

unsigned short int vide(pile_t * p);

/*
  Nom  :  init
  Fct  :  cree une nouvelle pile et retourne son adresse
  Entree  :  (maxi) nombre maximal d'elements de la pile
  Sortie  :  adresse de la nouvelle pile
*/

pile_t * init(int pas);

/*
  Nom  :  empile
  Fct  :  empile un nouvel element sur la pile
  Entree  :  (p) adresse de la pile
             (x) element a rajouter
*/

void empile(pile_t * p, variant x);

/*
  Nom  :  depile
  Fct  :  depile un element de la pile et renvoie un booleen indiquant que tout s'est bien passe
  Entree  :  (p) adresse de la pile
             (x) adresse de stockage de l'element depile
  Sortie  :  booleen indiquant que tout s'est bien passe
*/

unsigned short int depile(pile_t * p, variant * x);

/*
Nom  :  supprime
Fct  :  libère toute la mémoire occupée par une pile
Entree  :  (p) adresse de la pile
*/

void supprime(pile_t * p);

#endif



pile.c :

#include "pile.h"

/*
  Nom  :  vide
  Fct  :  retourne un booleen indiquant si la pile est vide
  Entree  :  (p) adresse de la pile
  Sortie  :  booleen indiquant que la pile est vide
*/

unsigned short int vide(pile_t * p)
{
  return ((p->n) == -1); /* la pile est vide si n = -1 */
}

/*
  Nom  :  init
  Fct  :  cree une nouvelle pile et retourne son adresse
  Entree  :  (pas) nombre d'elements d'une section de la pile
  Sortie  :  adresse de la nouvelle pile
*/

pile_t * init(int pas)
{
  pile_t * adr_pile = NULL; /* l'adresse de la pile est NULL si l'allocation echoue */
  
  adr_pile = (pile_t *)malloc(sizeof(pile_t)); /* adresse de la pile cree */
  if ( adr_pile )
  {
    adr_pile->n = -1;       /* nombre d'elements presents (aucun) */
    adr_pile->pas = pas;    /* nombre d'elements par section */
    adr_pile->tete = NULL;  /* la pile est vide */
    adr_pile->sect = NULL;  /* la pile est vide */
  }
  
  return adr_pile;
}

/*
  Nom  :  empile
  Fct  :  empile un nouvel element sur la pile
  Entree  :  (p) adresse de la pile
             (x) element a rajouter
*/

void empile(pile_t * p, variant x)
{
  if ( vide(p) )  /* si la pile est vide */
  {
    p->tete = (section_t *)malloc(sizeof(section_t));              /* creation d'une premiere section */
    p->sect = p->tete;
    p->sect->tab = (variant *)malloc((p->pas) * sizeof(variant));  /* allocation de la nouvelle section */
    p->sect->suiv = NULL;                                          /* pas de section suivante */
    p->sect->prec = NULL;                                          /* pas de section precedente */
  }
  else
  {
    if (!((p->n + 1) % (p->pas)))  /* si la section est pleine */
    {
      p->sect->suiv = (section_t *)malloc(sizeof(section_t));        /* rajout d'une nouvelle section */
      p->sect->suiv->prec = p->sect;                                 /* maj section precedente */
      p->sect = p->sect->suiv;                                       /* maj derniere section */
      p->sect->tab = (variant *)malloc((p->pas) * sizeof(variant));  /* allocation de la nouvelle section */
      p->sect->suiv = NULL;                                          /* pas de section suivante */
    }
  }
  p->n = p->n + 1;                          /* incrementation du nombre d'elements */
  *(p->sect->tab + (p->n) % (p->pas)) = x;  /* rajout du nouvel element sur la pile */
}

/*
  Nom  :  depile
  Fct  :  depile un element de la pile et renvoie un booleen indiquant que tout s'est bien passe
  Entree  :  (p) adresse de la pile
             (x) adresse de stockage de l'element depile
  Sortie  :  booleen indiquant que tout s'est bien passe
*/

unsigned short int depile(pile_t * p, variant * x)
{
  unsigned short int succes = 0;
  
  if ( !vide(p) )
    {
      *x = *(p->sect->tab + (p->n) % (p->pas)); /* sortie du dernier element rajoute */
      p->n = p->n - 1;  /* decrementation du nombre d'elements */
      if (!((p->n + 1) % (p->pas)))  /* si la section est vide */
      {
        if ( p->sect->prec != NULL )  /* s'il y a au moins une section */
        {
          p->sect = p->sect->prec;  /* mise a jour de la derniere section */
          free(p->sect->suiv);      /* liberation de la derniere section */
          p->sect->suiv = NULL;     /* pas d'element suivant sur la derniere section */
        }
        else
        {
          free(p->tete);  /* liberation de la section */
          p->sect = NULL; /* raz du pointeur de derniere section */
        }
      }
      succes = 1;  /* marquage de la reussite */
    }
  return succes;
}

/*
Nom  :  supprime
Fct  :  libère toute la mémoire occupée par une pile
Entree  :  (p) adresse de la pile
*/

void supprime(pile_t * p)
{
  section_t * cour = p->tete, * suiv;
  if ( cour != NULL )  /* s'il existe au moins une section */
  {
    suiv = p->tete->suiv;
    while ( cour != NULL )  /* tant qu'il reste des sections non supprimees */
    {
      suiv = cour->suiv;  /* progression du pointeur suivant */
      free(cour->tab);    /* liberation du contenu de la section courante */
      free(cour);         /* liberation de la section courante */
      cour = suiv;        /* progression du pointeur courant */
    }
  }
  free(p);  /* liberation de la structure pile */
}


 Conclusion

C'est je pense la version finale de mon code.

L'originalité ici est que lorsque la pile est pleine, on alloue un nouveau tableau : plus de limitation en taille !

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   pile dynamique

Télécharger le zip


 Historique

08 mai 2007 14:47:01 :
Modification mineure
07 août 2007 22:01:41 :
Correction d'un bug dans la fonction de suppression
07 août 2007 22:19:07 :
Orthographe
10 août 2007 12:13:53 :
modifications mineures
13 août 2007 00:02:00 :
modification mineure
07 octobre 2007 00:19:53 :
+ lien

 Sources du même auteur

Source avec Zip Source avec une capture VISUALISEUR RVB AVEC QT
Source avec Zip TEMPLATE DE VECTEUR AVEC TIRAGE ALEATOIRE (C++)
Source avec Zip BIBLIOTHÈQUE DE GESTION DE FILES DYNAMIQUES
Source avec Zip BIBLIOTHÈQUE DE GESTION DE FILES STATIQUES
Source avec Zip BIBLIOTHÈQUE DE GESTION DE MATRICES EN C

 Sources de la même categorie

Source avec Zip KISIEL CD INFO DRIVE par kisiel0147852
Source avec une capture SUPPRESSION DES REDONDANCES DE FICHIERS par cyberntique
Source avec Zip ÉDITEUR DE RECTANGLES EN CONSOLE par seoseo
CONVERSION DE FICHIER EN FICHIER BMP par seoseo
Source avec Zip DETECTEUR EJP par idpro

 Sources en rapport avec celle ci

Source avec une capture STACK WATCHER par lilxam7
Source avec Zip BIBLIOTHÈQUE DE GESTION DES PILES STATIQUES EN C par Sunglasses
Source avec Zip Source avec une capture RÉSOLUTION DE LABYRINTHE AVEC PILE par damned3
GESTION D'UNE PILE PAR LES CLASSES par UKR6900
Source avec Zip VSTACK ( EFFET DE PILE ) / TEMPLATE par NitRic

Commentaires et avis

Aucun commentaire pour le moment.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Utilisation de stack en C++ [ par jagdjg ] J essaie de faire un stack mais ca ne marche pas La declaration est : Stack* pile = new Stack();le push : pile-&gt;Push(strPile);le pop : strPile = pi [C] Généricité et cast automatique. [ par LocalStone ] Salut, Alors voilà ... Je me posais la question suivante : existe-t-il un moyen en C de gérer la généricité de manière transparente ? Je m'explique .. stack et char * [ par yuriashford ] Salut &#224; tous je developpe actuellement une application qui utilise une stack de STL&nbsp; la stack est une declar&#233; : stack&lt;char *&gt; pil Pile de double [ par Pof ] Bonjour ! voil&#224; j'ai un petit probl&#232;me avec les std::stack :std::stack&lt;double&gt; stack;stack.push(20);stack.push(10);[...]double a = sta aide pour calcul de formule [ par snakers07 ] bonjour, j'ai crée un programme permettant de calculer une formule utilisant les opérateurs +,-,*,/ avec un controle sur les parenthése:par exemple :( trier d'une liste chainee en utilisant 2 piles [ par bella086 ] bsr voila j'ai un petit bon disant grand pblm sur c++ je dois charger une pile p1 a partir dune liste chainee et puis trier la pile p1 a laide d'une Erreur : la variable a besoin du frame de pile [ par clavat ] Bonjour a tous ! je fait mon programme tout fonctionne il compile il fonctionne...je le modifie quelque peut et la il compile toujours mais ne fonctio stack overflow [ par ssana83 ] Bonjour, j'ai réalisé un programme de création d'un arbre donc j'ai utilisé une fonction récursive. J'ai essayé le programme ça marche sauf avec certa Augmenter la taille d'une pile [ par ssana83 ] Bonsoir, comment je peux augmenter la taille d'une pile en visual c++ pour éviter le problème de débordement de pile. Merci. distribuer des cartes [ par korin221 ] Bonjour! Je réaliser un jeux de UNO en C. J'ai réaliser un pile dynamique ( utiliser pour les cartes ) Je voudrais savoir si cette méthode est utile ?


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,842 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales