链队列和循环队列

1、初始化链队列

#include<stdio.h>
#include<malloc.h>

//定义链队列的结点。一个数据域,一个指针域。

typedef struct LinkNode
{
	int data;
	LinkNode* next;
	
 } *LinkNodePtr;
 
 
 //定义链队列,队首和队尾。
 
 typedef struct LinkQueue
 {
 	LinkNodePtr front;
 	LinkNodePtr rear;
  } *LinkQueuePtr;
  
  
  //初始化链队列
  
  LinkQueuePtr initQueue()
  {
  	//为resultPtr申请一个大小为LinkQueue的空间。 
  	LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(LinkQueue));
  	//为headerPtr申请一个大小为LinkNodePtr的空间。
	LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(LinkNodePtr));
	headerPtr->next = NULL;
	
	resultPtr->front = headerPtr;
	resultPtr->rear = headerPtr;
	
	return resultPtr;
   } 

2、打印队列

   //打印队列;
   
   void outputLinkQueue(LinkQueuePtr paraQueuePtr)
   {
   	LinkNodePtr tempPtr = paraQueuePtr->front->next;
   	while(tempPtr != NULL)
   	{
   		printf("%d",tempPtr->data);
   		tempPtr = tempPtr->next;
   		
	   }
	   printf("\r\n");
	} 
	

3、设计入队函数

	
	//设计入队函数。
	
	void enqueue(LinkQueuePtr paraQueuePtr,int paraElement)
	
	{
		//第一步,创建一个新的空间。
		LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(LinkNodePtr));
		tempNodePtr->data = paraElement;
		tempNodePtr->next = NULL;
		
		//第二步,连接起来。
		paraQueuePtr->rear->next = tempNodePtr;
		
		//第三步,连接完成。
		paraQueuePtr->rear = tempNodePtr; 
	 } 

4、设计出队函数

	
	//设计入队函数。
	
	void enqueue(LinkQueuePtr paraQueuePtr,int paraElement)
	
	{
		//第一步,创建一个新的空间。
		LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(LinkNodePtr));
		tempNodePtr->data = paraElement;
		tempNodePtr->next = NULL;
		
		//第二步,连接起来。
		paraQueuePtr->rear->next = tempNodePtr;
		
		//第三步,连接完成。
		paraQueuePtr->rear = tempNodePtr; 
	 } 
	 
	 //设计出队函数。
	 
	 int dequeue(LinkQueuePtr paraQueuePtr)
	 {
	 	int resultvalue;
	 	LinkNodePtr tempNodePtr;
	 	
	 	//先判断队列是否为空?
		 if(paraQueuePtr->front==paraQueuePtr->rear)
		 {
		 	printf("这个队列是空的!\r\n");
		 	return -1;//返回-1表示报错。 
		  } 
		//改变队列。
		tempNodePtr = paraQueuePtr->front->next;
		resultvalue = tempNodePtr->data;
		paraQueuePtr->front->next = paraQueuePtr->front->next->next;
		
		if(paraQueuePtr->rear==tempNodePtr)
		{
			paraQueuePtr->rear = paraQueuePtr->front;
		  }  
		  
		  //释放空间。
		  free(tempNodePtr);
		  tempNodePtr = NULL;
		  //返回出来。
		  return resultvalue; 
	  } 

5、测试函数

 
	  //测试函数
	  void testLinkQueue()
	  {
	  	LinkQueuePtr tempQueuePtr;
	  	tempQueuePtr = initQueue();
	  	enqueue(tempQueuePtr,10);
	  	enqueue(tempQueuePtr,30);
	  	enqueue(tempQueuePtr,50);
	  	
	  	outputLinkQueue(tempQueuePtr);
	  	
	  	printf("dequeue gets %d\r\n",dequeue(tempQueuePtr));
	  	printf("dequeue gets %d\r\n",dequeue(tempQueuePtr));
	  	printf("dequeue gets %d\r\n",dequeue(tempQueuePtr));
	  	printf("dequeue gets %d\r\n",dequeue(tempQueuePtr));
	  	
	  	enqueue(tempQueuePtr,8);
	  	outputLinkQueue(tempQueuePtr);
	   } 
	   
	   int main()
	   {
	   	testLinkQueue();
	   	return 1;
	   }

6、运行结果如下:

7、循环队列的实现

#include<stdio.h>
#include<malloc.h>

#define TOTAL_SPACE 5

//定义循环队列的队首和队尾。 
typedef struct CircleIntQueue
{
	int data[TOTAL_SPACE];
	
	int head;
	
	int tail;
 } *CircleIntQueuePtr;
 
 //输出链表队列 
 void outputLinkQueue(CircleIntQueuePtr paraPtr)
 {
 	int i;
 	if(paraPtr->head==paraPtr->tail)
 	{
 		printf("空代码!");
		 return ; 
	 }
	 printf("Element in the queue:");
	 for(i = paraPtr->head;i<paraPtr->tail;i++)
	 {
	 	printf("%d,",paraPtr->data[i % TOTAL_SPACE]);
	 }
	 printf("\r\n");
	 
  } 
 
 
 //初始化一个队列 
 CircleIntQueuePtr initQueue()
 {
 	//申请空间。 
 	CircleIntQueuePtr resultPtr = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue));
 	resultPtr->head = 0;
 	resultPtr->tail = 0;//初始化都为0. 
 	
 	return resultPtr;
 }
 
 //入队函数的设计。
 void enqueue(CircleIntQueuePtr paraPtr, int paravalue)
 {
 	//首先进行一次判断队列是否以及占满。 
 	if((paraPtr->tail + 1) % TOTAL_SPACE == paraPtr->head)
 	{
 		printf("队列已经满了!");
		 return ; 
 		
	 }
	 paraPtr->data[paraPtr->tail % TOTAL_SPACE] = paravalue;
	 paraPtr->tail++;
  } 
  
  //出队函数的设计
  
 int dequeue(CircleIntQueuePtr paraPtr)
 {
 	int resultvalue;
 	if(paraPtr->head == paraPtr->tail)
 	{
 		printf("已经没有元素在里面了!\r\n");
		 return -1; 
	 }
	 resultvalue = paraPtr->data[paraPtr->head % TOTAL_SPACE];
	 paraPtr->head++;
	 
	 return resultvalue;
  } 
  
  
  //测试函数
  void test()
  {
  	int i = 10;
  	CircleIntQueuePtr tempPtr = initQueue();
  	for(;i<16;i++)
  	{
  		enqueue(tempPtr,i);
  		
}
	  outputLinkQueue(tempPtr);
	  
	  for(i = 0;i<6;i++)
	  {
	  	printf("dequeue gets %d\r\n",dequeue(tempPtr));
	  }
	  enqueue(tempPtr,8);
	  outputLinkQueue(tempPtr);
   } 
   
   int main()
   {
   	test();
   	return 1;
   }

8、运行结果如下:

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值