Queue-链式存储实现
结构思想
1、定义结点-由数据域和指针域组成
2、定义队头和队尾指针。
typedef struct QNode{
int data; //数据域
struct QNode *next; //指针域 ,尾指针域为空,
}QNode,*QueuePtr;
typedef struct{//相当于定义了两个结点类型的变量
QNode *front;//等价于QueuePtr front; 队头指针
QNode *rear;//等价于QueuePtr rear; 队尾指针
int length;//队列长度
}LinkQueue;
代码实现:
#include<stdio.h>
#include<stdlib.h>
/*
队列Queue:特殊的线性表,规定在一端删除、另一端添加-先进先出的原则
顺序队列和链队列的两种存储方式。
*/
//链队列结构
//结点的结构
typedef struct QNode{
int data; //数据域
struct QNode *next; //指针域 ,尾指针域为空,
}QNode,*QueuePtr;
typedef struct{//相当于定义了两个结点类型的变量
QNode *front;//等价于QueuePtr front; 队头指针
QNode *rear;//等价于QueuePtr rear; 队尾指针
int length;//队列长度
}LinkQueue;
//初始化空链队列-
LinkQueue InitLQueue();
//创建队列-加入元素值0-i的值
void CreateLQueue(LinkQueue &Q,int i);
//入队
void EnQueue(LinkQueue &Q,int e);
//出队
void DeQueue(LinkQueue &Q,int &e);
//返回队头元素
int GetHead(LinkQueue Q);
//判断队列空
bool QueueisEmpty(LinkQueue Q);
//遍历队列-
void QueueTraverse(LinkQueue Q);
//主函数
int main(){
//初始化空链队列-
LinkQueue Q = InitLQueue();//创建空队列Q
printf("创建队列成功!");
printf("\n");printf("\n");printf("\n");
//创建队列-加入元素值0-i的值
printf("---进行赋值操作---\n");
int m,i;
printf("输入m:");
scanf("%d",&m);
printf("0-m将被依次输入到队列中!\n");
CreateLQueue(Q,m);
printf("赋值成功!!!\n");
printf("当前队列元素,从头到尾:");
QueueTraverse(Q);
printf("\n");printf("\n");printf("\n");
//入队
printf("---进行入队操作---\n");
int e;
printf("输入入队的元素值e:");
scanf("%d",&e);
EnQueue(Q,e);
printf("入队成功!!!\n");
printf("当前队列元素,从头到尾:");
QueueTraverse(Q);
printf("\n");printf("\n");printf("\n");
//出队
printf("---进行出队操作---\n");
if(Q.front == Q.rear){
printf("队列为空!!\n");
}
else{
int a;
DeQueue(Q,a);
printf("出队成功!!!\n");
printf("出队的元素值为:%d\n",a);
}
printf("当前队列元素,从头到尾:");
QueueTraverse(Q);
printf("\n");printf("\n");printf("\n");
//返回队头元素
printf("---进行查找队头操作---\n");
int QueueHead = GetHead(Q);
if(QueueHead!=-1){
printf("队列的头为:%d\n",QueueHead);
}
printf("\n");printf("\n");printf("\n");
//判断队列空
printf("---进行判空操作---\n");
if(QueueisEmpty(Q)){
printf("队列为空!!\n");
}
else{
printf("队列不为空!!\n");
}
printf("\n");printf("\n");printf("\n");
//遍历队列-
printf("---进行遍历操作---\n");
printf("当前队列元素,从头到尾:");
QueueTraverse(Q);
printf("遍历对列成功!!");
printf("\n");printf("\n");printf("\n");
return 0;
}
//初始化-带头结点
LinkQueue InitLQueue(){
LinkQueue Q;
Q.front = Q.rear = (QNode *) malloc (sizeof(QNode));
if(!Q.front){
printf("内存分配失败!!");
exit(0);
}
Q.length = 0;
Q.front->next = NULL;
return Q;
}
//创建
void CreateLQueue(LinkQueue &Q,int e){
for(int i=0;i<=e;i++){
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));//为新结点申请空间
if(!p){
exit(0);
}
p->data=i;//将元素e存到新空间中
p->next=NULL; // 将新结点插到队尾
Q.rear->next=p;
Q.rear=p;
Q.length++;
}
}
//入队
void EnQueue(LinkQueue &Q,int e){
QueuePtr p = (QueuePtr) malloc (sizeof(QNode));//只需要创建一个结点即可;
if(!p){
printf("内存分配失败!!");exit(0);
}
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
Q.length ++;
}
//出队
void DeQueue(LinkQueue &Q,int &e){
QueuePtr p = Q.front->next;
e = p->data;
Q.front->next = p->next;
Q.length--;
if(Q.rear == p){
Q.rear = Q.front;
}
}
//取队头
int GetHead(LinkQueue Q){
if(Q.front != Q.rear){
return Q.front->next->data;
}
else {
printf("队列为空!!");
return -1;
}
}
//判空
bool QueueisEmpty(LinkQueue Q){
if(Q.front == Q.rear){
return true;
}
else {
return false;
}
}
//遍历整个队列
void QueueTraverse(LinkQueue Q){
while(Q.front!=Q.rear){
printf("%d ",Q.front->next->data);
Q.front = Q.front->next;
}
}
实现案例: