队列的链式存储,需要首先设计结点,包含一个指针域和一个数据域。然后对于一个队列整体,设计出一个队首指针和一个队尾指针。队首指针指向队列的第一个元素。
存储类型就可以描述为:
typedef struct LinkNode{
ElemType data;
struct LinkNode *next;
}LinkNode;
typedef struct{
LinkNode *front;
LinkNode *rear;
}LinkQueue;
整体设计如下:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef int ElemType;
typedef struct LinkNode{
ElemType data;
struct LinkNode *next;
}LinkNode;
typedef struct{
LinkNode *front;
LinkNode *rear;
}LinkQueue;
void InitQueue(LinkQueue &Q); //构造一个链式队列
bool QueueEmpty(LinkQueue &Q); //判断链队是否为空
void EnQueue(LinkQueue &Q,ElemType &x); //链队队尾插入元素
bool DeQueue(LinkQueue &Q,ElemType &x); //链队删除队首元素
int main()
{
return 0;
}
void InitQueue(LinkQueue &Q){
Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));
Q.front->next=NULL; //队首指针与队尾指针指向同一位置
}
bool QueueEmpty(LinkQueue &Q){ //判断队空
if(Q.front==Q.rear)
return true;
else
return false;
}
void EnQueue(LinkQueue &Q,ElemType &x){
LinkNode *p;
p=new LinkNode; //入队时声明一个p指针,插到队尾
p->data=x;
p->next=NULL;
Q.rear->next=p; //插到队尾处
Q.rear=p;
}
bool DeQueue(LinkQueue &Q,ElemType &x){
if(Q.front==Q.rear)
return false;
LinkNode *p;
p=Q.front->next;
x=p->data;
Q.front->next=p->next;
if(Q.rear==p) //若原队列只有一个元素的时候
Q.rear=Q.rear; //删除后变为空
free(p);
return true;
}