begin process at 2012 05 27 19:05:59
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > LISTE DOUBLEMENT CHAÎNÉE (PHP5)

LISTE DOUBLEMENT CHAÎNÉE (PHP5)


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :liste, circulaire, doublement, chaînée Niveau :Expert Date de création :11/07/2004 Date de mise à jour :12/03/2006 00:58:36 Vu / téléchargé :10 064 / 219

Auteur : GRenard

Ecrire un message privé
Site perso
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

 Description

Voici une liste doublement chaînée basée sur un code C++ que j'ai écrit.
Elle permet d'inscrire des variables dans une liste créée dynamiquement en mémoire.
Normalement, toutes les fonctions des classes possèdent des templates (afin de contenir n'importe quel type que cela soit (int, double, string...)), mais en PHP, il n'est pas nécessaire de faire cela car tout est déjà fait automatiquement.
Notez qu'il y a beaucoup de passage par référence ! car on ne doit pas faire de copie mais passer des pointeurs. Cette notion est plus visible en C++ qu'en PHP.
Vous pouvez aussi remarquer le === qui compare 2 classes en PHP.

Normalement, le code est surchargé d'opérateur du style
+= -> addNode()
++ -> nextCurrent()
-- -> prevCurrent()
() -> getCurrent()

Mais PHP ne permet pas encore ces fonctionnalités.


Compatible PHP5 seulement.

Source

  • <?php
  • // node.php
  • class TNode {
  • public $nextPtr; // Node *
  • public $prevPtr; // Node *
  • public $currentPtr; // Value
  • function __construct($value) {
  • $this->prevPtr = NULL;
  • $this->nextPtr = NULL;
  • $this->currentPtr = $value;
  • }
  • function __destruct() {
  • $this->currentPtr = NULL;
  • }
  • };
  • ?>
  • <?php
  • // list.php
  • include_once "node.php";
  • class TList {
  • private $currentPtr; // TNode
  • function __construct() {
  • $this->currentPtr = NULL;
  • }
  • function __destruct() {
  • $this->DeleteAll();
  • }
  • /**
  • * @return bool
  • * @desc Deletes all Nodes
  • */
  • public function DeleteAll() {
  • if( !$this->isEmpty() ) {
  • // We remove Circular loop
  • $this->currentPtr->prevPtr->nextPtr = NULL;
  • // We crate a temp
  • $tempPtr = NULL;
  • while( $this->currentPtr !== NULL ) {
  • // We save the actual position
  • $tempPtr = $this->currentPtr;
  • // We move our current
  • $this->currentPtr = $this->currentPtr->nextPtr;
  • // We delete the space before current
  • $tempPtr = NULL;
  • }
  • // Reseting Variable
  • $this->currentPtr = NULL;
  • return true;
  • } else {
  • return false;
  • }
  • }
  • /**
  • * @return bool
  • * @desc Removes current Node
  • */
  • public function RemoveNode() {
  • if( !$this->isEmpty() ) {
  • // If the list contains only 1 node
  • if( $this->currentPtr->nextPtr === $this->currentPtr) { // === comparing object classes
  • $this->currentPtr = NULL;
  • } else {
  • $tempPtr = NULL;
  • $this->currentPtr->prevPtr->nextPtr = $this->currentPtr->nextPtr;
  • $this->currentPtr->nextPtr->prevPtr = $this->currentPtr->prevPtr;
  • $tempPtr = $this->currentPtr;
  • $this->currentPtr = $this->currentPtr->nextPtr;
  • $tempPtr = NULL;
  • }
  • return true;
  • }
  • return false;
  • }
  • /**
  • * @return bool
  • * @desc Returns true if the list is empty
  • */
  • private function isEmpty() {
  • return ($this->currentPtr === NULL);
  • }
  • /**
  • * @return TNode *
  • * @param mixed $value
  • * @desc Return Pointer to newly allocated node
  • */
  • public function getNewNode($value) {
  • $ptr = new TNode($value);
  • return $ptr;
  • }
  • /**
  • * @return void
  • * @param mixed $value
  • * @desc Add Node with value
  • */
  • public function addNode($value) {
  • $newPtr = $this->getNewNode($value);
  • // We have to case : Empty list, Non Empty List
  • if( $this->isEmpty() ) {
  • $newPtr->prevPtr = $newPtr;
  • $newPtr->nextPtr = $newPtr;
  • } else {
  • $newPtr->nextPtr = $this->currentPtr->nextPtr;
  • $newPtr->prevPtr = $this->currentPtr;
  • $this->currentPtr->nextPtr = $newPtr;
  • $newPtr->nextPtr->prevPtr = $newPtr;
  • }
  • $this->currentPtr = $newPtr;
  • }
  • /**
  • * @return bool
  • * @desc Move current to the next position
  • */
  • public function nextCurrent() {
  • if( !$this->isEmpty() ) {
  • $this->currentPtr = $this->currentPtr->nextPtr;
  • return true;
  • } else {
  • return false;
  • }
  • }
  • /**
  • * @return bool
  • * @desc Move current to the prev position
  • */
  • public function prevCurrent(){
  • if( !$this->isEmpty() ) {
  • $this->currentPtr = $this->currentPtr->prevPtr;
  • return true;
  • } else {
  • return false;
  • }
  • }
  • /**
  • * @return mixed
  • * @desc Return the value hosted by Node
  • */
  • public function &getCurrent() {
  • if( !$this->isEmpty() ) {
  • return $this->currentPtr->currentPtr;
  • } else {
  • return NULL;
  • }
  • }
  • };
  • ?>
  • <?php
  • // example.php
  • // Normally, all functions are templated. But in PHP,
  • // it is already templated.
  • include_once "list.php";
  • $a = new TList;
  • $a->addNode(20); // Add 20
  • $a->addNode(30); // Add 30
  • $a->addNode(40); // Add 40
  • $a->addNode(50); // Add 50
  • $a->addNode(100); // Add 100
  • $a->prevCurrent(); // Select Previous (50)
  • $a->RemoveNode(); // Remove Current (50). 100 is Selected
  • $a->nextCurrent(); // Select Next (20)
  • $a->nextCurrent(); // Select Next (30)
  • $a->addNode(35); // Add 35 (next to 30)
  • $a->nextCurrent(); // Select 40
  • echo $a->getCurrent(); // Return 40
  • ?>
<?php
// node.php
class TNode {
	public $nextPtr;		// Node *
	public $prevPtr;		// Node *
	public $currentPtr;		// Value

	function __construct($value) {
		$this->prevPtr = NULL;
		$this->nextPtr = NULL;
		$this->currentPtr = $value;
	}

	function __destruct() {
		$this->currentPtr = NULL;
	}
};
?>

<?php
// list.php
include_once "node.php";

class TList {
	private $currentPtr;	// TNode

	function __construct() {
		$this->currentPtr = NULL;
	}

	function __destruct() {
		$this->DeleteAll();
	}

	/**
	 * @return bool
	 * @desc Deletes all Nodes
	*/
	public function DeleteAll() {
		if( !$this->isEmpty() ) {
			// We remove Circular loop
			$this->currentPtr->prevPtr->nextPtr = NULL;

			// We crate a temp
			$tempPtr = NULL;
			while( $this->currentPtr !== NULL ) {
				// We save the actual position
				$tempPtr = $this->currentPtr;
				// We move our current
				$this->currentPtr = $this->currentPtr->nextPtr;
				// We delete the space before current
				$tempPtr = NULL;
			}
			// Reseting Variable
			$this->currentPtr = NULL;
			return true;
		} else {
			return false;
		}
	}

	/**
	 * @return bool
	 * @desc Removes current Node
	*/
	public function RemoveNode() {
		if( !$this->isEmpty() ) {
			// If the list contains only 1 node
			if( $this->currentPtr->nextPtr === $this->currentPtr) { // === comparing object classes
				$this->currentPtr = NULL;
			} else {
				$tempPtr = NULL;
				$this->currentPtr->prevPtr->nextPtr = $this->currentPtr->nextPtr;
				$this->currentPtr->nextPtr->prevPtr = $this->currentPtr->prevPtr;
				$tempPtr = $this->currentPtr;
				$this->currentPtr = $this->currentPtr->nextPtr;
				$tempPtr = NULL;
			}
			return true;
		}
		return false;
	}

	/**
	 * @return bool
	 * @desc Returns true if the list is empty
	*/
	private function isEmpty() {
		return ($this->currentPtr === NULL);
	}

	/**
	 * @return TNode *
	 * @param mixed $value
	 * @desc Return Pointer to newly allocated node
	*/
	public function getNewNode($value) {
		$ptr = new TNode($value);
		return $ptr;
	}

	/**
	 * @return void
	 * @param mixed $value
	 * @desc Add Node with value
	*/
	public function addNode($value) {
		$newPtr = $this->getNewNode($value);

		// We have to case : Empty list, Non Empty List
		if( $this->isEmpty() ) {
			$newPtr->prevPtr = $newPtr;
			$newPtr->nextPtr = $newPtr;
		} else {
			$newPtr->nextPtr = $this->currentPtr->nextPtr;
			$newPtr->prevPtr = $this->currentPtr;
			$this->currentPtr->nextPtr = $newPtr;
			$newPtr->nextPtr->prevPtr = $newPtr;
		}
		$this->currentPtr = $newPtr;
	}

	/**
	 * @return bool
	 * @desc Move current to the next position
	*/
	public function nextCurrent() {
		if( !$this->isEmpty() ) {
			$this->currentPtr = $this->currentPtr->nextPtr;
			return true;
		} else {
			return false;
		}
	}

	/**
	 * @return bool
	 * @desc Move current to the prev position
	*/
	public function prevCurrent(){
		if( !$this->isEmpty() ) {
			$this->currentPtr = $this->currentPtr->prevPtr;
			return true;
		} else {
			return false;
		}
	}

	/**
	 * @return mixed
	 * @desc Return the value hosted by Node
	*/
	public function &getCurrent() {
		if( !$this->isEmpty() ) {
			return $this->currentPtr->currentPtr;
		} else {
			return NULL;
		}
	}
};
?>

<?php
// example.php
// Normally, all functions are templated. But in PHP,
// it is already templated.

include_once "list.php";
$a = new TList;
$a->addNode(20);	// Add 20
$a->addNode(30);	// Add 30
$a->addNode(40);	// Add 40
$a->addNode(50);	// Add 50
$a->addNode(100);	// Add 100
$a->prevCurrent();	// Select Previous (50)
$a->RemoveNode();	// Remove Current (50). 100 is Selected
$a->nextCurrent();	// Select Next (20)
$a->nextCurrent();	// Select Next (30)
$a->addNode(35);	// Add 35 (next to 30)
$a->nextCurrent();	// Select 40
echo $a->getCurrent();	// Return 40
?>

 Conclusion

Pourquoi une class Node ? Car cela permet de rendre le code plus modulaire, ainsi s'il y a une modification à faire sur les valeurs à enregistrer, nous modifieront la class Node. Si nous devons modifier une fonction de la liste, il nous sera inutile de toucher à la class Node.

 Fichier Zip

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

Télécharger le zip


 Historique

11 juillet 2004 18:14:45 :
Le .zip ne s'est pas envoyé ??
12 mars 2006 00:58:36 :
Ajout Mot clé Correction PHP5

 Sources du même auteur

Source avec Zip Source avec une capture LECTURE/ÉCRITURE DE TAGS ID3 VERSION 1 ET VERSION 2
Source avec Zip GÉRER LES ÉCHAPPEMENTS DE CARACTÈRES SUR TABLEAUX MULTIDIMEN...
Source avec Zip Source avec une capture PROJECT SELECTOR (SÉLECTION FACILE DE PROJET AVEC APACHE) ET...
Source avec Zip Source avec une capture STATISTIQUES DE VOTRE PROJET (NOMBRE DE DOSSIERS, FICHIERS, ...
Source avec Zip Source avec une capture AFFICHAGE TABLEAU AVEC TEMPLATE CLASSE

 Sources de la même categorie

Source avec Zip GÉNÉRATION AUTOMATIQUE DE FICHIER .CLASS.PHP EN FONCTION D'U... par ig3
CLASSE D'OBJET DE CRYPTAGE ET DÉCRYPTAGE DE CHAINES DE CARAC... par 8Tnerolf8
Source avec Zip MY.DEVIANTART API par inwebo
CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter

 Sources en rapport avec celle ci

DIFFÉRENCE ENTRE DEUX DATE EN JOURS (LISTE RÉCUPÉRÉE DANS UN... par DevilTN
SEARCH QUERY COMPOSER par Centauriel
Source avec Zip Source avec une capture RECHERCHE ET LISTE par liptibilly
Source avec Zip LISTER LES TERMES RECHERCHÉS DANS GOOGLE OU YAHOO POUR ARRIV... par inc002
GÉNÉRATEUR DE LISTE DÉROULANTE par caviar

Commentaires et avis

Commentaire de tryskehl le 13/07/2004 10:59:58

Merci pour le script.
Juste une question:
Php prend en compte le destructeur? J'ai fais un script qui ne détruit pas la chaine après utilisation. Je sais que ca n'est pas rigoureux mais je voulais savoir si elle se détruisait toute seule au bout d'un moment (lorsque le client quitte le serveur).

Commentaire de GRenard le 13/07/2004 16:54:40

Elle se détruit à la fin du script automatiquement si tu ne le fais pas dans le destructeur.
Mais en C++, les choses créées dynamiquement ne le sont pas toujours, cela dépend du compilateur parfois.

Commentaire de tryskehl le 14/07/2004 07:56:59

Ok, merci pour ton aide.

Commentaire de malalam le 20/03/2006 13:54:55 administrateur CS

Hello,

je n'avais pas vu ce code.
Je ne l'ai pas testé (mais je le ferai, manque de temps là), mais c'est très joli. Et cela peut-être très utile. Bref, c'est une bonne idée, les Tlist manquent à php :-)

Commentaire de FhX le 13/04/2006 01:22:02

Les Itérateurs ne peuvent pas te permettre de faire la même chose ?

Commentaire de GRenard le 13/04/2006 03:19:19

Les itérateurs de PHP? ArrayObject et tout le kit ?
Je n'avais jamais vu moi même... c'est surement assez nouveau. Peut être qu'il y a la même chose, je vois des fonctions similaires.

Commentaire de kryz0gen le 09/11/2011 00:33:49 10/10

Code très lisible et élégant.Beau boulot.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Liste chaînée en PHP ... please help!! [ par tryskehl ] Salut,Je voulais savoir si en PHP on pouvait créer des listes chaînées. Je sais que lZon a accès aux classes et aux pointeurs mais je nZarrive pas à f Espace liste déroulante... [ par rigaudstar ] Bonjour à tous,J'ai créé une page php avec une liste déroulante qui puise des informations (ici des noms et prénoms)dans une base access...Mon problèm pb avec une liste... [ par sepul ] Et oui au secours ! nan j'ai un pb avec une liste. En effet, je dispose d'une liste et lorsque que l'on clic sur un élément je dois recupérer l'élémen php + javascript + liste deroulante [ par ansdodou ] Salut à tous Je suis parvenu à faire afficher le contenu d'une de mes tables dans controle liste mais je ne parvient pas à récupérer les enregistremen formulaire [ par plume83 ] bonjour, j'ai créé un formulaire dans lequel j'ai mis une liste déroulante dans laquelle je veux faire afficher la référence des chaussures de la base chgt de variables via liste dynamique [NON-RESOLU] [ par yomgui_95 ] lu tlm , :)donc l objectif est de faire changer sur la meme page le nom des modeles en fonction de l'annee choisie dans la liste deroulante... j ai co sauvegarder le choix d'un menu déroulant [ par jenjen ] bonjour,j'ai des pages qui contiennent toutes le même menu que j'appelle avec un include, ce menu contient une liste déroulante sans bouton de validat Liste des sessions [ par CyberP ] Y a-t-il une fonction qui permet de faire la liste de toutes les sessions ouvertes et une pour pouvoir accéder à une variable d'une session précise (d php, frame et header [ par matmonroe ] Bonjour,Je suis en stage d'info pour mes études et je rencontre un pb.J'ai une page html (générée par php) divisé en trois frames:-------------------- listes déroulantes liées [ par jenjen ] bonjour, je souhaite lier 2 listes déroulantes, ma première liste contient le nom de certaines tables que j'ai extrait de ma base de données et la sec


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,530 sec (3)

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