首页 > 其他分享 >以链表为基础实现链式队列

以链表为基础实现链式队列

时间:2024-04-26 21:44:30浏览次数:30  
标签:LinkQue Head return 队列 结点 next 链表 链式

以链表为基础实现链式队列

如果打算以链表作为基础来实现队列的操作,可以避免内存浪费以及避免内存成片移动,只需要确定队头和队尾即可,一般把链表头部作为队头,可以实现头删,把链表尾部作为队尾,可以实现尾插。

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

//对输入类型进行重新定义
typedef int DataType_t;

//构建链表结构体
typedef struct Linkedqueue
{
	DataType_t data;
	struct Linkedqueue* next;

}LinkQue;


//创建一个空链表,空链表应该有一个头结点,对链表进行初始化
LinkQue* LinkQue_Create(void)
{
	//1.创建一个头结点并对头结点申请内存
	LinkQue* Head = (LinkQue*)calloc(1, sizeof(LinkQue));
	if (NULL == Head)
	{
		perror("Calloc memory for Head is Failed");
		exit(-1);
	}

	//2.对头结点进行初始化,头结点是不存储有效内容的!!!
	Head->next = NULL;

	//3.把头结点的地址返回即可
	return Head;
}


//创建新的结点,并对新结点进行初始化(数据域 + 指针域)
LinkQue* LinkQue_NewNode(DataType_t data)
{
	//1.创建一个新结点并对新结点申请内存
	LinkQue* New = (LinkQue*)calloc(1, sizeof(LinkQue));
	if (NULL == New)
	{
		perror("Calloc memory for NewNode is Failed");
		return NULL;
	}

	//2.对新结点的数据域和指针域进行初始化
	New->data = data;
	New->next = NULL;

	return New;
}




//入队

bool LinkQue_Enqueue(LinkQue* Head, DataType_t data)
{
	//1、创建新的节点,并对新节点进行初始化
	LinkQue* New = LinkQue_NewNode(data);
	if (NULL == New)
	{
		printf("can not insert new node\n");
		return false;
	}

	//2.判断链表是否为空,如果为空,则直接插入即可
	if (NULL == Head->next)
	{
		Head->next = New;
		return true;
	}

	//3.如果链表为非空,则把新结点插入到链表的尾部
	LinkQue* Current = Head->next;
	while (NULL != Current->next)
	{
		Current = Current->next;
	}
	Current->next = New;
	return true;
}



//出队
bool LinkQue_Dequeue(LinkQue* Head)
{
	//1.判断链表是否为空,如果为空,则直接插入即可
	if (NULL == Head->next)
	{
		perror("can not delete because list is empty\n");
		return false;
	}
	else
	{
		//2.判断链表不为空,找出第一个数据
		LinkQue* Current = Head->next;
		Head->next = (Head->next)->next;
		printf("出队值为%d\n", Current->data);
		free(Current);
		return true;
	}

}


//遍历队列
void LinkQue_Print(LinkQue* Head)
{
	//对链表的头文件的地址进行备份
	LinkQue* Phead = Head->next;

	//首结点
	while (Head->next)
	{

		//输出头结点的直接后继的数据域
		printf("data = %d\n", Phead->data);
		//把头的直接后继作为新的头结点
		Phead = Phead->next;


	}
}


int main(int argc, char const* argv[])
{
	//创建头节点
	LinkQue* Head = LinkQue_Create();

	//入队
	LinkQue_Enqueue(Head, 5);

	//出队
	LinkQue_Dequeue(Head);


	//遍历打印
	LinkQue_Print(Head);
	return 0;
}


标签:LinkQue,Head,return,队列,结点,next,链表,链式
From: https://www.cnblogs.com/banon/p/18160930

相关文章

  • 双向循环链表
    双向循链表双向循环链表我是在双向循环链表上进行升级,就是双向循环链表首结点和尾结点相链接,首结点的prev链接尾结点本身,尾结点的next链接首结点本身,在对头部或者尾部操作的时候与双向链表有区别,具体代码写在下面。希望看完代码的你发现错误,请评论批评指正,非常感谢。目录双......
  • 数据结构——链式栈
    二、链式栈构造链式栈//链式栈的有效数据类型,用户可以根据需要进行修改typedefintDataType_t;//构造单链式栈的结点typedefstructLinkedStack{DataType_tdata;//结点的数据域structLinkedStack*next;//结点的的指针域}LinStack_t......
  • 自定义单链表队列的基本接口函数(非循环队列)
    单链表构建队列的接口函数/********************************************************************文件名称: 单链表构建队列的接口函数文件作者:[email protected]创建日期:2024/04/26文件功能:对单链表循环队列的增删改查功能的定义注意事项:NoneCop......
  • 单链表根据尾插法建立
    include<stdio.h>include<stdlib.h>typedefstructslik{intdata;structslik*next;}sli;voidcreatesli(sli**head,inta[],intsize){for(inti=0;i<size;i++){sli*s=(sli*)malloc(sizeof(sli));s->data=a[i];s->next=NULL......
  • 队列_单向链表
    利用单向链表设计一个队列,实现“先进先出”的功能​ 队列的两端都允许操作,只不过要求数据只能从队列的一端插入,从队列的另一端删除,可以把队列理解为一根水管,水管有进水口和出水口。​ 一般把允许数据插入的一端称为队尾(Tail或者Rear),一般把允许删除数据的一端称为队头队首(Head或......
  • 利用两个栈实现队列的入队出队以及判断队列是否为空
    boolenQueue(SeqStack_t*S1,SeqStack_t*S2,intx){DataType_ttemp=x;//判断S1是否满if(SeqStack_IsFull(S1)){//判断S2是空if(SeqStack_IsEmpty(S2))![image](uploading...){while(!SeqStack_IsEmpty......
  • 链式队列
    队列原理介绍:​ 队列(Queue)和栈类似,相同点是都属于线性结构,不同点是栈遵循“后进先出”原则,而队列遵循“*先进先出*”的原则,也被称为“FIFO”结构,就是“FirstInputFirstOutput”​ 数据结构中的队列的两端都允许操作,只不过要求数据只能从队列的一端插入,从队列的另一端删除,可......
  • 单向链式队列
    目录目录单向链式队列创建空链表创建新结点入队判断链表是否为空出队遍历代码验证单向链式队列/**@filename: main.c@brief单向链式队列@[email protected]@date2024/04/[email protected]:版本@property:属性介绍@note补充注意说明CopyRight(c)2023......
  • 以链表为基础实现链式队列
    数据结构链式队列以链表为基础实现链式队列1.思路:如果打算以链表作为基础来实现队列的操作,可以避免内存浪费以及避免内存成片移动,只需要确定队头和队尾即可,一般把链表头部作为队头,可以实现头删,把链表尾部作为队尾,可以实现尾插。2.图示:3.代码:/****************************......
  • 单链表队列
    单链表队列队列:遵循先进先出1.创建初始化队列/******************************************************************************函数名称:LinQue_Create*函数功能:创建头结点*函数参数:NONE*......