链式队列的基础操作实现(C语言)

本文介绍了一种链表实现的队列数据结构——链式队列,并详细阐述了其核心操作,包括创建、添加元素、删除元素、打印队列等。通过具体的C语言实现代码,展示了如何有效地管理和操作链式队列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链式队列是队列的一种链表表示形式

主要操作有:

 1 : 清空并创建一个新的队列       
 2 : 添加一个元素到队列中           
 3 : 添加一组元素到队列中          
 4 : 从队列中删除一个元素             
 5 : 从队列中删除一个元素             
 6 : 获取队列长度                    
 7 : 打印队列元素到屏幕            
 8 : 清空队列元素                    
 9 : 重新初始化队列(销毁队列后执行)
10: 销毁队列元素(请执行命令9)      


待完成功能:LinkQueue* DeleteAny (LinkQueue *Queue, int any) //返回新的链表
从队头删除任意元素,并将其存入新的队列已备用;



/*------------------------------------------------
--目的:学习队列的创建及用法,链式存储实现
--作者:刘志强
--创建时间:2015-1-7
-------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h> 

#define ElementType int

/*------------------------------------------------
--创建队列节点及队的指针 
-------------------------------------------------*/
typedef struct Node {
	ElementType Data;
	struct Node *Next; 
}QueueNode;

typedef struct {
	QueueNode *rear;  //队尾指针一个 
	QueueNode *front; //队头指针一个 
}LinkQueue;

LinkQueue PtrQ,NewQueue;  //为什么定义成指针不行呢? 



/*------------------------------------------------
--功能函数;判断队列是否为空 
-------------------------------------------------*/
ElementType IsEmpty (LinkQueue *Queue)
{
	if(Queue->front->Next == NULL)
	{
		printf("队列为空!!!\n");
	}
	return Queue->front->Next == NULL; 
}

/*------------------------------------------------
--功能函数;初始化队列 ,创建空队列 
-------------------------------------------------*/
void InitQueue (LinkQueue *Queue)
{
	Queue->front = Queue->rear = (QueueNode *) malloc(sizeof(QueueNode));
	Queue->front->Next = NULL;
	printf("初始化完成!\n");
}

/*------------------------------------------------
--功能函数;元素 Element 进入队列 
-------------------------------------------------*/
void AddQueue (LinkQueue *Queue,ElementType Element) 
{
	QueueNode *temp = (QueueNode*) malloc(sizeof(QueueNode));
	if (temp) 
	{
		temp->Data = Element;
		temp->Next = NULL;
		Queue->rear->Next = temp;
		Queue->rear = temp;
	}
}

/*------------------------------------------------
--功能函数;创建队列 
-------------------------------------------------*/
void CreatQueue (LinkQueue *Queue) 
{
	ElementType temp;
	InitQueue (Queue);
	printf("请输入一组数字创建队列(注意:请按换行后Ctrl+Z再回车结束输入):\n");
	while(scanf("%d",&temp) != EOF)  //若不能安全结束循环会造成:内存满->电脑死机!!! 
		AddQueue (Queue,temp);
	printf("队列创建成功!\n"); 
}

/*------------------------------------------------
--功能函数;从队列中删除一个元素 
-------------------------------------------------*/
ElementType DeleteQueue(LinkQueue *Queue) 
{//带头结点的链式队列 ,每次删除头结点后面的一个元素 
	QueueNode *FrontCell;
	ElementType FrontElem;
	if (IsEmpty(Queue)==1)
		return NULL;
	FrontCell=Queue->front;
	FrontElem=Queue->front->Next->Data;
	if(Queue->front==Queue->rear)
		Queue->front=Queue->rear=NULL;
	else
		Queue->front=Queue->front->Next;	
	free(FrontCell);
	return FrontElem;	 
}

/*------------------------------------------------
--功能函数;打印队列中的所有元素 
-------------------------------------------------*/
void Print (LinkQueue *Queue)
{
	QueueNode *TempCell;
	if (Queue->front->Next == NULL)
	{
		printf("队列中的所有元素为:无\n"); 
		return NULL;  //不再执行此函数下面的程序 
	}		
	printf("队列中的所有元素为:\n"); 
	TempCell=Queue->front->Next;
	while(TempCell != Queue->rear)  
    {  
        printf("%d ",TempCell->Data);  
        TempCell = TempCell->Next;  
    }  
    printf("%d",TempCell->Data);  
    printf("\n"); 
} 

/*------------------------------------------------
--功能函数;获取队列长度 
-------------------------------------------------*/
int GetQueueLength (LinkQueue *Queue) 
{
	/*因队头和队尾指针用指针变量定义
	注意不能使用指针改变数据结构 */ 
	int length=0;
	QueueNode *TempCell;
	TempCell = Queue->front->Next;
	if (IsEmpty(Queue)==1)
		return 0;
	while(TempCell->Next!=NULL)
	{
		QueueNode *Temp;      //交换思想 
		Temp=TempCell->Next;
		TempCell=Temp;
		length++; 
	}
	return length+1;
}

/*------------------------------------------------
--功能函数;清空队列 
-------------------------------------------------*/
void ClearQueue (LinkQueue *Queue) 
{
	while(1)
	{
		QueueNode *FrontCell;
		if (Queue->front->Next == NULL)
			break;
		FrontCell=Queue->front;
		if(Queue->front==Queue->rear)
			Queue->front=Queue->rear=NULL;
		else
			Queue->front=Queue->front->Next;	
		free(FrontCell);
	}
	
	printf("队列已清空\n"); 
}

/*------------------------------------------------
--功能函数;销毁队列 
-------------------------------------------------*/
void DestroyQueue (LinkQueue *Queue) 
{
	while(1)
	{
		QueueNode *FrontCell;
		if (Queue->front->Next == NULL)
			break;
		FrontCell=Queue->front;
		if(Queue->front==Queue->rear)
			Queue->front=Queue->rear=NULL;
		else
			Queue->front=Queue->front->Next;	
		free(FrontCell);
	} 
	free(Queue->front);
	//free(Queue->rear);
	printf("队列已销毁,请重新初始化!\n"); 
}

 /*------------------------------------------------
--功能函数;从队头中删除 i 个元素
-------------------------------------------------*/
//LinkQueue* DeleteAny (LinkQueue *Queue, int any) //返回新的链表 
void  DeleteAny (LinkQueue *Queue)
{
	if(IsEmpty(Queue))
	{
		return NULL;
	}
	else
	{
		int i=0,length=0;
		length = GetQueueLength(Queue);
		printf("请输入要删除元素的个数(范围:0 < i <= %d ):",length);
		scanf("%d",&i); 
		while(i<=0||i>length)
		{
			printf("输入范围不对,请重新输入");
			scanf("%d",&i);
		}//删除然后打印,或者储存到新的链表中已备后用 
		printf("删除元素为:");
		while(i)
		{
			printf("%d ",DeleteQueue(Queue));
			i--; 
		} 
	}
}

/*------------------------------------------------
--功能函数;向队尾中添加 any 个元素
-------------------------------------------------*/
void AddAny (LinkQueue *Queue)
{
	printf("请输入要添加的数字(以空格区分不同数字,注意:请按换行后Ctrl+Z再回车结束输入):\n");
	ElementType temp;
	while(scanf("%d",&temp) != EOF)  //若不能安全结束循环会造成:内存满->电脑死机!!! 
		AddQueue (Queue,temp);
	printf("添加成功!\n");  
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值