1. 程式人生 > >C語言-資料結構-鏈佇列

C語言-資料結構-鏈佇列

**

鏈式佇列

**

使用兩種不同的方式作為初始化, 特點: 一種是傳遞 Init(&Q); 一種是直接P Q = create(); 我覺得還是這種的方式比較靈活,對比見程式

注:我的習慣是直接寫成標頭檔案,方便呼叫

這個程式使用的 是InitQueue(PQueue Q) #ifndef _QUEUECHAIN #define _QUEUECHAIN //宣告標頭檔案 #include “stdio.h” #include “malloc.h” #include “stdbool.h” #include “stdlib.h”

/* 宣告結構體 */ 
typedef struct Node{
	int data;
	struct Node *next;
}Node,*PNode;

typedef struct Stack{
	PNode front, rear; //指向Node的front和rear 
}Queue,*PQueue;


//佇列
//建立建立佇列 Q->front = Q->rear; next = NULL;
//判斷佇列為空 Q->front = Q->rear;
//入隊 新建結點,插入到鏈尾,尾指標指向該結點 Node給rear 
//出隊 判斷隊空; 直接出隊,釋放		輸出front->next 


void InitQueue(PQueue Q)  //這裡傳的是指標 
{
	Q->front = Q->rear = (PNode)malloc(sizeof(Node));
	Q->front->next = NULL;
	return; 
}

bool IsEmpty(PQueue Q)
{
//	printf("dsg\n");
	if(Q->front == Q->rear)
	{
		return true;
	}
	return false;
}


void QueuePosh(PQueue Q, int val)
{
	PNode N = (PNode)malloc(sizeof(Node)); //create temp node
	N->data = val;
	N->next = NULL;
	
	Q->rear->next = N;	//rear to next
	Q->rear = N;	//rear->N
//	printf("%d\n",Q->front->next->data); 
//	printf("%d\n",Q->rear->data);
	return;
}

void QueuePop(PQueue Q,int *val)
{
	if(IsEmpty(Q))
	{
		printf("Queue is Empty!\n");return;
	}
	
 	PNode N = Q->front->next;
 	*val = N->data;
 	Q->front->next = N->next; 
 	if(Q->rear == N) Q->rear = Q->front; //原佇列只有一個結點,刪除後為空 
 	free(N);
 	return;		
}


 //標頭檔案 
//void main()
//{
//	Queue Q; 
//	int val;
//	InitQueue(&Q); //這裡傳的是指標 
//	QueuePop(&Q,&val);
//	QueuePosh(&Q,23);
//	
//	QueuePop(&Q,&val);
//	QueuePop(&Q,&val);
//	
//	QueuePosh(&Q,34);
//	QueuePosh(&Q,4);
//	QueuePosh(&Q,56);
//	QueuePosh(&Q,33);
//	QueuePop(&Q,&val);
//	printf("pop%d\n",val);
//	QueuePop(&Q,&val);
//	printf("pop%d\n",val);
//	printf("\n\nhello world;!\n\n"); 
//	return;
//}
#endif

下面這個是更新的 Create直接返回指著地址

#ifndef __QUEUECHAINCREAT_
#define __QUEUECHAINCREAT_
//宣告標頭檔案 
#include "stdio.h"
#include "malloc.h"
#include "stdbool.h"
#include "stdlib.h"
/* 宣告結構體 */ 
typedef struct Node{
	int data;
	struct Node *next;
}Node,*PNode;

typedef struct Stack{
	PNode front, rear; //指向Node的front和rear 
}Queue,*PQueue;

//佇列
//建立建立佇列 Q->front = Q->rear; next = NULL;
//判斷佇列為空 Q->front = Q->rear;
//入隊 新建結點,插入到鏈尾,尾指標指向該結點 Node給rear 
//出隊 判斷隊空; 直接出隊,釋放		輸出front->next 


//這種初始化比較方便,在後面的程式中就可以直接使用Q指標,而不需要在使用&Q來改變Q裡面的資料 
PQueue CreatQueue()
{
	PQueue Q = (PQueue)malloc(sizeof(Queue)); //開闢PQueue指標的空間 
	Q->front = Q->rear = (PNode)malloc(sizeof(Node)); //開闢結點的空間,此時front和rear都指向一個位置 
	Q->front->next = NULL;
	return Q;	 
} 

bool IsEmpty(PQueue Q)
{
	if(Q->front == Q->rear)
	{
		return true;
	}
	return false;
}


void QueuePosh(PQueue Q, int val)
{
	PNode N = (PNode)malloc(sizeof(Node)); //create temp node
	N->data = val;
	N->next = NULL;
	Q->rear->next = N;	//rear to next
	Q->rear = N;	//rear->N
	return;
}

void QueuePop(PQueue Q, int *val)
{
	if(IsEmpty(Q))
	{
		printf("Queue is Empty!\n");return;
	}
	
 	PNode N = Q->front->next;
 	*val = N->data;
 	Q->front->next = N->next; 
 	if(Q->rear == N) Q->rear = Q->front; //原佇列只有一個結點,刪除後為空 
 	free(N);
 	return;		
}



//void main()
//{
//	PQueue Q = CreatQueue(); 
//	int val;
//
//	QueuePop(Q,&val);
//	QueuePosh(Q,23);
//	
//	QueuePop(Q,&val);
//	QueuePop(Q,&val);
//	
//	QueuePosh(Q,34);
//	QueuePosh(Q,4);
//	QueuePosh(Q,56);
//	QueuePosh(Q,33);
//	QueuePop(Q,&val);
//	printf("pop%d\n",val);
//	QueuePop(Q,&val);
//	printf("pop%d\n",val);
//} 
#endif