(数据结构)双向队列问题

双向队列定义: 所谓的双向队列就是两个基本操作——加入和删除都可以在两端进行,而不必只局限于前端操作。
在这里插入图片描述
双向队列其实在实际应用中也分两种,一种是数据只能从一段加入而可以从两端取数据;另一种是可从两端加入但只从一段取数据。
首先是介绍第一种:
从一段加入而可以从两端取数据
代码详解(有思路体现)

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
#define true 1
struct Node
{
   int data;
   struct Node *next;
};

typedef struct Node *List;
List front=NULL;
List rear=NULL;
void enterqueue(int num);//队列数据的加入
int deletequeue(int Decision);//队列数据的取出
int main()

{
		int num = 0,temp = 0,flag = 1,m = 0;
		MessageBox(NULL,TEXT("点击确认程序开始运行!"),TEXT("提示"),MB_OK);
		do
		{
			printf("加入请按1, 取出请按2, 结束请按任意数字:");
			scanf("%d",&m);
			printf("\n");
			switch (m)
			{
				case 1:
					printf("加入的元素值:"); 
					scanf("%d",&num);
					enterqueue(num);
		
					case 2: 
					temp=deletequeue(1);
					if(temp != -1)
						printf("从双向队列前端按序取出的元素数据值为:%d\n",temp);
					else
						printf("从双向队列尾端按序取出的元素值为nothing\n");
					temp=deletequeue(2);
					if(temp != -1)
						printf("从双向队列尾端按序取出的元素数据值为:%d\n",temp);	
					else
						printf("从双向队列尾端按序取出的元素值为nothing\n");
					break; 
					
					default:flag = 0;break;
				}
	        }while(flag);
  return 0; 
}

oid enterqueue(int num)
{
	List current = (List)malloc(sizeof(struct Node));
	current->data = num;
	current->next = NULL;
	if(rear == NULL)//判断是否为空队列 
		front = current;//建立的第1个节点
	else
		rear->next = current;//加在末尾节点 
	rear = current; //更新末尾节点 rear 
} 

int deletequeue(int Decision)//队列数据的取出
{
	List current,first;
	int num = 0;
	if(front == rear && front != NULL)//只有一个元素的时候 
	{
		num = front->data;
		front = NULL;
		rear = NULL;
		return num;
	}
	else if( front != NULL && Decision == 1)//前端操作 
	{
		current = front;
		num = front->data;
		front = front->next; 
		free(current);
		return num; 
	}
	else if( rear != NULL && Decision == 2)//后端操作 
	{
		num = rear->data;
		first = front;
		while(front->next != rear)//寻找最尾端节点的前一个节点
		{
			front = front->next;
		}
		rear = front;//最尾端节点的前一个节点更新rear 
		front = first; //复原地址 
		return num;
	}
	else return -1; 
}

从两端段加入而但从一端取数据

#include<stdio.h>
#include<stdlib.h>
#include<string.h> 
#include<conio.h>
#define true 1
struct Node{
	 int data;
	 struct Node *next;
}; 

typedef struct Node *List;
List front = NULL;
List rear = NULL;
void enterqueue(int num,char ch);//入队列
int deletequeue();//出队列 

int main()
{
 char ch;//选择项 
 int num,temp;//num所读的数据 ,temp返回的数据 
 do{
	   printf("加入请按a,删除请按b,退出请按任意键:"); 
	   ch = getche();//直接从缓冲区读取数据,回显,不用按回车;
	   printf("\n");
	   if(ch == 'a')
	   {
		    printf("所加入的元素:");
		    scanf("%d",&num);
		    printf("从左边加入请按f,从右边加入请按r:");
		    ch = getche();//选择项 
		    enterqueue(num,ch);
		    printf("\n\n");
	   }
	   else if(ch == 'b')
	   {
		    temp = deletequeue();
		    if(temp != -1)
		     printf("所删除的元素的值为:%d\n",temp);
		    else
		     printf("队列已经为空,若要继续删除,请先加入元素\n");
		   } 
	   else
	 	   break;
	 }while(true); 
return 0;
}

void enterqueue(int num,char ch)//入队列
{
	 List current = (List)malloc(sizeof(struct Node));
	 current->data = num;
	 current->next = NULL;
	 if(ch == 'f')//左边加入
	 {
		  if(front == NULL)//当为空队列的时候 
		  rear = current;
		  current->next = front;
		  front = current; 
	 }
	 else if(ch == 'r')//从右边加入 
	 {
		  if(rear != NULL)
		   rear->next = current;
		  if(front == NULL)//当为空队列的时候 
		  front = current; 
		  rear = current;
	 }
return ;
}

int deletequeue()//出队列
{
	 int num;
	 List temp = NULL;
	 if(front != rear)//当队列中有至少两个元素的时候 
	 {
		  num = front->data;
		  temp = front;
		  front = front->next;
		  free(temp);
		  return num;
	}
	 else if( front != NULL)//当队列中只有一个元素的时候 
	 {
		  num = front->data;
		  temp = front;
		  front = NULL;
		  rear = NULL;
		  free(temp);
		  return num;
	 } 
	 else
	 	 return -1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值