数据结构----链式队列的出队和入队

从头来过-----链式队列的入队和出队

链式结构的队列

特点:除了存在头指针(队头指针)外还增加了尾指针
随着入队和出队 来增加和删除相应的链式结点

队列初始化

队头指针和队尾指针应同时指向头结点
头结点的后继结点指针应为空

入队

使用尾插法 按照链表的尾插法进行插入即可
注意插入结束后 将队尾指针指向新插入的链表结点

出队

使用头删法
队列是一个先进先出FIFO
按照链表的头删法进行删除即可
注意每删除掉一个元素 队头指针都指向后一结点

链式队列判空

当头指针和尾指针指向同一结点时 为空

代码展示

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 

typedef int ElemType;

//20221225 队列的链式存储
//定义一个链表结点的结构体
typedef struct LinkNode {
	ElemType data;//数据域
	struct LinkNode* next;//指向下一个结点的指针
}LinkNode;
//定义一个链式队列的结构体
typedef struct {
	LinkNode* front, * rear;//定义一个队头指针,一个队尾指针
}LinkQueue;
//初始化链式队列
void init_LinkQueue(LinkQueue& q) {
	//需要对队列进行改动 引用
	//链式队列的初始化,需要队头指针和队尾指针指向同一位置
	q.front = q.rear = (LinkNode*)malloc(sizeof(LinkNode));
	q.rear->next = NULL;
}
//入队 链式队列
void en_LinkQueue(LinkQueue &q, ElemType x) {
	//尾插法 
	LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));//申请一个要插入结点的空间
	s->data = x;//数据域赋值
	s->next = q.rear->next;//将尾指针的后继结点指针 给要插入元素的后继结点指针
	q.rear->next = s;//队列的尾指针的后继结点指针指向要插入元素
	q.rear = s;//队尾指针指向新插入的元素
}
//链式队列判空
bool LinkQueue_isEmpty(LinkQueue q) {
	if (q.front == q.rear) {
		return true;
	}
	return false;
}
//出队 FIFO
void out_LinkQueue(LinkQueue& q) {
	//头删法
	q.front = q.front->next;//头结点没有元素 从第一个结点开始
	while (!LinkQueue_isEmpty(q)) {
		//链式队列为空时,则不需要输出数据
		printf("%2d", q.front->data);
		q.front = q.front->next;//输出数据后将对头指针指向下一结点
		if (q.front->next == NULL) {
			//如果队头指针指向的结点没有后继结点 则队尾指针指向队头指针
			q.rear = q.front;
			printf("%2d", q.front->data);
		}
	
	}
	printf("\n");
}

int main() {
//20221224 队列的链式存储
	
	LinkQueue q;//创建一个链式队列
	init_LinkQueue(q);//初始化链式队列
	en_LinkQueue(q, 3);//入队
	en_LinkQueue(q, 4);
	en_LinkQueue(q, 5);
	en_LinkQueue(q, 6);
	out_LinkQueue(q);//出队
	return 0;
}

结果展示

数据结构----链式队列的出队和入队_第1张图片

你可能感兴趣的:(从头来过,数据结构,链表)