下面将实现队列的链式存储结构(C语言)
(1)队列的顺序存储
队列的顺序存储结构又称为顺序队列,它也是利用一组地址连续的存储单元存放队列中的元素。由于队中元素的插入和删除限定在表的两端进行,因此设置队头指针和队尾指针,分别指示出当前的队首元素和队尾元素。
在顺序队列中,为了降低运算的复杂度,元素入队时,只修改队尾指针;元素出对时,只修改队头指针。由于顺序队列的存储空间是提前设定的,因此队尾指针会有一个上限值,当队尾指针达到其上限时,就不能只通过修改队尾指针来实现新元素的入队操作了。此时,可将顺序队列假象成一个环状结构,称之为循环列表。
(2)队列的链式存储
队列的链式存储也称为链队列。为了便于操作,可给链队列添加一个头结点,并令头指针指向头结点。队列为空的判断条件是头指针和尾指针的值相同,且均指向头结点。(另一种方式为不带头结点的)
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;//将 ElemType定义为Int型
//队列的链式存储可以看作为一个链表带有头尾指针
typedef struct LinkNode{
ElemType data;
struct LinkNode *next;
}LinkNode;
typedef struct{
LinkNode *front,*rear;
int lenth; //队列长度
}LinkQueue;
void InitQueue(LinkQueue &Q){
Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));//建立头结点,初始化让头尾指针都指向头结点 (带头结点的)
Q.front->next=NULL;
Q.lenth=0;
/*Q.front=NULL;//不带头节点
Q.rear=NULL;
Q.lenth=0;*/
}
//判空
bool IsEmpty(LinkQueue Q){
if(Q.front==Q.rear)
if(Q.front==NULL) //不带头结点的
return true;
else
return false;
}
//入队
void EnQueue(LinkQueue &Q,ElemType x){
LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));//创建新节点
s->data=x;//给新节点赋值
s->next=NULL;
Q.rear->next=s;//新节点插入到尾指针后
Q.rear=s;//尾指针后移
Q.lenth++;
/*LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));//创建新节点
s->data=x;//给新节点赋值
if(Q.front==NULL){//不带头结点第一次入队要判断是否为空,要是空则头尾指针都指向S
Q.front=s;
Q.rear=s;
}
else{//不为空则直接在尾指针后面操作
Q.rear->next=s;
Q.rear=s;
}
Q.lenth++;*/
}
//出队
bool DeQueue(LinkQueue &Q,ElemType &x){
if(Q.front==Q.rear)
return false;//对空报错
LinkNode *p=Q.front->next;
x=p->data;//用x变量带回数据
Q.front->next=p->next;//修改头结点的next指针
if(Q.rear==p)//如果是最后一个元素出栈,则将头尾指针都指向头结点
Q.rear=Q.front;
free(p);//释放结点空间
Q.lenth--;
return true;
/*//不带头结点
if(Q.front==NULL)
return false;//对空报错
LinkNode *p=Q.front;
x=p->data;
Q.front=p->next;
if(Q.rear==p){
Q.rear=NULL;
Q.front=NULL;
}
free(p);
Q.lenth--;
return true;*/
}
int Lenth(LinkQueue Q,ElemType &x){
x=Q.lenth;
return x;
}
int main(){
LinkQueue Q;
InitQueue(Q);
ElemType i;//循环入队
for(i=1;i<=100;i++){
EnQueue(Q,i);
}
ElemType x;
Lenth( Q,x);
printf("此时队列长为%d\n",x);
//循环出队
ElemType h;
for(h=1;h<=8;h++){
DeQueue(Q,h);
printf("%d已出队\n",h);
}
ElemType p;
Lenth( Q,p);
printf("此时队列长为%d\n",p);
//判断此时队列是否为空
if(IsEmpty(Q))
printf("此时队列为空\n");
else
printf("此时队列不为空\n");
return 0;
}
此时队列长为100
1已出队
2已出队
3已出队
4已出队
5已出队
6已出队
7已出队
8已出队
此时队列长为92
此时队列不为空