Cómo usar la interpolación de cola para construir una lista de doble enlace (lenguaje C, acíclico)

Cómo usar la interpolación de cola para crear una lista doblemente vinculada

De hecho, originalmente quería completar la lista rápida de la lista enlazada dada por el equipo de Wang, pero después de que terminé el establecimiento de la lista de doble enlace, eran las 12 en punto, y tenía que levantarme temprano QAQ mañana. Estaba muerto.

Uno, ¿por qué tienes una lista doblemente vinculada?

Permítanme hablar de que una sola cadena de
lista única, siempre

 

 

Una de sus estructuras de nodo es

[Campo de elemento | siguiente campo de puntero]

Cada vez que se utiliza el método posterior a la inserción para establecer una lista vinculada individualmente, el campo del puntero en el nodo anterior apuntará al siguiente nodo, como el primer nodo en la figura anterior (el nodo donde se encuentra el elemento e1, el nodo sombreado azul es El nodo principal) apunta el campo del puntero al siguiente nodo

Y así sucesivamente

Podemos obtener una lista vinculada vinculada por punteros, que se llama una sola lista vinculada

Podemos ver que si tengo un campo de puntero de un nodo donde se encuentra un elemento, puedo insertar fácilmente el nodo alrededor del nodo donde se encuentra el elemento

Pero! ! ! Si quiero interpolar antes del elemento anterior de este elemento, tengo que recorrer la tabla nuevamente desde el principio, lo cual es una pérdida de tiempo (es decir, no puedo dar la vuelta mientras conduzco en una sola línea)

Así que presentamos la lista doblemente vinculada

Segundo, el establecimiento de listas doblemente vinculadas.

 

La longitud de la lista de doble enlace es la siguiente

 

 

 

 

 Una de sus estructuras de nodo es

[Campo de puntero anterior | campo de elemento | campo de puntero siguiente]

La lista enlazada doble tiene un "campo de puntero anterior" más que la lista enlazada simple anterior. Anterior es una aguja que apunta al nodo anterior, y la siguiente es la misma que la lista enlazada simple anterior para apuntar a un puntero de nodo en la parte posterior

De vuelta a la pregunta anterior

Si tenemos que insertar previamente el elemento antes de un elemento, será mucho más rápido usar la lista de doble enlace

Como ya no necesitamos recorrer toda la tabla desde el principio, la dirección del nodo anterior se almacena en cada nodo de la lista de doble enlace

Solo necesitamos mover el puntero hacia adelante para completar (¡una línea se convierte en una línea discontinua de doble línea! Puede dar la vuelta en cualquier momento)

Estos son los pasos sobre cómo crear una lista doblemente vinculada

 

 

1. La definición del tipo de nodo de la lista doblemente vinculada

1 typedef struct DNode {
 2      int datos;
3      struct DNode * anterior, * siguiente;
4 } DNode, * DLinkList;

Se define un campo de elemento (el tipo int que uso aquí, que se puede reemplazar) y dos campos de puntero * anterior y * siguiente, que se utilizan para apuntar al nodo anterior y al siguiente nodo del nodo respectivamente

 

2. Establecimiento de una lista doblemente vinculada

 

1 DLinkList DList_Create (DLinkList & D)
 2  {
 3      int num;
 4      scanf ( " % d " , & num);
 5      D = (DNode *) malloc ( sizeof (DNode)); // define el nodo principal 
6      DNode * S, * P = D; // S es para ser insertado un puntero al nodo 
7.      p-> Siguiente = NULL;
 . 8      al mismo tiempo - (! NUM = . 1 ) // parada de entrada -1 
. 9      {
 10          S = (DNode *) malloc ( sizeof (DNode));// Aplicar espacio para que se inserte
          s 11 s-> data = num;
 12          s-> next = p-> next; // s next copia el siguiente campo del nodo anterior p 
13          p-> next = s; // El siguiente punto del nodo anterior p apunta a s 
14          s-> anterior = p; // La prioridad de s apunta al nodo anterior p 
15          p = p-> siguiente; // El puntero se mueve hacia atrás en 
16          scanf ( " % d " , & num); // El valor del siguiente elemento 
17      }
 18      return D;
 19 }

 

 

Los pasos en while son los siguientes

s = (DNode *) malloc ( sizeof (DNode)); // Aplica espacio para que se inserte la s

 

s-> next = p-> next; // El siguiente campo de s copia el siguiente campo del nodo anterior p

 

 

 

p-> next = s; // siguiente punto del nodo anterior p apunta a s

 

 

 

s-> prior = p; // prioridad de s apunta al nodo anterior p

 

p = p-> siguiente; // el puntero p retrocede un bit

 

 Ahora tengo 1,22 y moriré de repente si no vuelvo a dormir.

Jeje

 

Supongo que te gusta

Origin www.cnblogs.com/luoyoucode/p/12677428.html
Recomendado
Clasificación