3.6使用带头结点的循环链表链表表示队列

题目描述:
用带头结点的循环链表表示队列,并设置一个尾指针指向队尾元素。
不设置投指针。编写置队空,判断队空,出队,入队等算法, 




/*
链队结构定义 
*/
//定义节点类型 
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);
} 


  • 14
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值