La representación encadenada de una lista lineal: una explicación detallada de la lista enlazada

(1) Lista individualmente vinculada

(1) Definición

La estructura de almacenamiento en cadena de la tabla lineal es la lista enlazada, que se caracteriza por utilizar un grupo de unidades de almacenamiento arbitrarias para almacenar los elementos de datos de la tabla lineal.Las unidades de almacenamiento en este grupo de memoria pueden ser continuas o discontinuas. Las listas vinculadas, como su nombre indica, están vinculadas por varios nodos. La información del nodo incluye el campo de datos y el campo de puntero . El campo de datos almacena información del elemento y el campo de puntero se usa para almacenar la dirección del nodo sucesor inmediato (la flecha entre dos nodos). N nodos están vinculados en una lista vinculada, y cada nodo de elemento tiene solo un campo de puntero, que también se denomina lista vinculada individualmente .

(2) Representación esquemática

Usamos las cuatro letras inglesas (A, B, C, D) como los cuatro nodos del campo de datos. El campo de datos de cada nodo almacena el elemento (letra), y el campo de puntero también almacena la dirección de la siguiente letra. Cada nodo también tiene una dirección dedicada en la memoria, es decir, la dirección de almacenamiento.
Desde la lista enlazada que se va a almacenar se inicia el puntero principal . El puntero principal también es un nodo de elemento, pero no almacena elementos de datos, solo la dirección del primer nodo de elemento. Al mismo tiempo, el último elemento D no tiene un elemento sucesor directo, por lo que el campo de puntero está vacío y asignamos NULL. El diagrama esquemático se muestra en la siguiente figura:

Puntero de cabeza
20
Dirección de almacenamiento Campo de datos Campo de puntero
29 B 46
4 D NULO
20 A 29
46 C 4

1. Primero encuentre la dirección 20 del primer elemento del puntero principal. Encontramos la dirección y atravesamos la letra A. Al mismo tiempo, el nodo de la letra A registra la dirección 29 del nodo B, por lo que encontramos la dirección 29 y atravesar para obtener la letra B.… Continuar de esta manera, cuando se encuentra la letra D, el recorrido de la lista enlazada se termina porque su campo de puntero es NULL. De esta forma, podemos obtener gradualmente las cuatro letras ABCD.

2. Este proceso se puede comparar con el juego de encontrar tesoros. Un mapa del tesoro solo puede registrar la ubicación de un tesoro. Si eres un hombre de negocios (secretamente complacido) con el primer mapa del tesoro (puntero principal / nodo principal), entonces sigues la guía del mapa del tesoro y llegas al primer tesoro Bebé A (campo de datos) cueva 20 (campo de puntero) y sáquelo. En este punto, te sorprende descubrir que este tesoro también registra el lugar del tesoro del tesoro (B) (29), así que sin más preámbulos, corriste inmediatamente a la Cueva 29 ... Cuando encontraste el tesoro D, no había el siguiente arriba. Dirección del bebé. Entonces, obtuvimos un total de cuatro tesoros ABCD (nada mal).

Convierta los cuatro nodos de elementos en diagramas lineales:
Inserte la descripción de la imagen aquí
Diagrama:
1. L es el nodo principal (puntero principal), el campo del puntero registra la dirección del elemento A y el campo de datos no registra el elemento. Es equivalente a L tiene una flecha hacia A
2. En realidad, ABCD no es continuo en la memoria, por lo que solo se debe registrar la dirección del siguiente nodo, lo que puede ahorrar espacio en la memoria en la mayor medida posible.

(3) Realización del programa

El contenido básico de algunas listas vinculadas se mencionó anteriormente, entonces, ¿cómo es la implementación real del programa? Tomemos el lenguaje C ++ como ejemplo para implementar el código de programa clave de la lista vinculada.

3.1 Definición de nodo

Un nodo de lista vinculado necesita un campo de puntero en el campo de datos, así que primero defina una estructura.

typedef int ElemType
typedef struct LNode
{
    
    
	ElemType data;//数据域
	LNode* next;//下一个节点地址 指针域
}LNode,*LList;
  1. Tipo de estructura LNode Al mismo tiempo, definimos el puntero de LNode como LList para evitar la necesidad de LList * a, * b al declarar punteros más tarde. Más engorroso.
  2. los datos registran el elemento de datos, luego registra la dirección del siguiente nodo

3.2 La creación de la lista vinculada

void ListCreate(LList& L, ElemType n, ElemType a[])
{
    
    
	LList p;
	L = new LNode; L->next = NULL;//头节点
	for (int i = 0; i < n; i++)
	{
    
    
		//头插法 1.
		p = new LNode;//声明新的一个节点,用来记录新的元素
		p->data = a[i];//将该元素赋值到指针域
		p->next = L->next;//2.
		L->next = p;//3.

	}
}
  1. La operación de inserción de los elementos de la lista enlazada se divide en la interpolación de la cabeza y la interpolación de la cola. La interpolación de la cabeza consiste en insertar después del nodo principal y antes del primer nodo. Este método invierte la secuencia de elementos. El método de interpolación de cola es insertar después del último nodo de la lista vinculada, que puede mantener la secuencia original de la secuencia original sin cambios.
  2. Asigne el sucesor del nodo recién creado a la dirección del primer nodo, y el nodo principal registrará la dirección del primer nodo, por lo que debe usar p-> siguiente = L-> siguiente;
  3. La dirección de nodo se asigna al nodo principal, es decir, el nuevo nodo se toma como primer nodo en el método de interpolación principal.

3.3 salida transversal de la lista enlazada

El programa realiza el recorrido de la lista enlazada y, al mismo tiempo, envía la salida más simple a la consola para cada elemento atravesado. Los lectores pueden intentar ejecutar el programa manualmente, lo que hará que la comprensión sea más profunda.

void Print(LList L)
{
    
    
	LList p = L->next;//L表示头节点,无数据元素,故先让p指向第一个节点
	while (p)//当p不是NULL时 执行循环
	{
    
    
		cout << p->data << " ";
		p = p->next;//指向下一节点
	}
		cout << endl;
}

3.4 Eliminar elementos duplicados de la lista vinculada

Para aquellos de nosotros que tenemos algún conocimiento de las listas enlazadas, podemos intentar resolver problemas de palabras.
Problema: Elimine los elementos repetidos de la lista enlazada Suponiendo que hay una lista lineal (4,3,3,1,1,1), se convierte en una lista lineal (4,3,1) después del recorrido del algoritmo.
Análisis: para eliminar elementos duplicados, puede recorrer la lista vinculada original y declarar que dos punteros p, q, p apuntan al nodo atravesado anterior (puede estar listo para ser eliminado) y q apunta al nodo actual. Si el elemento del campo de datos es el mismo que su elemento predecesor inmediato, apuntamos p al sucesor de q (porque q se eliminará), y eliminamos el nodo q al mismo tiempo.
La complejidad del tiempo se puede controlar en O (n) y no es necesario solicitar espacio de memoria adicional. El
código se implementa como:

bool ListDelete(LList& L)
{
    
    
	LList p,q; p = L->next;
	LList r;//记录删除节点
	if (p == NULL)return false;//空表
	else if (p->next == NULL)return true;//一个节点
	else 
	{
    
    
		while (p->next)//P的后继存在
		{
    
    
			q = p->next;//暂存p后继
			if (q->data == p->data)
			{
    
    
				p->next = q->next;
				delete(q);
			}
			else 
				p = p->next;
		}
	}
	return true;
}

(2) Lista enlazada circular

Características

  1. La lista enlazada circular es otra forma de estructura de almacenamiento en cadena, que se caracteriza porque el campo de puntero del último nodo de la lista enlazada ya no es NULL, sino que apunta al nodo principal L. Toda la lista enlazada forma un anillo cerrado. Por tanto, partiendo de cualquier nodo de la tabla, se pueden encontrar otros nodos.
  2. La lista enlazada individualmente del dominio de operación básica es básicamente la misma La diferencia es que la condición de bucle en el algoritmo no es si p es NULL, sino si p es lo mismo que el puntero principal.

(Tres) lista doblemente enlazada

(1) Características

  1. En la lista vinculada que discutimos anteriormente, todos los nodos tienen solo un campo de puntero que apunta al sucesor inmediato, por lo que comenzar desde un cierto nodo solo puede hacer que el puntero se mueva gradualmente hacia atrás para atravesar otros nodos. Si desea encontrar el predecesor de un nodo, debe comenzar desde el nodo principal.
  2. Como su nombre lo indica, al definir el tipo de nodo, también necesitamos agregar un miembro de estructura, es decir, un puntero al predecesor inmediato. Por tanto, un nodo tiene dos campos de puntero. Supere las deficiencias de la orientación de forma de cadena unidireccional.

(2) Definición de nodo

Es similar a una lista enlazada individualmente, excepto que hay un puntero precursor más.

typedef int ElemType
typedef struct DuLNode
{
    
    
	ElemType data;//数据域
	DuLNode* next;//下一个节点地址 指针域
	DuLNode* prior;//前一个节点的地址
}DuLNode,*DuList;

(4) Resumen

  1. La tabla lineal contiene una tabla secuencial (matriz) y una lista vinculada, que es la estructura de datos más utilizada y más simple . La tabla de secuencia es la estructura de almacenamiento secuencial de la tabla lineal, es decir, una matriz dinámica.
  2. Las listas enlazadas se dividen en listas enlazadas individualmente, listas enlazadas doblemente, listas enlazadas circulares y otras estructuras. La ventaja es que no desperdicia espacio de memoria, es más conveniente insertar nodos y no necesita mover elementos como una tabla de secuencia, pero obtener el nodo correspondiente no puede depender de un índice como una tabla de secuencia, sino que debe use el puntero de la cabeza para moverse gradualmente hacia atrás para obtenerlo.
  3. La tabla de secuencia expresa la relación lógica entre los elementos de datos en la tabla lineal por "ubicación física" adyacente a los elementos en la computadora. La lista vinculada no requiere que los elementos lógicamente adyacentes también sean adyacentes en la ubicación física, por lo que se pierde la ventaja de la selección aleatoria en la lista de secuencias.

(5) Referencias

[1] Yan Weimin, Wu Weimin. Estructura de datos (versión en lenguaje C). Beijing: Tsinghua University Press, 1997.

说明:该文是小白第一次写的blog,错误在所难免,同时受限于知识水平与写作能力,敬请大家批评指正!

Supongo que te gusta

Origin blog.csdn.net/ln_acmc/article/details/115028259
Recomendado
Clasificación