首页 > 其他分享 >队列_单向链表

队列_单向链表

时间:2024-04-26 20:56:07浏览次数:29  
标签:结点 return Head 队列 单向 QueueLList next 链表 data

利用单向链表设计一个队列,实现“先进先出”的功能

​ 队列的两端都允许操作,只不过要求数据只能从队列的一端插入,从队列的另一端删除,可以把队列理解为一根水管,水管有进水口和出水口。

​ 一般把允许数据插入的一端称为队尾(Tail或者Rear),一般把允许删除数据的一端称为队头队首(Head或者Front)。

  • 把允许数据插入的一端称为队尾(允许数据插入到队列的操作称为入队,英文enqueue)
  • l把允许删除数据的一端称为队头(允许数据从队列删除的操作称为出队,英文dequeue)

程序结构思路:

.将单向链表的首结点当作堆首,尾结点当作队尾,入队相当于尾插操作,出队相当于头删操作。

程序:

/********************************************************************************************
*   file name: Queue_LList.c
*   author   : liaojx2016@126.com
*   date     : 2024/04/26
*   function : Design a queue to achieve “first input first output”
*   note     : None
*
*   CopyRight (c)  2023-2024   liaojx2016@126.com   All Right Reseverd 
*
*********************************************************************************************/
#include<stdio.h>
#include<string.h>
#include<stdbool.h>
#include<stdlib.h>
typedef int  DataType_t;
typedef struct QueueLList
{
	DataType_t  		 data; //结点的数据域
	struct QueueLList	*next; //结点的指针域

}QueueLList_t;
/**********************************************************************************************
*   func name       : QueueLList_Create
*   function        : Create a empty stack link list
*   func parameter  : None
*   return resuolt  : Address of head node
*   author          : liaojx2016@126.com
*   date            : 2024/04/26
*   note            : None
*   modify history  : None
*   function section: v1.0
*
**********************************************************************************************/
//创建一个空链表,空链表应该有一个头结点,对链表进行初始化
QueueLList_t * QueueLList_Create(void)
{
	//1.创建一个头结点并对头结点申请内存
	QueueLList_t *Head = (QueueLList_t *)calloc(1,sizeof(QueueLList_t));
    //判断是否内存申请成功
	if (NULL == Head)   {
		perror("Calloc memory for Head is Failed");
		exit(-1);
	}
	//2.对头结点进行初始化,头结点是不存储有效内容的!!!
	Head->next = NULL;
	//3.把头结点的地址返回即可
	return Head;
}
/**********************************************************************************************
*   func name       : QueueLList_NewNode
*   function        : Create a new node and do initialization
*   func parameter  : 
*                       @data :address of head node 
*   return resuolt  : Address of a new node
*   author          : liaojx2016@126.com
*   date            : 2024/04/26
*   note            : None
*   modify history  : None
*   function section: v1.0
*
**********************************************************************************************/
//创建新的结点,并对新结点进行初始化(数据域 + 指针域)
QueueLList_t * QueueLList_NewNode(DataType_t data)
{
	//1.创建一个新结点并对新结点申请内存
	QueueLList_t *New = (QueueLList_t *)calloc(1,sizeof(QueueLList_t));
	if (NULL == New)    {
		perror("Calloc memory for NewNode is Failed");
		return NULL;
	}
	//2.对新结点的数据域和指针域进行初始化
	New->data = data;
	New->next = NULL;

	return New;
}
/**********************************************************************************************
*   func name       : Enqueue
*   function        : Enqueue a data
*   func parameter  : 
*                       @data :Enqueue data
*                       @Head :Address of head node
*   return resuolt  : Enqueue success result (true or false)
*   author          : liaojx2016@126.com
*   date            : 2024/04/26
*   note            : None
*   modify history  : None
*   function section: v1.0
*
**********************************************************************************************/
bool Enqueue(QueueLList_t *Head,DataType_t data)
{
    //1.创建新的结点,并对新结点进行初始化
	QueueLList_t *New = QueueLList_NewNode(data);
	if (NULL == New)
	{
		printf("can not insert new node\n");
		return false;
	}
    //printf("New->data=%d\n",New->data);
	//2.判断链表是否为空,如果为空,则直接插入即可
	if (NULL == Head->next)
	{
		Head->next = New;
		return true;
	}
    //3.如果链表为非空,则把新结点插入到链表的尾部
    QueueLList_t *p = Head->next;
    //遍历链表,p指针到达尾结点
    while(p->next != NULL) {
        p = p->next;
    }
    //将新结点插入尾节点之后
    p->next = New;
    return true;
}
/**********************************************************************************************
*   func name       : Dequeue
*   function        : Dequeue a data and output
*   func parameter  : 
*                       @Head :address of head node 
*   return resuolt  : Dequeue success result (true or false)
*   author          : liaojx2016@126.com
*   date            : 2024/04/26
*   note            : None
*   modify history  : None
*   function section: v1.0
*
**********************************************************************************************/
bool Dequeue(QueueLList_t *Head)
{
    //当链表为空,删除失败,返回false
    if (NULL == Head->next)
	{
		//printf("Stack linklist is empty\n");
		return false;
	}
    QueueLList_t *p = Head->next;   //备份首结点
    printf("the dequeue element is %d\n",Head->next->data);
    //首部删除一个结点
    Head->next = Head->next->next;   //头结点的next指针指向首结点的直接后继
    p->next = NULL;	//将原首结点的next指针指向NULL
    free(p);	//释放原首结点
    return true;
}

/**********************************************************************************************
*   func name       : QueueLList_Print
*   function        : Queue data print
*   func parameter  : 
*                       @Head :address of head node 
*   return resuolt  : Print success result (true or false)
*   author          : liaojx2016@126.com
*   date            : 2024/04/25
*   note            : None
*   modify history  : None
*   function section: v1.0
*
**********************************************************************************************/
//遍历
bool QueueLList_Print(QueueLList_t *Head)
{
    if (Head->next == NULL)   {
        printf("stack link list is empty\n");
        return false;
    }
	//对链表的头文件的地址进行备份
	QueueLList_t *Phead = Head;
	printf("the Stack linkedlist data is \n");
    //遍历结点,输出数据
	do
	{
		//把头的直接后继作为新的头结点
		Phead = Phead->next;
		//输出头结点的直接后继的数据域
		printf("%d ",Phead->data);
	}
	while( Phead->next );
    printf("\n");
    return true;
}

int main(int argc, char const *argv[])
{
	//定义一个头指针
	QueueLList_t *head = QueueLList_Create();
	//Enqueue 入队,Dequeue 出队并输出数据,QueueLList_Print 遍历以便测试打印
    Enqueue(head,3);
    Dequeue(head);
    QueueLList_Print(head);
    Enqueue(head,7);
    Enqueue(head,4);
    Enqueue(head,2);
    QueueLList_Print(head);
    Dequeue(head);
    QueueLList_Print(head);
    
	return 0;
}

测试输出结果

标签:结点,return,Head,队列,单向,QueueLList,next,链表,data
From: https://www.cnblogs.com/JinBool/p/18160859

相关文章

  • 利用两个栈实现队列的入队出队以及判断队列是否为空
    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单向链式队列@author1810866453@163.com@date2024/04/23@version1.0:版本@property:属性介绍@note补充注意说明CopyRight(c)2023......
  • 以链表为基础实现链式队列
    数据结构链式队列以链表为基础实现链式队列1.思路:如果打算以链表作为基础来实现队列的操作,可以避免内存浪费以及避免内存成片移动,只需要确定队头和队尾即可,一般把链表头部作为队头,可以实现头删,把链表尾部作为队尾,可以实现尾插。2.图示:3.代码:/****************************......
  • 单链表队列
    单链表队列队列:遵循先进先出1.创建初始化队列/******************************************************************************函数名称:LinQue_Create*函数功能:创建头结点*函数参数:NONE*......
  • 查找链表倒数第k个数位置上的结点
    (1)描述算法的基本思想由题可知,该链表是个单向链表,如果要找到倒数第k个值,我们必须找到该链表的尾部,而单向链表从尾部向头部找倒数第k个值比较麻烦,所以我们可以从头部去找倒数第k个值(2)描述算法的详细实现步骤我们可以利用两个指针去遍历该链表,一个指针遍历完该链表计算出结点个数......
  • 单链表的头插法的实现
    /***@filename: 文件名称*@brief单链表的头插法的实现*@author2492834335D@.com*@date2024/04/26*@version1.0:版本*@property:属性介绍*@note补充注意说明*CopyRight(c)2023-20242492834335@.comAllRightReseverd*/#......
  • 数据结构—单链表队列头删尾插
    单链表队列的头删尾插/*************************************************/***@filename: 单链表队列的头删尾插.md*@brief实现对单链表队列的头删尾插*@author15070884254@163.com*@date2024/04/26*@version1.0:在下坂本,有何贵干*@property:no......
  • 循环队列
    /***********************************************************************************************************该程序实现循环队列元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以循环队列中元素*的数据类型为DataType_t,用户可以根据实际情况修改......
  • 两个栈模拟一个队列(Stacks Imitate Queue)
    /****************************************************************************@filename: :StacksSimulateQueue*@brief :两个栈实现队列的功能*@author :wvjnuhhail@126.com*@date :2024/04/26*@version1.0 :V1.0*@property :None*@not......