队列的链式存储它是一个带队头指针和队尾指针的一个单链表,也是一个输入输出受限的单链表。
链队列的定义
//链队列的定义
typedef struct LinkNode
{
int data;
struct LinkNode* next;
}Linknode;
typedef struct
{
Linknode* front, * rear;
}LinkQueue;
首先定义一个结构体变量,含有数据域和下一个结点的指针,再设置一个分别指向队头和队尾的结构体LinkQueue,注意要使用LinkQueue里面的指针要注意引用方式是.不是->。
链队列的初始化
//链队列的初始化
int InitQueue(LinkQueue& Q)
{
Q.front = Q.rear = new Linknode;//建立头结点
if (Q.front == NULL)return 0;//分配失败
Q.front->next = NULL;//初始为空
return 1;
}
令front和rear结点指向同一个位置,next等于NULL
链队列的判空
//链队列的判空
int IsEmpty(LinkQueue Q)
{
if (Q.rear == Q.front)return 1;
return 0;
}
若rear与front的指向相同则空
链队列的入队
//链队列的入队
int PushQueue(LinkQueue& Q, int e)
{
Linknode* s;
s = new Linknode;
s->data = e;
s->next = NULL;//将s放到队列尾部
Q.rear->next = s;//rear的next指向s
Q.rear = s;//rear再后退到最后一个
return 1;
}
首先定义一个s用来做中间变量,然后将数据赋值,先将s->next等于空,然后将rear的next指向s,再讲s给了rear,令它指向最后一个结点。
链队列的出队
//链队列的出队
int PopQueue(LinkQueue &Q,int &e)
{
if (Q.rear == Q.front)return 0;//表示当前表空
Linknode* s;
s = new Linknode;
s = Q.front->next;//将队头的下一个结点地址给s
e = s->data;
Q.front->next = s->next;
if (Q.rear == s)Q.rear = Q.front;//若原队列中只有一个结点,删除后变空
delete s;
return 1;
}
首先判断若为空队则无法返回,定义一个中间变量s
链队列的入队
//链队列的出队
int PopQueue(LinkQueue &Q,int &e)
{
if (Q.rear == Q.front)return 0;//表示当前表空
Linknode* s;
s = new Linknode;
s = Q.front->next;//将队头的下一个结点地址给s
e = s->data;
Q.front->next = s->next;
if (Q.rear == s)Q.rear = Q.front;//若原队列中只有一个结点,删除后变空
delete s;
return 1;
}
若链队列是空的则直接返回,首先定义一个变量,将front的下一个结点赋值给s,将数据给e,front的next指向s的next,若s是最后一个结点也就是rear则让rear指向front的指向,删除s。
全部代码
#include<stdio.h>
#include<stdlib.h>
#define maxsize 10
#define initsize 10
#pragma warning(disable:4996)
#pragma warning(disable:5208)
//链队列的定义
typedef struct LinkNode
{
int data;
struct LinkNode* next;
}Linknode;
typedef struct
{
Linknode* front, * rear;
}LinkQueue;
//链队列的初始化
int InitQueue(LinkQueue& Q)
{
Q.front = Q.rear = new Linknode;//建立头结点
if (Q.front == NULL)return 0;//分配失败
Q.front->next = NULL;//初始为空
return 1;
}
//链队列的判空
int IsEmpty(LinkQueue Q)
{
if (Q.rear == Q.front)return 1;
return 0;
}
//链队列的入队
int PushQueue(LinkQueue& Q, int e)
{
Linknode* s;
s = new Linknode;
s->data = e;
s->next = NULL;//将s放到队列尾部
Q.rear->next = s;//rear的next指向s
Q.rear = s;//rear再后退到最后一个
return 1;
}
//链队列的出队
int PopQueue(LinkQueue &Q,int &e)
{
if (Q.rear == Q.front)return 0;//表示当前表空
Linknode* s;
s = new Linknode;
s = Q.front->next;//将队头的下一个结点地址给s
e = s->data;
Q.front->next = s->next;
if (Q.rear == s)Q.rear = Q.front;//若原队列中只有一个结点,删除后变空
delete s;
return 1;
}
//求队头数据
int GetTop(LinkQueue Q, int& e)
{
if (Q.rear == Q.front)return 0;//空表
e = Q.front->data;
return 1;
}
int DestroyQueue(LinkQueue& Q)
{
Linknode* p;
while (Q.front)
{
p = Q.front;
Q.front = Q.front->next;
if (Q.rear == p)Q.rear = Q.front;
delete p;
}
return 1;
}
int main()
{
LinkQueue Q;
int i, e;
printf("链队的初始化为:%d\n", InitQueue(Q));
printf("链队的判空为:%d\n", IsEmpty(Q));
printf("链队的顺序入队序列:\n");
for(i=1;i<=10;i++)
{
PushQueue(Q, i);
}
e = GetTop(Q, e);
printf("队头元素是:%d\n", e);
printf("链队的判空为:%d\n", IsEmpty(Q));
while (Q.front != Q.rear)
{
PopQueue(Q, e);
printf("%d ", e);
}
printf("\n");
printf("链队的判空为:%d\n", IsEmpty(Q));
return 1;
}
望指点