La lista de doble vinculados
categoría Computadoras y software / Programación / C
Las listas enlazadas pueden ser muy útiles, por una serie de razones - a pesar de que tienen un poco de tiempo para envolver su mente alrededor del concepto. ¿Que es peor? La lista de doble enlace.
En lugar de simplemente enlace directo a la siguiente estructura, una Lista de doble vinculados también enlaces hacia atrás a la estructura anterior.
El código siguiente muestra un programa interactivo, doble ligado lista. Es masiva. Compárelo con el código de lista enlazada en este libro para ver los pasos adicionales adoptadas para mantener los dos punteros delantero y trasero dentro de la estructura.
/ * Un DOBLE interactivo programa de lista enlazada * // * Dan Gookin, A partir de programación con C para Dummies * / #include #include #include estructura típica {int valor struct típico * de nueva estructura típica * anterior -} - estructura típica * típico típico menú de primera struct * corriente struct * nuevo-int (void) -void añadir (void) muestran -void (void) -void eliminar (void) volcado -void (void) -struct típica * crear (void) - / * La función principal trabaja con entrada only.Everything más está manejado por una función * / int main () {int elección = ' 0' - / * obtener el bucle while para girar * / primera = NULL-tiempo (elección! = 'Q') {opción = menú () - interruptor (elección) {case 'S': show () - break-caso "A": add () - romper caso 'R': delete () - desglose caso 'D': dump () - romper caso 'Q': romper-default: Rotura -}} return (0) -} / * Mostrar el menú principal y cobrar entrada * / menú int (void) {int CH- printf ("S) cómo, A) dd, R) etire, D) ump, Q) uit:") -CH = getchar () -, mientras que (getchar () = ' n') / * eliminar el exceso de entrada *! / -Retorno (toupper (ch)) -} / * Añadir un elemento al final de la lista enlazada * / void add (void) {if (primera == NULL) / * Caso especial para el primer artículo * / {primero = create () - actual = primera current-> anterior = null-} else / * encontrar el último elemento * / {actual = primer tiempo (current-> siguiente) / * último elemento == NULL * / actual = actual -> siguiente = crean nuevos () - current-> siguiente = new - / * enlace de actualización * / nuevo-> anterior = intensidad de corriente = recién} printf ("Escriba un valor:") -scanf ("% d ", current-> valor) -current-> siguiente = NULL-tiempo (getchar () = ' n') / * eliminar el exceso de entrada * / -} / * Mostrar todas las estructuras en la lista enlazada * / void espectáculo ( void) {int count = 1-si (primera == NULL) / * esta lista está vacía * / {puts ("No hay nada que mostrar") - Regresar-} puts ("Mostrando todos los archivos:") - actual = primera while (actual) / * último registro == NULL * / {printf ("Record% d:% d n", cuenta, current-> valor) -actual = current-> próxima recuento ++ -}} / * Retirar un registro de la lista * / void delete (void) {int r, c-si (primera == NULL) / * comprobar la lista vacía * / {puts ("No hay registros para eliminar") - retornables} puts ("Elija un registro para eliminar: ") - show () - printf (" Record ") -scanf ("% d ", r) -mientras (getchar ()! = ' n') / * eliminar el exceso de entrada * / - c = 1-actual = primera while (! c = r) {if (== actual NULL) / * asegurar que "r" está en rango * / {puts ("Record not found") - Regresar-} actual = current-> próxima-c ++ -} if (current-> == anterior NULL) / * Caso especial para el primer registro * / {primera = current-> próxima primera> anterior = null-} else / * Punto récord anterior en siguiente * / {current-> next-> anterior = current-> anterior-current-> previa-> siguiente = current-> next-} printf ("Record% d eliminado. n", r) exento (actual) - / * Memoria liberación * /} / * referencias de puntero Pantalla en la lista enlazada * // * Copiado en su mayoría de la función show () * / void volcado (void) {int count = 1-si (primera == NULL) / * esta lista está vacía * / {puts ("Nada para volcar") - retornables} puts ("referencias de puntero") - actual = primer printf ("Record # tPrevious hactual TAv.pág n") -, mientras que ( actual) / * último registro == NULL * / {printf ("Record% d: t% p t% p t% p n", cuenta, current-> anterior, actual, current-> siguiente) - actual = current-> próxima recuento ++ -}} / * Construir una estructura vacía y regresar su dirección * / struct típica * crear (void) {struct típica * aa = malloc (* estructura típica) (sizeof (struct típico)) - si (a == NULL) {puts ("Algún tipo de malloc () error") - la salida (1) -} return (a) -}