(1)链式队列是一个同时带有队头指针和队尾指针的单链表。头指针指向队头结点,尾指针指向队尾结点。
(2)优点:
1.链式队列特别适合处理数据元素变动较大的情况
2.不存在队列满导致溢出的情况。
(3)类型:带头结点和不带头结点
1.创建链式队列
typedef struct LinkNode{
int data;
struct LinkNode *next;
}LinkNode;
typedef struct{
LinkNode *front,*rear;
}LinkQueue;
InitQueue(LinkQueue *L){
L->front = NULL;
L->rear = NULL;
}
2.入队列操作
//[front,1,2,3,4,5,6,7,rear]
bool EnQueue(LinkQueue *L,int enNum){
LinkNode *newNode;
newNode = (LinkNode *)malloc(sizeof(LinkNode)); //定义一个新结点
if(newNode==NULL){//内存已满,新结点分配失败
return false;
}
newNode->data = enNum;//给该结点赋值
newNode->next=NULL;//该结点的后继结点指向空
if(L->front==NULL){//若当前结点为第一个结点
//头尾指针均指向该结点
L->front = newNode;
L->rear = newNode;
}else{
L->rear->next = newNode;// 队尾结点的后继指针指向新结点
L->rear = newNode;//队尾指针后移
}
return true;
}
3.出队列操作
//[front,1,2,3,4,5,6,7,rear]
bool OutQueue(LinkQueue *L,int *outNum){
if(L->front==NULL){//队列为空
return false;
}
LinkNode *agency;//创建一个中介指针
agency = L->front;//中介指针指向队首
*outNum = agency->data;//取出队首元素的值
L->front = agency->next;//队首指针指向下一个结点
if(agency==L->rear){//元素出队后队列空
L->front=NULL;
L->rear=NULL;
}
return true;
}
4.获取队首元素
void GetTop(LinkQueue *L){
int topNum=0;
topNum = L->front->data;
printf("队首元素为%d",topNum);
}
//链式存储实现队列
#include
#include
//[front,1,2,3,4,5,6,7,rear]
typedef struct LinkNode{
int data;
struct LinkNode *next;
}LinkNode;
typedef struct{
LinkNode *front,*rear;
}LinkQueue;
InitQueue(LinkQueue *L){
L->front = NULL;
L->rear = NULL;
}
//[front,1,2,3,4,5,6,7,rear]
bool EnQueue(LinkQueue *L,int enNum){
LinkNode *newNode;
newNode = (LinkNode *)malloc(sizeof(LinkNode)); //定义一个新结点
if(newNode==NULL){//内存已满,新结点分配失败
return false;
}
newNode->data = enNum;//给该结点赋值
newNode->next=NULL;//该结点的后继结点指向空
if(L->front==NULL){//若当前结点为第一个结点
//头尾指针均指向该结点
L->front = newNode;
L->rear = newNode;
}else{
L->rear->next = newNode;// 队尾结点的后继指针指向新结点
L->rear = newNode;//队尾指针后移
}
return true;
}
//[front,1,2,3,4,5,6,7,rear]
bool OutQueue(LinkQueue *L,int *outNum){
if(L->front==NULL){//队列为空
return false;
}
LinkNode *agency;//创建一个中介指针
agency = L->front;//中介指针指向队首
*outNum = agency->data;//取出队首元素的值
L->front = agency->next;//队首指针指向下一个结点
if(agency==L->rear){//元素出队后队列空
L->front=NULL;
L->rear=NULL;
}
return true;
}
void GetTop(LinkQueue *L){
int topNum=0;
topNum = L->front->data;
printf("队首元素为%d",topNum);
}
int main(){
LinkQueue L;
InitQueue(&L);//初始化
//入队操作
int enNum = 0;//记录入队列元素的变量
bool flag;
printf("请向队列中输入元素(输入99结束):");
scanf("%d",&enNum);
while(enNum != 99){
flag=EnQueue(&L,enNum);//入队列
if(flag){
printf("\n请向队列中输入元素(输入99结束):");
scanf("%d",&enNum);
}else{
printf("入队列失败");
exit(0);
}
}
//出队操作
int outNum = 0;//存储出队元素的变量
char elect = NULL;//判断是否继续出队的变量
printf("是否出队元素(y|x):");
scanf("%s",&elect);
while(elect == 'y'){
flag = OutQueue(&L,&outNum); //调用出队操作
if(flag == false){
printf("\n队已空");
exit(0);
}else{
printf("\n出队元素为%d",outNum);
}
printf("\n是否出队元素(y|x):");
scanf("%s",&elect);
}
//读队首元素
GetTop(&L);
}