La liste double liée

Les listes chaînées peuvent être très utiles, pour un certain nombre de raisons - mais ils prennent un certain temps pour envelopper votre esprit autour de la notion. Ce qui est pire? La liste doublement liée.

Plutôt que de simplement créer un lien avec impatience la prochaine structure, un liste doublement liée aussi des liens vers l'arrière à la structure précédente.

Le code suivant montre un programme interactif, double liste chaînée. Il est massif. Comparez-le avec le code de liste liée dans ce livre de voir les mesures supplémentaires prises pour maintenir les deux pointeurs avant et arrière au sein de la structure.


/ * Programme de liste chaînée Un DOUBLE interactive * // * Dan Gookin, Commencer à programmer en C For Dummies * / # include #include #include struct typique {int valeur-struct typique * prochaine struct typique * précédente -} - struct typique * première structure typique * courant struct typique * nouveau menu-int (void) -void ajouter (void) montrent -void (void) -void supprimer (void) dépotoir -void (void) -struct typique * créer (void) - / * La fonction principale fonctionne avec entrée only.Everything le reste est géré par une fonction * / int main () {int choix = ' 0' - / * obtenir la boucle while pour tourner * / première = NULL-tout (choix! = 'Q') {choix = menu () - interrupteur (choix) {case 'S': show () - briser cas 'A': ajouter () - briser cas «R»: supprimer () - percée cas 'D': dump () - briser cas 'Q': briser par défaut: pause -}} return (0) -} / * Afficher le menu principal et de recueillir des contributions * / menu int (void) {int CH- printf ("S) comment, A) dd, R) emove, D) ump, Q) uit:") CH = getchar () - tout (getchar () = ' n') / * supprimer entrée excès *! / -retour (toupper (ch)) -} / * Ajouter un élément à la fin de la liste chaînée * / add void (void) {if (première == NULL) / * Cas particulier pour le premier article * / {premier = create () - courant = première current-> = null-précédente} else / * Trouver le dernier élément * / {current = premier temps (current-> suivante) / * dernier élément == NULL * / courant = courant -> la prochaine nouvelles = create () - current-> suivante = new - / * lien de mise à jour * / New-> précédente = courant-courant = nouveau-} printf ("Tapez une valeur:") -scanf ("% d ", current-> valeur) -current-> prochain = NULL-tout (getchar () = ' n') / * retirer entrée excès * / -!} / * Afficher toutes les structures dans la liste chaînée * / spectacle void ( void) {int count = 1-si (première == NULL) / * cette liste est vide * / {puts ("Rien à voir") - Retour-} puts ("Afficher tous les records:") - courant = Prénom while (actuelle) / * dernier enregistrement == NULL * / {printf ("Record% d:% d n", comte, current-> valeur) -current = current-> prochain comptage ++ -}} / * Suppression d'un enregistrement de la liste * / vide delete (void) {int r, c-si (première == NULL) / * vérifier liste vide * / {puts ("No records to Remove") - Retour-} puts ("Choisissez un record pour enlever: ") - show () - printf (" Record: ") -scanf ("% d ", r) -Pendant (getchar ()! = ' n') / * supprimer entrée excès * / - c = 1 = courant du premier tout (! c = r) {if (== actuelle NULL) / * veiller à ce que «r» est à portée * / {puts ("Record not found") - Retour-} courant = current-> next-c ++ -} if (current-> == précédente NULL) / * Cas particulier pour premier enregistrement * / {première = current-> prochaine Prénom> = null-précédente} else / * Point précédent record à prochaine * / {current-> Suivant-> précédente = current-> précédente-current-> Précédent-> next = current-> Next-} printf ("Record% d retiré. n", r) exempt (actuelle) - / * Mémoire de libération * /} / * pointeur référence d'affichage dans la liste chaînée * // * Copié principalement de la fonction show () * / dump (void) {int count = 1-si (première == NULL) / * cette liste est vide * / {puts ("Rien à dump") - Retour-} puts ("références Pointer") - courant = première printf ("Fiche n tprevious Tcurrent tnext n") - alors que ( actuelle) / * dernier enregistrement == NULL * / {printf ("Record% d: t% p t% p t% p n", comte, current-> précédente, actuelle, current-> suivante) - courant = current-> prochain comptage ++ -}} / * Construire une structure vide et retourne son adresse * / struct typique * créer (void) {struct typique * aa = (* struct typique) malloc (sizeof (struct typique)) - si (a == NULL) {puts ("Une sorte de malloc () Erreur") - sortie (1) -} return (a) -}

» » » » La liste double liée