《数据结构》队列的链式表示--链队

前端之家收集整理的这篇文章主要介绍了《数据结构》队列的链式表示--链队前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
/*
队列的链式表示 
*/

#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;
}

/*
链队的入队操作:
思想:1.生成一个新结点,
2.将新结点插入到队尾,修改队尾指针。 
*/ 
int EnQueue(LinkQueue &Q,int e){
	
	struct QNode *p;
	p=new QNode;
	
	if(!p){
		printf("存储分配失败!\n");
		return 0;
	}
	p->data=e;
	p->next=NULL;
	Q.rear->next=p;
	Q.rear=p;
	return 1;
}

/*
链队的出队操作:
思想: 1.首先判断链队是否为空;
2。若队列非空,将对头元素出队,然后修改对头指针。 
*/
int DeQueue(LinkQueue &Q,int &e){
	if(Q.front==Q.rear){
		printf("队列为空!\n");
		return 0;
	}
	struct QNode *p;
	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;
}

/*
计算链队的长度 
思想:
设置一个指针p,让p指向链队的对头元素,当p非空时,length加1. 
*/
int QueueLength(LinkQueue Q){
	int length=0;
	struct QNode *p;
	p=Q.front->next;
	while(p){
		length++;
		p=p->next;
	}
	return length;
}

/*
遍历链队
思想:1.首先获取链队的长度,
2.当变量i小于队列长度时,循环将队列元素出队,并打印出队的元素。 
*/ 
void TraveQueue(LinkQueue Q){
	int len;
	len=QueueLength(Q);
	for(int i=0;i<len;i++){
		int e;
		DeQueue(Q,e);
		printf("%d ",e);
	}
}

int main(){
	LinkQueue Q;
	
	if(InitQueue(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);
		EnQueue(Q,e);
	}
	printf("链队Q的长度:%d\n",QueueLength(Q));
	
	printf("遍历链队:\n");
	TraveQueue(Q);
}

猜你在找的数据结构相关文章