/*
队列的链式表示和实现 (带头结点的链式队列)
*/
#include<stdio.h>
//定义
typedef struct QNode{
int data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
/*
初始化:
算法思想:生成一个头结点,是队头指针和队尾指针都指向该头结点,
并将头结点的指针域置空。
*/
int InitQueue(LinkQueue &Q){
//构造一个空队列
Q.front=Q.rear=new QNode;
if(!Q.front){
return 0;//没有生成头结点,初始化失败.
}
Q.front->next=NULL;
return 1;
}
/*
入队操作:
算法思想:首先为入队的元素分配一个新的结点,将新元素插入到队尾;
并修改队尾指针的值.
*/
int EnQueue(LinkQueue &Q,int e){
//插入e为Q的新的队尾元素
struct QNode *s;
s=new QNode;
if(!s){
return 0;//存储分配失败
}
s->data=e;
s->next=NULL;
Q.rear->next=s;
Q.rear=s;//修改尾指针
return 1;
}
/*
链队出队算法:
首先判断队列是否为空,若空返回0;否则取出Q的队头元素,用
e返回其值,修改指针。另外考虑当队列的最后一个元素被删除时,队列的尾指针就
消失了需要修改尾指针,让其指挥头结点.
*/
int DeQueue(LinkQueue &Q,int &e){
struct QNode *p;
if(Q.front==Q.rear){
return 0;//队列为空
}
p=Q.front->next;//指针p指向队列的第一个元素
e=p->data;
Q.front->next=p->next;
if(Q.rear==p){
Q.rear=Q.front;
}
delete p;
return 1;
}
int main(){
LinkQueue Q;
if(InitQueue(Q)){
printf("链队Q初始化成功!\n");
}else{
printf("链队Q初始化失败!\n");
}
int n;
printf("请输入入队元素的个数:");
scanf("%d",&n);
for(int i=0;i<n;i++){
int e;
printf("请输入地%d个入队的元素:",i+1);
scanf("%d",&e);
EnQueue(Q,e);
}
int e;
DeQueue(Q,e);
printf("队头元素:%d",e);
}
队列的链式表示和实现
最新推荐文章于 2024-09-28 12:26:44 发布