1. 程式人生 > >佇列的鏈式儲存的兩種定義方式

佇列的鏈式儲存的兩種定義方式

佇列的鏈式儲存的定義結點、初始化、判斷空、入隊、出隊、讀取隊頭元素、求佇列長度操作

方法一:

這種鏈佇列有頭指標,上圖分別為鏈佇列為空、非空、只有一個元素的時候的情況,

程式碼如下:

//佇列的鏈式儲存和操作的實現 
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int DataType;
typedef struct Node{     //定義鏈隊結點的型別
	DataType data;
	struct Node *next;
}LinkNode;
typedef struct{         //將頭尾指標封裝在一起的鏈佇列
	LinkNode *front,*rear;
}LinkQueue;
void Init_Queue(LinkQueue *&q)   //佇列初始化,使front和rear都指向頭佇列的頭結點 
{
	q=(LinkQueue*)malloc(sizeof(LinkQueue)); 
	LinkNode *p;     
	p=(LinkNode*)malloc(sizeof(LinkNode));
	p->next=NULL;
	q->front=q->rear=p;
}
int Queue_Empty(LinkQueue *q)  //判斷空操作
{
	if(q->front==q->rear)
	return 1;
	else
	return 0;
 }
void Push_Queue(LinkQueue *q,DataType x) //入佇列操作
{
	LinkNode *p;
	p=(LinkNode*)malloc(sizeof(LinkNode));
	p->data=x;
	p->next=NULL;
	q->rear->next=p;
	q->rear=p;
}
void GetHead_Queue(LinkQueue *q)  //讀取隊頭元素 
{
	LinkNode *p;
	if(Queue_Empty(q))
	printf("Queue is Empty\n");
	else
	{
		p=q->front->next;
		DataType x=p->data;
		printf("%d\n",x);
	}
 }
void Pop_Queue(LinkQueue *q)  //出隊操作 
{
	LinkNode *p;
	if(Queue_Empty(q))
	printf("Queue is Empty\n");
	else
	{
		p=q->front->next;
		q->front->next=p->next;
		if(p->next==NULL)
		q->rear=q->front;
		free(p);
	}
 } 
void Queue_Length(LinkQueue *q)  //求佇列的長度 
{
	int t=0;
	LinkNode *p;
	p=q->front->next;
	while(p!=NULL)
	{
		t++;
		p=p->next;
	}
	printf("Queue Length is %d\n",t); 
}
int main()
{
	LinkQueue *q;
	Init_Queue(q);
	
	Push_Queue(q,1);
	Push_Queue(q,2);
	Push_Queue(q,3);
	
	Queue_Length(q); 
	GetHead_Queue(q);
	
	Pop_Queue(q);
	
	Queue_Length(q);
	GetHead_Queue(q);
}

方法二:

這種鏈佇列無頭結點,上圖分別為鏈佇列為空,元素進隊的情況

程式碼如下:

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int DataType;
typedef struct Node{   //定義鏈隊結點的型別 
	DataType data;
	struct Node *next;
}LinkNode; 
typedef struct{       //將頭尾指標封裝在一起的鏈佇列 
	LinkNode *front,*rear;
}LinkQueue;
void Init_Queue(LinkQueue *&q)  //佇列初始化 
{
	q=(LinkQueue*)malloc(sizeof(LinkQueue));
	q->front=NULL;
	q->rear=NULL;
}
void Push_Queue(LinkQueue *q,DataType x)  //入隊操作 
{
	LinkNode *p;
	p=(LinkNode*)malloc(sizeof(LinkNode));
	p->data=x;
	p->next=NULL;
	if(q->front==NULL)
	{
		q->front=p;
		q->rear=p;
	}
	else
	{
		q->rear->next=p;
		q->rear=p;
	 } 
}
int Queue_Empty(LinkQueue *q)  //判斷空操作 
{
	if(q->front==NULL)
	return 1;
	else
	return 0;
}
void Pop_Queue(LinkQueue *q)  //出隊操作 
{
	LinkNode *p;
	if(Queue_Empty(q))
	printf("Queue is Empty");
	else
	{
		p=q->front;
		q->front=p->next;
		if(q->front==NULL)
		q->rear=NULL;
		free(p);
	}
 } 
void GetHead_Queue(LinkQueue *q) //讀取隊頭元素 
{
	if(Queue_Empty(q))
	printf("Queue is Empty!\n");
	else 
	printf("%d\n",q->front->data);
}
void Queue_Length(LinkQueue *q)  //求佇列的長度 
{
	LinkNode *p;
	p=q->front;
	int t=0;
	while(p!=NULL)
	{
		t++;
		p=p->next; 
	}
	printf("Queue Length is %d\n",t);
}
int main()
{
	LinkQueue *q;
	Init_Queue(q);
	
	Push_Queue(q,1);
	Push_Queue(q,2);
	Push_Queue(q,3);
	
	Queue_Length(q);
	GetHead_Queue(q);
	
	Pop_Queue(q);
	
	Queue_Length(q);
	GetHead_Queue(q);
}