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