1. 程式人生 > >C語言實現鏈佇列的初始化&進隊&出隊

C語言實現鏈佇列的初始化&進隊&出隊

/*連結串列實現佇列的一系列操作*/ 

#include<stdio.h>
#include<stdlib.h> 

#define OK 1
#define ERROR 0

typedef struct node
{
	int data;                		    //資料域 
	struct node *next;       		   //指標域 
}LinkQueueNode;
typedef struct
{
	LinkQueueNode *front;       	   //頭指標 
	LinkQueueNode *rear;               //尾指標 
}LinkQueue;

/**********************各個子函式的定義*********************/
void initQueue(LinkQueue *Q);          //鏈佇列初始化       
int enterQueue(LinkQueue *Q,int n);    //鏈佇列入隊操作 
void deleteQueue(LinkQueue *Q);        //鏈隊列出隊操作 
 
int main()
{
	LinkQueue Q;
	int choice;
	while(true)
	{
        printf("*****************Please enter your choice*****************\n\n");
        printf("                choice 1:Queue initialization\n");
        printf("                choice 2:Into the queue\n");
        printf("                choice 3:Out of the queue\n");
        printf("                choice 0:exit\n\n");
	 	scanf("%d",&choice);
		switch(choice)
		{
			case 1:
				initQueue(&Q);
				break;
			case 2:
				int n;
				printf("Please enter the number into the queue elements:");
				scanf("%d",&n);
				(enterQueue(&Q,n)==1)?printf("%d個元素依次進隊成功\n",n):printf("%d個元素依次進隊失敗\n",n);	
				break;
			case 3:
				deleteQueue(&Q);
				break;	
			case 0:
				exit(0);
				break;
			default:
				printf("ERROR!!\n");
				exit(0);
				break;
		}
	}
	return 0;
}

/**********************各個子函式功能的實現*********************/
void initQueue(LinkQueue *Q)   
{			//將 Q 初始化為一個空鏈佇列 
	Q->front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
	Q->rear=Q->front;
	Q->front->next=NULL;
}

int enterQueue(LinkQueue *Q,int n)  //進佇列 
{
	LinkQueueNode *temp;
	int n1,n2;
	printf("Please enter into the queue elements in turn:\n");  
	for(n1=0;n1<n;n1++)
	{
		scanf("%d",&n2);
		temp=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
		if(temp==NULL) return ERROR;  //申請空間失敗
		temp->data=n2;
		temp->next=NULL;
		Q->rear->next=temp; 
		Q->rear=temp;                 //隊尾指標後移                    
	}
	return OK;
}
 
void deleteQueue(LinkQueue *Q)
{
	int a;
	LinkQueueNode *temp;
	if(Q->front==Q->rear)               //隊為空,出棧失敗 
	{
		printf("An empty Queue error!!!!\n");
	}
	else
	{
		temp=Q->front->next;
		a=temp->data;
		Q->front->next=temp->next;
		if(Q->front==temp)           //如果隊中只有一個元素X,則X出隊後成為空隊 
		{
			Q->rear=Q->front;
		}
		free(temp);                            //釋放儲存空間 
		printf("隊頂元素%d出隊成功.\n",a);   
	}  
}