[Estructura de datos - lenguaje C] Queue (Cola)

Tabla de contenido

1. Cola

1.1 El concepto y la estructura de la cola

2. Implementación de la cola

2.1 Interfaz

3. Implementación de la interfaz

3.1 Inicializar la cola

3.2 El final de la cola entra en la cola

analizar:

3.3 Salir de la cola

analizar:

3.4 Obtener el elemento principal de la cola

3.5 Obtener el elemento final de la cola

3.6 Obtener el número de elementos válidos en la cola

3.7 Comprobar si la cola está vacía

3.7.1 Juicio nulo de tipo int

3.7.2 bool tipo nulo

3.8 Destruye la cola

4. Código completo

5. Visualización de efectos


1. Cola

1.1 El concepto y la estructura de la cola

Cola: una tabla lineal especial que solo permite insertar datos en un extremo y eliminar datos en el otro extremo.La cola tiene un FIFO
(primero en entrar, primero en salir) de primero en entrar, primero en salir . El final de la operación de eliminación se denomina cabeza de la cola

2. Implementación de la cola

Las colas también se pueden implementar en la estructura de arreglos y listas enlazadas. Es mejor usar la estructura de listas enlazadas, porque si se usa la estructura de arreglos, la eficiencia de eliminar la cola
y generar datos en la cabecera del arreglo será relativamente bajo. Este artículo es para implementar una cola con una lista enlazada.

2.1 Interfaz

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
// 链式结构:表示队列 
typedef int QDataType;
typedef struct QListNode
{
	struct QListNode* next;
	QDataType data;
}QNode;

// 队列的结构 
typedef struct Queue
{
	QNode* front;
	QNode* rear;
	int size;
}Queue;

// 初始化队列 
void QueueInit(Queue* q);
// 队尾入队列 
void QueuePush(Queue* q, QDataType data);
// 队头出队列 
void QueuePop(Queue* q);
// 获取队列头部元素 
QDataType QueueFront(Queue* q);
// 获取队列队尾元素 
QDataType QueueBack(Queue* q);
// 获取队列中有效元素个数 
int QueueSize(Queue* q);
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Queue* q);
// 销毁队列 
void QueueDestroy(Queue* q);

3. Implementación de la interfaz

3.1 Inicializar la cola

Establecemos tanto el puntero principal como el puntero final en NULL y asignamos el tamaño de la cola a 0.

void QueueInit(Queue* q)
{
	assert(q);

	q->front = NULL;
	q->rear = NULL;	
	q->size = 0;
}

3.2 El final de la cola entra en la cola

void QueuePush(Queue* q, QDataType data)
{
	assert(q);

	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail:");
		return;
	}
	newnode->data = data;
	newnode->next = NULL;

	if (q->rear == NULL)
	{
		assert(q->front == NULL);

		q->front = q->rear = newnode;
	}
	else
	{
		q->rear->next = newnode;
		q->rear = newnode;
	}
	q->size++;
}

analizar:

Implementamos la cola con una lista enlazada, por lo que tenemos que ubicar un nodo newnode cada vez que nos unimos a la cola, y establecer newnode->data = data, newnode->next = NULL.

El siguiente paso es conectar:

Tenemos que considerar si este nodo es el primer nodo de la cola.

1. Si es el primer nodo de la cola, hacemos que los punteros de cabeza y cola apunten a este nodo (q->front = q->rear = newnode);

2. No es el primer nodo de la cola, asignamos el siguiente del puntero de cola a un nuevo nodo (q->rear->next = newnode;), y luego dejamos que el puntero de cola apunte al nuevo nodo (q-> trasero = nuevonodo;) ;

3. Deje que el tamaño ++ de la cola.

3.3 Salir de la cola

void QueuePop(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));

	//1.一个结点
	if (q->front->next == NULL)
	{
		free(q->front);
		q->front = q->rear = NULL;
	}
	else//2.多个结点
	{
		QNode* next = q->front->next;
		free(q->front);
		q->front = next;
	}
	q->size--;
}

analizar:

Al quitar la cola, considere si la cola es un nodo:

1. Solo hay un nodo en la cola. Después de liberar este nodo (free(q->front)), vaciamos los punteros de cabeza y cola (q->front = q->rear = NULL);

2. Hay varios nodos en la cola, luego guardamos el siguiente nodo al principio de la cola (siguiente = q->delantero->siguiente), y luego liberamos el principio de la cola (libre(q->delantero) ), y finalmente deje que el líder del equipo apunte al siguiente nodo del líder del equipo antes de soltar (q->front = siguiente);

3. Finalmente, veamos el tamaño de la cola--.

3.4 Obtener el elemento principal de la cola

Al obtener el elemento principal de la cola, primero debemos juzgar que la cola está vacía. Si la cola está vacía, no hay ningún elemento principal de la cola.

QDataType QueueFront(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));

	return q->front->data;
}

3.5 Obtener el elemento final de la cola

Al buscar elementos al final de la cola, primero debemos juzgar que la cola está vacía. Si la cola está vacía, no hay ningún elemento al final de la cola.

QDataType QueueBack(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));

	return q->rear->data;
}

3.6 Obtener el número de elementos válidos en la cola

Cuando creamos la estructura de la cola, creamos un tamaño variable en ella, que registra específicamente la cantidad de elementos en la cola, por lo que aquí solo necesitamos devolver q-> tamaño. Si la variable de tamaño no está definida, también es posible atravesar la cola y usar un contador para contar el número.

int QueueSize(Queue* q)
{
	assert(q);

	return q->size;
}

3.7 Comprobar si la cola está vacía

3.7.1 interfaz de tipo int

Aquí acordamos que si está vacío, devolverá un valor distinto de cero, y si no está vacío, devolverá 0.

int QueueEmpty(Queue* q)
{
	assert(q);

	if (0 == q->size)
		return 1;
	else
		return 0;
}

3.7.2 interfaz tipo bool

Juzgue directamente si el encabezado de la cola está vacío y si la cola está vacía si el encabezado de la cola está vacío.

bool QueueEmpty(Queue* q)
{
	assert(q);

	return q->front == NULL;
}

3.8 Destruye la cola

Destroy Hemos escrito mucho, así que vayamos directo al grano. Primero liberamos la lista enlazada individualmente. Hay un punto a tener en cuenta aquí. Necesitamos registrar la siguiente posición primero, luego liberar la posición actual y luego pasar la siguiente posición a la posición actual para la iteración. Finalmente, configure los punteros de cabeza y cola en NULL y luego configure el tamaño en 0.

void QueueDestroy(Queue* q)
{
	assert(q);

	QNode* cur = q->front;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	q->front = q->rear = NULL;
	q->size = 0;
}

4. Código completo

El código completo está en el almacén de códigos, entrada: C language: C language learning code, revise más - Gitee.com

5. Visualización de efectos

Supongo que te gusta

Origin blog.csdn.net/Ljy_cx_21_4_3/article/details/130739681
Recomendado
Clasificación