1. 程式人生 > 實用技巧 >鏈式佇列—連結串列實現

鏈式佇列—連結串列實現

#include <stdio.h>
#include <stdlib.h>
/*****************************/
/******  鏈佇列的操作  *******/
/*****************************/
typedef struct QNode //結點 
{
	int data;
	struct QNode * pNext;	
}QNODE ,* PQNODE;

typedef struct  //佇列 
{
	PQNODE front; //隊頭 
	PQNODE rear;  //隊尾 
}QUEUE;

void init(QUEUE * );				//鏈式佇列初始化
bool en_queue(QUEUE * , int);		//入隊
bool out_queue(QUEUE * , int * );	//出隊
void traverse_queue(QUEUE * );		//遍歷
bool empty_queue(QUEUE * );			//判斷佇列是否為空
int main()
{
	QUEUE Q;
	int val;
	
	init(&Q); 
	en_queue(&Q,6);
	en_queue(&Q,5);
	en_queue(&Q,3);
	en_queue(&Q,2);
	printf("入隊後:");
	traverse_queue(&Q);
	
	//出隊操作時,就是頭結點的後繼結點出隊
	if(out_queue(&Q, &val)) //val用來儲存出隊的值【傳地址】
	{
		printf("\n\n出隊成功!出隊的值為: %d\n", val);
	}
	else
	{
		printf("\n\n出隊失敗!\n");
	}	
	printf("\n出隊後:");
	traverse_queue(&Q);

	return 0;
}
/*——————————————————————————————————————————————————————*/
void init(QUEUE * pQ)
{
	pQ->front = pQ->rear = (PQNODE)malloc(sizeof(QNODE)); //建立一個頭結點【隊頭、隊尾同時指向】 
	if(NULL == pQ->front)                                                   
	{
		printf("分配失敗!\n");
		exit(-1);
	}
	pQ->front->pNext = NULL;	
}
/*——————————————————————————————————————————————————————*/
bool en_queue(QUEUE * pQ, int val)
{
	PQNODE pNew = (PQNODE)malloc(sizeof(QNODE));
	if(NULL == pNew)
	{
		printf("分配失敗!\n");
		exit(-1);
	}
	pNew->data = val;
	pNew->pNext = NULL;
	//入隊演算法 
	pQ->rear->pNext = pNew; //第一步
	pQ->rear = pNew;        //第二步
}
/*——————————————————————————————————————————————————————*/
void traverse_queue(QUEUE * pQ)
{
	PQNODE p = pQ->front->pNext; //一定要找一個指標暫存, 跳過頭結點【不能改變頭指標】 
	
	while(p != NULL)
	{
		printf("%d  ", p->data);
		p = p->pNext;
	}
}
/*——————————————————————————————————————————————————————*/
bool out_queue(QUEUE * pQ, int * pval)
{
	if(empty_queue(pQ))
	{
		return false;
	}
	else
	{ 
		//出隊演算法
		PQNODE p = pQ->front->pNext; //儲存出隊的結點 
		*pval = p->data; //儲存出隊的值 
		
		pQ->front->pNext = p->pNext;

		if(pQ->rear == p) //當刪除最後一個有效結點時,頭結點之後沒有其它結點,此時重新使rear = front 
		{pQ->rear = pQ->front;}
		
		free(p);
		return true;
	}
}
/*——————————————————————————————————————————————————————*/	
bool empty_queue(QUEUE * pQ)
{
	if(pQ->front == pQ->rear)//如果front與rear相等,則該佇列就一定為空
	{
		return true;
	}
	else
	{
		return false;
	}
}