1. 程式人生 > >動態佇列,鏈式佇列 + 示意圖

動態佇列,鏈式佇列 + 示意圖

#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