链队列的结构及其操作

/**
 *
 *	作者:LinX   2017-6-16-上午  
 *
 *	内容:链队列的结构及其应用 
 *
 *	看严蔚敏教材上的图解,就很清晰 
 */

#include  
#include 

typedef int ElemType;

typedef struct QNode
{
	
	ElemType data;
	
	struct QNode *next;
	
}QNode,*QueuePtr;

typedef struct
{
	
	QueuePtr front;
	
	QueuePtr rear;
	
}LinkQueue;

/*基本操作*/

LinkQueue* initQueue();							//初始化链队列
	
void EnQue(LinkQueue *Q,ElemType e);			//入队

ElemType DeQue(LinkQueue *Q);					//出队

int isEmpty(LinkQueue *Q);						//判空

void printQue(LinkQueue *Q);					//输出队列 

int main()
{
	
	LinkQueue *Q=initQueue();
	
	EnQue(Q,1);
	
	EnQue(Q,2);
	
	EnQue(Q,3);
	
	printQue(Q);
	
	DeQue(Q);
	
	DeQue(Q);
	
	DeQue(Q);
	
	printQue(Q);
	
	DeQue(Q);
	
	return 0;
	
}

/*初始化链队列*/
LinkQueue* initQueue()
{
	
	LinkQueue *Q=(LinkQueue*)malloc(sizeof(LinkQueue));
	
	//两个指针同时指向一个节点 
	Q->front=(QueuePtr *)malloc(sizeof(QueuePtr));
	
	Q->rear=Q->front;
	
	Q->front->next=NULL;

	return Q;	
}

/*出队*/
ElemType DeQue(LinkQueue *Q)
{
	int e;
	if(isEmpty(Q)==1)
	{
		
		return 0;
				
	}
	
	QNode *p=Q->front->next;
	
	Q->front->next=p->next;
	
	//这里需要注意:如果出队的是最后一个元素,那么尾指针需要调整指向
	 
	if(Q->rear==p)
	{
		//printf("sss");
		Q->front->next=NULL;
		
		Q->rear=Q->front;
			
	}
	
	e=p->data;
	
	free(p);
	
	return e;
} 

/*入队*/
void EnQue(LinkQueue *Q,ElemType e)
{
	
	QNode *s=(QNode*)malloc(sizeof(QNode));
	
	s->data=e;
	
	Q->rear->next=s;
	
	Q->rear=s;	
	
	s->next=NULL;
}

/*打印链队列*/
void printQue(LinkQueue *Q)
{
	
	QNode *p;
	
	p=Q->front->next;
	
	while(p!=NULL)
	{
		
		printf("%d ",p->data);
		
		p=p->next;
		
	}	
	printf("\n");	
}

int isEmpty(LinkQueue *Q)
{
	
	if(Q->front==Q->rear)
	{
		
		printf("\n队空\n");
		
		return 1;
	}
	return 0;
}

你可能感兴趣的:(c++,数据结构,考研,数据结构)