动态队列,链式队列 + 示意图


#include <stdio.h>
#include <malloc.h>
//动态队列,链式队列 
typedef struct Node{
	int data;
	struct Node * pNext; 
}NODE,*PNODE; 
typedef struct Queue{
	PNODE front;//队列的出队处 
	PNODE rear;//队列的入队处 
}QUEUE,*PQUEUE; 

void init(PQUEUE);//队列的初始化
void in(PQUEUE);//入队
void out(PQUEUE,int *);//出队,以及返回出队的元素 
int getSize(PQUEUE);//得到队列的长度 
void printQueue(PQUEUE);//打印队列 
bool is_empty(PQUEUE); 

int main(void){
	QUEUE Q;
	int val; 
	init(&Q); 
	in(&Q); 
	in(&Q);
	in(&Q);
	in(&Q);
	in(&Q);
	printQueue(&Q); 
	out(&Q,&val);
	printf("出队的元素是:%d\n",val); 
	printQueue(&Q);
	out(&Q,&val);
	printf("出队的元素是:%d\n",val); 
	printQueue(&Q);  
	return 0; 
} 
//队列的初始化
void init(PQUEUE pQ){
	pQ->front = (PNODE)malloc( sizeof(NODE) );
	if(NULL ==  pQ->front){
		printf("内存分配失败,初始化失败\n");
		exit(-1); 
	} 
	pQ->rear = pQ->front;
	pQ->front->pNext = NULL; 
} 
//入队
void in(PQUEUE pQ){
	printf("请输入你要入队的元素值:");
	int val; 
	scanf("%d",&val);
	PNODE pNew = (PNODE)malloc( sizeof(NODE) );
	pNew->data = val;//因为是先进先出,故指针的方向是从font指向到real 
	pNew->pNext = NULL; 
	pQ->rear->pNext = pNew;
	pQ->rear = pNew; 
}
//出队	 
void out(PQUEUE pQ,int * pVal){
	if(is_empty(pQ) ){
		printf("当前队列为空,不能出队"); 
		return; 
	} 
	PNODE p = pQ->front->pNext; //因为在初始化的时候pQ->front是为NULL的,所以要用pQ->front->pNext
	*pVal = p->data; 
	pQ->front->pNext = p->pNext;
        //一般情况下删除队列头元素时仅需修改头结点中的指针,但当队列中最后一个元素被删后,队列尾指针
        //也丢失了,因此需对尾指针重新赋值(指向头结点) 
        if(pQ->rear == p) 
           pQ->rear = pQ->front; 
	free(p); 
}
//是否为空 
bool is_empty(PQUEUE pQ){
	if(pQ->rear == pQ->front){
		return true; 
	} return false; 
}
//得到队列长度 
int getSize(PQUEUE pQ){
	if(is_empty(pQ) ){
		return 0; 
	}
	PNODE p = pQ->front;
	int count=0; 
	while(p != pQ->rear){
		p = p->pNext; 
		count++;
	} 
	return count; 
} 
//打印队列
void printQueue(PQUEUE pQ){
	if(is_empty(pQ) ){
		printf("当前队列为空,不能打印"); 
		return ; 
	}	
	PNODE p = pQ->front;
	int size = getSize(pQ); 
	printf("该队列的%d个元素如下:",size); 
	while(p != pQ->rear){ 
		p = p->pNext; 
		printf("%d ",p->data); 
	} 
	printf("\n"); 
} 

上面的指针也可这么指向操作:front始终指向第一个元素的空间,rear指向最后一个元素的pNext内存空间NULL

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值