题目描述:
用带头结点的循环链表表示队列,并设置一个尾指针指向队尾元素。
不设置投指针。编写置队空,判断队空,出队,入队等算法,
初始化:
用带头结点的循环链表表示队列,并设置一个尾指针指向队尾元素。
不设置投指针。编写置队空,判断队空,出队,入队等算法,
/*
链队结构定义
*/
//定义节点类型
typedef struct QNode{
int data;//数据域
struct QNode *next;//指针域
}QNode,*QueuePtr;
//只设置一个尾指针
typedef struct{
QueuePtr rear;//尾指针
}LinkQueue;
初始化:
就是创建一个只有头结点的循环链表,队列的尾指针指向头结点,头结点的指针域指向头结点本身。
/*
1.首先生成一个头结点,并分配存储空间;
2.初始时,尾指针指向头结点,头结点的指针域指向尾指针
带有一个尾指针,初始时,尾指针指向头结点。
尾指针指向的是链表的最后一个元素,假设尾指针为p,则,p=头结点
这里尾指针是Q.rear,则Q.rear=头结点
*/
int InitQueue(LinkQueue &Q){
Q.rear=new QNode;
if(!Q.rear){
return 0;//存储分配失败
}
Q.rear->next=Q.rear;//
return 1;
}
//判断队列是否为空
/*
由于尾指针指向最后一个结点,所以当尾指针执行那个本身,
即Q.rear->next=Q.rear时,表示队列为空。
*/
int IsEmpty(LinkQueue &Q){
if(Q.rear->next==Q.rear){
return 1;//空
}else{
return 0;
}
}
//将队列置空
//就是将除了头结点以外的结点删除
int InitEmpty(LinkQueue &Q){
//QNode *s;//用节点s暂时保存要删除的节点
Q.rear=Q.rear->next;//将尾指针指向头结点
while(Q.rear=Q.rear->next){
struct QNode *s;
s=new QNode;
s=Q.rear->next->next;//s指向第一个元素(结点)
Q.rear->next->next=s->next;
delete s;
}
return 1;
}
//入队操作
int EnQueue(LinkQueue &Q,int e){
struct QNode *p;
p=new QNode;
if(!p){
return 0;//存储分配失败
}
p->data=e;
p->next=Q.rear->next;
Q.rear->next=p;
Q.rear=p;
return 1;
}
//出队
int DeQueue(LinkQueue &Q,int &e){
if(Q.rear->next==Q.rear){
return 0;//队空
}
struct QNode *p;
p=Q.rear->next->next;//p指向第一个节点
e=p->data;
if(p==Q.rear){
//当只有一个元素时,p出队后,要将队尾指针指向头结点
Q.rear=Q.rear->next;
Q.rear->next=p->next;
}else{
Q.rear->next->next=p->next;
delete p;
}
return 1;
}
#include<stdio.h>
#define MAX 100
/*
链队结构定义
*/
//定义节点类型
typedef struct QNode{
int data;//数据域
struct QNode *next;//指针域
}QNode,*QueuePtr;
//只设置一个尾指针
typedef struct{
QueuePtr rear;//尾指针
}LinkQueue;
/*
1.首先生成一个头结点,并分配存储空间;
2.初始时,尾指针指向头结点,头结点的指针域指向尾指针
带有一个尾指针,初始时,尾指针指向头结点。
尾指针指向的是链表的最后一个元素,假设尾指针为p,则,p=头结点
这里尾指针是Q.rear,则Q.rear=头结点
*/
int InitQueue(LinkQueue &Q){
Q.rear=new QNode;
if(!Q.rear){
return 0;//存储分配失败
}
Q.rear->next=Q.rear;//
return 1;
}
//判断队列是否为空
/*
由于尾指针指向最后一个结点,所以当尾指针执行那个本身,
即Q.rear->next=Q.rear时,表示队列为空。
*/
int IsEmpty(LinkQueue &Q){
if(Q.rear->next==Q.rear){
return 1;//空
}else{
return 0;
}
}
//将队列置空
//就是将除了头结点以外的结点删除
int InitEmpty(LinkQueue &Q){
//QNode *s;//用节点s暂时保存要删除的节点
Q.rear=Q.rear->next;//将尾指针指向头结点
while(Q.rear=Q.rear->next){
struct QNode *s;
s=new QNode;
s=Q.rear->next->next;//s指向第一个元素(结点)
Q.rear->next->next=s->next;
delete s;
}
return 1;
}
//入队操作
int EnQueue(LinkQueue &Q,int e){
struct QNode *p;
p=new QNode;
if(!p){
return 0;//存储分配失败
}
p->data=e;
p->next=Q.rear->next;
Q.rear->next=p;
Q.rear=p;
return 1;
}
//出队
int DeQueue(LinkQueue &Q,int &e){
if(Q.rear->next==Q.rear){
return 0;//队空
}
struct QNode *p;
p=Q.rear->next->next;//p指向第一个节点
e=p->data;
if(p==Q.rear){
//当只有一个元素时,p出队后,要将队尾指针指向头结点
Q.rear=Q.rear->next;
Q.rear->next=p->next;
}else{
Q.rear->next->next=p->next;
delete p;
}
return 1;
}
int main(){
LinkQueue Q;
if(InitQueue(Q)){
printf("链队初始化成功.\n");
}else{
printf("链队初始化失败.\n");
}
if(IsEmpty(Q)){
printf("队列为空.\n");
}else{
printf("队列非空.\n");
}
int n;
printf("请输入入队元素的个数:");
scanf("%d",&n);
for(int i=0;i<n;i++){
int e;
printf("请输入第%d个入队的元素:",i+1);
scanf("%d",&e);
if(EnQueue(Q,e)){
printf("入队成功.\n");
}else{
printf("入队失败.\n");
}
}
int s;
DeQueue(Q,s);
printf("队头元素出队:%d",s);
}