佇列(楊輝三角)——鏈式佇列

神石石發表於2020-12-08

佇列的特點:先進先出

鏈式佇列的楊輝三角的程式碼塊:

#include<stdio.h>
#include<malloc.h>
typedef int DataType;
#define MaxSize 100
//結點型別定義
typedef struct QNode{
	DataType data;
	struct QNode *next;
}LQNode,*QueuePtr;
//佇列型別定義
typedef struct {
	QueuePtr front;
	QueuePtr rear;
}LinkQueue;
void PrintArray(int a[],int n,int N);
void YangHuiTriangle(int N);


//鏈式佇列的初始化
int InitQueue(LinkQueue *LQ){
	LQ->front=LQ->rear=(LQNode*)malloc(sizeof(LQNode));
	if(LQ->front!=NULL){
		LQ->front->next=NULL;
	}
} 
//鏈式佇列的是否為空
int	QueueEmpty(LinkQueue LQ){
	if(LQ.rear==LQ.front){
		return 1;
	}else{
		return 0;
	}
} 
//入隊操作
int EnQueue(LinkQueue *LQ,DataType e){
	LQNode *s;
	s=(LQNode*)malloc(sizeof(LQNode));
	if(!s){
		return 0;
	}
	s->data=e;
	s->next=NULL;
	LQ->rear->next=s;
	LQ->rear=s;
	return 1;
} 
//出隊操作
int DeQueue(LinkQueue *LQ,DataType *e){
	LQNode *s;
	if(LQ->front==LQ->rear){
		return 0;
	}else{
		s=LQ->front->next;//頭結點的下面第一個結點 
		*e=s->data;
		LQ->front->next=s->next;//將第二個結點的指標賦值 
		if(LQ->rear==s){
			LQ->rear=LQ->front;
		} 
		free(s);
		return 1; 
	}
} 
//取隊頭元素
int GetHead(LinkQueue LQ,DataType *e){
	LQNode *s;
	if(LQ.front==LQ.rear){
		return 0;
	}else{
		s=LQ.front->next;
		*e=s->data;
		return 1;
	}
} 
//清空佇列
void ClearQueue(LinkQueue *LQ){
	while(LQ->front!=NULL){
		LQ->rear=LQ->front->next;
		free(LQ);
		LQ->front=LQ->rear;
	} 
}
//鏈式列表實現列印楊輝三角
void YangHuiTriangle(int N){
	int i,k,n;
	DataType e,t;
	//建立定義一個臨時陣列,用於存放每一行的元素
	int temp[MaxSize];
	LinkQueue Q;
	k=0;
	//初始化佇列
	InitQueue(&Q) ;
	//第一行元素入隊
	EnQueue(&Q,1);
	//產生第n行元素入隊 同時將n-1行元素儲存到臨時陣列中
	for(n=2;n<=N;n++){
		k=0;
		//將第n行的第一個元素入隊 
		EnQueue(&Q,1);
		//利用佇列中第n-1行元素產生第i行的中間n-2個元素入隊 
		for(i=1;i<=n-2;i++){
			DeQueue(&Q,&t);
			// 將第n-1行的元素存入臨時陣列
			temp[k++]=t;
			//取隊頭元素
			GetHead(Q,&e);
			//利用隊中第n-1行元素產生第i個元素 
			t=t+e; 
			//儲存
			EnQueue(&Q,t); 
		} 
		DeQueue(&Q,&t);
		//將第n-1行的最後一個元素存入臨時陣列
		temp[k++] =t;
		PrintArray(temp,k,N);
		//將n行最後一個元素入隊 
		EnQueue(&Q,1);
	} 
	k=0;
	while(!QueueEmpty(Q)){
		DeQueue(&Q,&t);
		temp[k++]=t;
		if(QueueEmpty(Q)){
			PrintArray(temp,k,N);
		}
	} 
} 
//列印陣列 
void PrintArray(int a[],int n,int N){
	int i;
	static int count=0;
	//列印空格 
	for(i=0;i<N-count;i++){
		printf("  ");
	}
	count++;
	for(i=0;i<n;i++){
		printf("%6d",a[i]);
	} 
	printf("\n");
}


//主函式
int main(){
	int n;
	printf("請輸入要列印的行數:");
	scanf("%d",&n);
	YangHuiTriangle(n);
	return 1;
} 

實際效果圖:
在這裡插入圖片描述

相關文章