首页 > 学院 > 开发设计 > 正文

c语言之队列结构

2019-11-06 07:13:17
字体:
来源:转载
供稿:网友

1.什么是队列

队列是一种操作受限的线性表,其限制条件为允许在表的一端进行插入,而在表的另一端进行删除。插入的一端叫做队尾,删除的一端叫做队头。向队列中插入新元素的行为称为进队,从队列中删除元素的行为称为出队。

2.队列的特点

队列的特点是先进先出。举例:火车从山洞一端开进,从山洞另一端开出,车厢好比一个个元素,最先进入山洞的车厢先出,后进山洞的车厢后出。

3.循环队列

循环队列的结构:

代码:

typedef struct SQQueue{	int data[maxsize];	int front;//队首指针	int rear;//队尾指针}SqQueue;

循环队列的状态:

(1)队空状态:

qu.front ==qu.rear(2)队满状态:

(qu->rear+1)%maxsize ==qu->front

循环队列的操作:

(1)进队列:

qu->rear=(qu->rear+1)%maxsize;qu->data[qu->rear]=x;(2)出队列:

*y=qu->data[qu->front];qu->front=(qu->front+1)%maxsize;

循环队列的实现:

#include<stdio.h>#include<stdlib.h>#define maxsize 50typedef struct SqQueue{	int data[maxsize];	int front;//队首指针	int rear;//队尾指针}SqQueue;//创建循环队列SqQueue initQueue(){	SqQueue *sq=(SqQueue *)malloc(sizeof(SqQueue));	if(sq ==NULL){		return;	}	sq->rear=sq->front=0;	return *sq;}//判断循环队列是否为空int isEmpty(SqQueue qu){	return (qu.front ==qu.rear?1:0);}//元素进循环队列int enQueue(SqQueue *qu,int x){	if((qu->rear+1)%maxsize ==qu->front){		return 0;	}	qu->rear=(qu->rear+1)%maxsize;	qu->data[qu->rear]=x;	return 1;}//元素出循环队列int deQueue(SqQueue *qu,int *y){	if(qu->rear ==qu->front){		return 0;	}	*y=qu->data[qu->front];	qu->front=(qu->front+1)%maxsize;	return 1;}//打印循环队列int PRintQueue(SqQueue qu){	if(qu.rear ==qu.front){		return 0;	}	while(qu.rear !=qu.front){		qu.front=(qu.front+1)%maxsize;		printf("当前队列值=%d/n",qu.data[qu.front]);	}	return 1;}void main(){	int y=0;	SqQueue sq =initQueue();	enQueue(&sq,1);	enQueue(&sq,2);	enQueue(&sq,3);	enQueue(&sq,4);	deQueue(&sq,&y);	printQueue(sq);	printf("当前的front=%d/n",sq.front);	printf("当前的rear=%d/n",sq.rear);	}结果:

4.链队列

链队列的结构:

代码:

//链队列结点结构typedef struct QNode{	int data;	struct QNode *next;}QNode;//链队列结构typedef struct LiQueue{	QNode *front;	QNode *rear;}LiQueue;

链队列的状态:

(1)队空

lq->front==NULL || lq->rear==NULL

链队列的操作:

(1)进队列:

lq->rear->next=p;lq->rear=p;(2)出队列:

p=lq->front;lq->front=p->next;x=p->data;free(p);

链队列的实现:

#include<stdio.h>#include<stdlib.h>//链队列结点结构typedef struct QNode{	int data;	struct QNode *next;}QNode;//链队列结构typedef struct LiQueue{	QNode *front;	QNode *rear;}LiQueue;//创建链队列LiQueue initQueue(){	LiQueue *lq=(LiQueue *)malloc(sizeof(LiQueue));	if(lq ==NULL){		return;	}	lq->front=lq->rear=NULL;	return *lq;}//判断链队列是否为空int isEmpty(LiQueue *lq){	if(lq->front==NULL || lq->rear==NULL){		return 0;	}else{		return 1;	}}//元素进链队列void enQueue(LiQueue *lq,int x){	QNode *p;	p=(QNode *)malloc(sizeof(QNode));	p->data=x;	p->next=NULL;	if(lq->rear==NULL){		lq->front=lq->rear=p;//如果第一次插入则设置头指针和尾指针为p	}else{		lq->rear->next=p;//链队列的尾部插入p		lq->rear=p;//设置链队列的尾指针指向p	}}//元素出链队列int deQueue(LiQueue *lq,int *y){	QNode *p=lq->front;	if(lq->rear==NULL || lq->front==NULL){		return 0;	}	if(lq->front==lq->rear){		lq->front=lq->rear=NULL;	}else{		lq->front=lq->front->next;	}	*y=p->data;	free(p);	return 1;}//打印链队列void printQueue(LiQueue lq){	if(lq.front==NULL || lq.rear==NULL){		return;	}	while(lq.front!=NULL){		printf("%d/n",lq.front->data);		lq.front=lq.front->next;	}}void main(){	int y=0;	LiQueue lq=initQueue();	enQueue(&lq,1);	enQueue(&lq,2);	enQueue(&lq,3);	enQueue(&lq,4);	enQueue(&lq,5);	deQueue(&lq,&y);	printQueue(lq);	printf("出队列元素=%d/n",y);}结果:


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表