目录
详细的关于队列的概念参见上一篇《队列之循环队列》,本文介绍的是带头结点的链队列
一、带头结点的链队列
1.定义
typedef struct LinkNode {
ElemType data;
struct LinkNode *next;
}LinkNode;
typedef struct {
LinkNode *front,*rear;
}LinkQueue;
2.初始化
让队头队尾指针都指向头结点 ,next指针指向空
void InitQueue ( LinkQueue &Q) {
Q.front = Q.rear = (LinkNode*) malloc (sizeof(LinkNode)); //队头队尾指针都指向头结点
Q.front->next = NULL;
}
3.判空
bool QueueEmpty(LinkQueue &Q) {
if (Q.front == Q.rear)
/* if (Q.front->next == NULL) */
return true;
else
return false;
}
4.入队
void EnQueue (LinkQueue &Q, ElemType x) {
LinkNode *s = (LinkNode*) malloc (sizeof(LinkNode));
s->data = x;
s->next = NULL;
Q.rear->next = s; //插入结点s
Q.rear = s; //修改表尾指针
}
5.出队
bool DeQueue (LinkQueue &Q, ElenType &x) {
if (Q.front == Q.rear) //判空
return false;
LinkNode *p = Q.front->next; //p为头结点的后一个结点
x = p->data;
Q.front->next = p->next;
if (Q.rear == p) //队列中只有一个元素
Q.rear = Q.front;
free(p);
return true;
}
6.获取队头元素
int GetHead(LinkQueue Q) {
if (Q.front == Q.rear) //判空
return -1;
LinkNode *p = Q.front->next; //p为头结点的后一个结点
return p->data;
}
二、不带头结点的链队列
1.定义
typedef struct LinkNode {
ElemType data;
struct LinkNode *next;
}LinkNode;
typedef struct {
LinkNode *front,*rear;
}LinkQueue;
2.初始化
让队头队尾指针都指向空
void InitQueue ( LinkQueue &Q) {
Q.front = Q.rear = NULL;
}
3.判空
bool QueueEmpty(LinkQueue &Q) {
if (Q.front == NULL)
return true;
else
return false;
}
4.入队
void EnQueue (LinkQueue &Q, ElemType x) {
LinkNode *s = (LinkNode*) malloc (sizeof(LinkNode));
s->data = x;
s->next = NULL;
if (Q.front == NULL) { //插入第一个元素
Q.front = s;
Q.rear = s;
}
else {
Q.rear->next = s; //插入结点s
Q.rear = s; //修改表尾指针
}
}
5.出队
bool DeQueue (LinkQueue &Q, ElenType &x) {
if (Q.front == NULL) //判空
return false;
LinkNode *p = Q.front; //p为第一个结点
x = p->data;
Q.front = p->next;
if (Q.rear == p) { //队列中只有一个元素
Q.rear = NULL;
Q.rear = NULL;
}
free(p);
return true;
}
6.获取队头元素
int GetHead(LinkQueue Q) {
if (Q.front == Q.rear) //判空
return -1;
return Q.front->data;
}
三、具体代码和运行结果
以带头结点为例
typedef struct LinkNode //结点定义
{
int data;
struct LinkNode *next;
}LinkNode;
typedef struct //链队列定义
{
LinkNode *front,*rear;
}LinkQueue;
//初始化
void InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = (LinkNode *)malloc(sizeof(LinkNode));
Q.front->next = NULL;
}
//入队
void EnQueue(LinkQueue &Q, int x)
{
LinkNode *p = (LinkNode *)malloc(sizeof(LinkNode));
p->data = x;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
}
//出队
int DeQueue(LinkQueue &Q)
{
int x;
if (Q.front == Q.rear)
{
cout << "队空" <<endl;
return -1;
}
LinkNode *p = Q.front->next;
x = p->data;
Q.front->next = p->next;
if(Q.rear == p)
Q.rear = Q.front;
free(p);
return x;
}
//判空
bool QueueEmpty(LinkQueue Q)
{
if (Q.front == Q.rear)
return true;
else
return false;
}
//获取队头元素
int GetHead(LinkQueue Q)
{
if (Q.front == Q.rear)
{
cout << "队空" <<endl;
return -1;
}
LinkNode *p = Q.front->next;
return p->data;
}
//打印
void PrintQueue(LinkQueue Q)
{
LinkNode *p;
p = Q.front->next;
while (p != NULL)
{
cout << p->data <<" ";
p = p->next;
}
}
int main()
{
LinkQueue Q;
InitQueue(Q);
cout << "=============================="<<endl;
cout << ".......输入1进行入队操作......"<<endl;
cout << ".......输入2进行出队操作......"<<endl;
cout << ".......输入3进行打印操作......"<<endl;
cout << "..输入4进行获取队头元素操作..."<<endl;
cout << ".......输入5进行判空操作......"<<endl;
cout << ".......输入0退出程序......"<<endl;
cout << "=============================="<<endl;
cout <<endl;
int n;
while (1)
{
cout << "请输入要执行的操作:";
cin >> n;
switch(n)
{
case 1:
cout << "此时进行入队操作:..."<<endl;
EnQueue(Q,1);
EnQueue(Q,2);
EnQueue(Q,3);
EnQueue(Q,4);
EnQueue(Q,5);
cout << "入队操作结束,请执行后续操作..."<<endl;
break;
case 2:
cout << "此时进行出队操作:..."<<endl;
DeQueue(Q);
cout << "出队操作结束,请执行后续操作..."<<endl;
break;
case 3:
cout << "正在打印上述操作结果:..."<<endl;
cout << "此时队列内容为:";
PrintQueue(Q);
cout<<endl;
cout << "打印操作结束,请执行后续操作..."<<endl;
break;
case 4:
cout<<"此时的队头元素为:"<<GetHead(Q)<<endl;
cout << "获取队头元素操作结束,请执行后续操作..."<<endl;
break;
case 5:
cout<<"此时进行判空操作..."<<endl;
cout << "判空结果为:";
if(!QueueEmpty(Q))
{
cout<<"队不为空"<<endl;
}
break;
case 0:
cout<<"已退出程序"<<endl;
exit(0);
}
}
return 0;
}
运行结果