Utilice una lista enlazada individualmente con punteros de cabeza y cola para implementar operaciones relacionadas con la cola

Prólogo: Antes de leer este blog, lea las operaciones relacionadas con la tabla de secuencia de mi blog anterior . El contenido puede ayudarlo a comprender mejor este blog.

Implementación de la cola

Aquí utilizo una lista enlazada individualmente con punteros de cabeza y cola para simular la función de la cola. Este método es más conveniente. Las operaciones de entrada y salida de la lista enlazada individualmente se pueden implementar mediante la inserción de cola y la eliminación de encabezado (o encabezado inserción y eliminación de cola) de la lista enlazada individualmente. Primero observe la definición de estructura de nodos y colas:


typedef int Qdatatype;

//结点
typedef struct Qnode {
    
    
	Qdatatype data;             
	struct Qnode* next;
}Qnode;

//队列
typedef struct Queue {
    
    
	
	//头尾指针
	struct Qnode*head;
	struct Qnode*tail;

}Queue;

Inicialización: crea un nuevo nodo

Inicialización: crear una cola vacía
Crear un nuevo nodo: definir los datos que se insertarán como una forma de nodo de "struct Qnode"

//初始化
void Init(Queue* q)
{
    
    
	if (q == NULL)
		return;
	q->head = q->tail = NULL;

}



//创建新结点
struct Qnode* creatnode(Qdatatype val)
{
    
    
	struct Qnode* node = (struct Qnode*)malloc(sizeof(struct Qnode));
	node->data = val;
	node->next = NULL;
	return node;
}

Inserción de fin de cola

El nodo final de la lista enlazada individualmente se inserta como el final de la cola. Dado que definimos el nodo final, la complejidad de tiempo de esta operación es O (1). Operación real: si la cola existe y está vacía, los punteros de cabeza y cola apuntan al nuevo nodo al mismo tiempo; si la cola no está vacía, el siguiente puntero del puntero de cola apunta al nuevo nodo y luego a la cola. se actualiza el puntero.

//入队-插入
void Queuepush(Queue* q,Qdatatype val)
{
    
    
	if (q == NULL)
		return;
	// 尾插
	struct Qnode*node = creatnode(val);
	if (q->head == NULL)
		q->head = q->tail = node;
	else
	{
    
    
		q->tail->next = node;
		q->tail = node;
	}
}

Captura de pantalla de depuración del módulo:
Inserte la descripción de la imagen aquí
coloque 1, 2, 3, 4 y 5 en el equipo por turnos. Elementos válidos de la cola: 1 2 3 4 5

Eliminar de la cola-encabezado

Con respecto al nodo principal de la lista enlazada individualmente como el jefe del equipo para la operación de desconexión, la complejidad de tiempo es O (1). Operación específica: actualice el puntero de la cabeza a la siguiente posición del nodo de la cabeza original inferior y suelte el nodo de la cabeza original al mismo tiempo. Aquí debe prestar atención a la función de las dos últimas líneas de código: si el par tiene solo un elemento válido, los punteros de cabeza y cola apuntan a la misma posición. Una vez que el puntero de cabeza se actualiza y se suelta, el puntero de cola se convierte en un puntero salvaje y debe procesarse aquí.

//出队-头删
void Queuepop(Queue* q)
{
    
    
	if (q == NULL||q->head==NULL)
		return;
	//头删
	struct Qnode* next = q->head->next;
	free(q->head); 
	q->head = next;
	//若该队列只有一个结点,尾指针需要置空
	if (q->head == NULL)
		q->tail = NULL;
}

Captura de pantalla de depuración del módulo: se Inserte la descripción de la imagen aquí
realizan tres operaciones de eliminación de la cola en la cola original (1 2 3 4 5), los elementos efectivos de la cola: 4 5

Obtenga el elemento cabeza / cola del equipo

Devuelve directamente el elemento de datos al que apunta el puntero principal o el puntero final, pero es necesario juzgar la legitimidad de la cola antes de llamar a estas dos funciones.


//获取队首元素
Qdatatype Queuefront(Queue* q)
{
    
    
	return q->head->data;
}

//队尾元素
Qdatatype Queueback(Queue* q)
{
    
    
	return q->tail->data;
}

Determinar si la cola está vacía

Si la cola está vacía, devuelve 1;
si la cola no está vacía, devuelve 0.

//判断队列是否为空
int Queueempty(Queue* q)
{
    
    
	if (q->head == NULL)
		return 1;
	else
		return 0;
}

Visualización de código completa

//队列

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>


typedef int Qdatatype;
typedef struct Qnode {
    
    
	Qdatatype data;
	struct Qnode* next;
}Qnode;

typedef struct Queue {
    
    
	
	//头尾指针
	struct Qnode*head;
	struct Qnode*tail;

}Queue;


//初始化
void Init(Queue* q)
{
    
    
	if (q == NULL)
		return;
	q->head = q->tail = NULL;

}

//创建新结点
struct Qnode* creatnode(Qdatatype val)
{
    
    
	struct Qnode* node = (struct Qnode*)malloc(sizeof(struct Qnode));
	node->data = val;
	node->next = NULL;
	return node;
}

//入队-尾插
void Queuepush(Queue* q,Qdatatype val)
{
    
    
	if (q == NULL)
		return;
	// 尾插
	struct Qnode*node = creatnode(val);
	if (q->head == NULL)
		q->head = q->tail = node;
	else
	{
    
    
		q->tail->next = node;
		q->tail = node;
	}
}

//出队-头删
void Queuepop(Queue* q)
{
    
    
	if (q == NULL||q->head==NULL)
		return;
	//头删
	struct Qnode* next = q->head->next;
	free(q->head); 
	q->head = next;
	//若该队列只有一个结点,尾指针需要置空
	if (q->head == NULL)
		q->tail = NULL;
}

//获取队首元素
Qdatatype Queuefront(Queue* q)
{
    
    
	return q->head->data;
}

//队尾元素
Qdatatype Queueback(Queue* q)
{
    
    
	return q->tail->data;
}

//判断队列是否为空
int Queueempty(Queue* q)
{
    
    
	if (q->head == NULL)
		return 1;
	else
		return 0;
}

void test()
{
    
    
	Queue q;
	Init(&q);
	Queuepush(&q, 1);
	Queuepush(&q, 2);
	Queuepush(&q, 3);
	Queuepush(&q, 4);
	Queuepush(&q, 5);
	Queuepush(&q, 6);
	Queuepush(&q, 7);
	Queuepush(&q, 8);

	while (!Queueempty(&q))
	{
    
    
		printf("%d ", Queuefront(&q));
		Queuepop(&q);
	}
	printf("\n");

}
int main()
{
    
    
	test();
	return 0;
}

resultado de la operación:Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_43962381/article/details/111851472
Recomendado
Clasificación