赞
踩
使队列的头指针和尾指针指向同一个结点,注意将front的next域指向NULL;
//初始化链队列
void InitQueue(LinkQueue &Q){
Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));
Q.front->next=NULL;
}
通过判断队列头指针和尾指针是否指向同一结点即可;
//初始化链队列
bool IsEmpty(LinkQueue Q){
return (Q.front==Q.rear);//返回一个布尔型的参数,返回1则队列空;返回0则队列非空;
}
根据队列先进先出的原理,我们可以通过尾插法实现队列的单向操作,即从尾结点入队元素;
//入队操作(头插法符合头出尾进的原理)
bool EnQueue(LinkQueue &Q,ElemType e){
//由于是链队列,动态申请空间,故不用判断队列是否已满;
LinkNode*s;
s=(LinkNode*)malloc(sizeof(LinkNode));//申请一个新结点用于存放数据,并将入队该结点
s->data=e;
s->next=NULL;
Q.rear->next=s;//尾插法,先将队列尾指向该结点;
Q.rear=s;//该结点成为新的队列尾;
return true;
}
定义一个与所存放的元素类型相同的变量x,用于返回出队的元素 ;
//出队操作
bool DeQueue(LinkQueue &Q,ElemType &x){//由于需要改变x,所以要加引用
if(Q.front==Q.rear){
return false;}
LinkNode*q;
q=Q.front->next;//头结点不存储数据,使q指向第一个存有数据的结点;
x=q->data;
Q.front->next=q->next;//使q结点从链表脱离,即“断链”;
free(q);//不使用该空间后要记得释放掉;
if(q==Q.rear){//如果出队的是队尾元素,要将队列置空,即让头指针和尾指针指向头结点;
Q.rear=Q.front;
Q.front=NULL;}
return true;
}
#include <stdio.h> #include <stdlib.h> #define ElemType int //链队列结点 typedef struct LinkNode{ ElemType data; 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;} //入队操作(头插法符合头出尾进的原理) bool EnQueue(LinkQueue &Q,ElemType e){ LinkNode*s; s=(LinkNode*)malloc(sizeof(LinkNode)); s->data=e; s->next=NULL; Q.rear->next=s; Q.rear=s; return true; } //出队操作 bool DeQueue(LinkQueue &Q,ElemType &x){ if(Q.front==Q.rear){ return false;} LinkNode*q; q=Q.front->next;//头结点不存储数据 x=q->data; Q.front->next=q->next; free(q); if(q==Q.rear){ Q.rear=Q.front; Q.front=NULL;} return true; } //队列判空 bool IsEmpty(LinkQueue Q){ return (Q.front==Q.rear); } int main(){ bool ret; LinkQueue Q; InitQueue(Q); ret=EnQueue(Q,3); if(ret){ printf("入队冲冲");} else{ printf("入队失败");} return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。