杨辉三角

参照教学章节中的视频讲解,及教材中队列的算法,使用之编写程序,打印出杨辉三角。
COMMON.C
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

SEQ.H
#define QueueElementType int //队列中元素为整数类型
#define MAXSIZE 50 //队列最大长度

//循环队列类型定义
typedef struct
{
QueueElementType element[MAXSIZE]; //队列元素存入数组
int front; //头指示器
int rear; //尾指示器
}SeqQueue;

//循环队列初始化
void InitQueue(SeqQueue *Q);
//循环队列入队
int EneterQueue(SeqQueue *Q,QueueElementType *x);
//循环队列出队
int DeleteQueue(SeqQueue *Q,QueueElementType *x);
//获取队首元素
int GetHead(SeqQueue *Q,QueueElementType *x);

SEQ.C
#include “common.h”
#include “seq.h”

//循环队列初始化
void InitQueue(SeqQueue *Q)
{
Q->front=Q->rear=0; //将队列初始化为空队列
}

//循环队列入队
int EnterQueue(SeqQueue *Q,QueueElementType x)
{
if((Q->rear+1)%MAXSIZE==Q->front) //头指针+1与队尾相同,表示队满了
return FALSE;
Q->element[Q->rear]=x; //x放入队尾
Q->rear=(Q->rear+1)%MAXSIZE; //设置队尾指示器位置+1,如果超出最大位置则要从数组0位置开始
return TRUE;
}

//循环队列出队
int DeleteQueue(SeqQueue *Q,QueueElementType *x)
{
if(Q->front==Q->rear) //队列为空
return FALSE;
*x=Q->element[Q->front]; //出队元素值存入x
Q->front=(Q->front+1)%MAXSIZE; //重新设置队首指针
return TRUE;
}

int GetHead(SeqQueue *Q,QueueElementType *x)
{
if(Q->front==Q->rear)
return FALSE;
*x=Q->element[Q->front];
return TRUE;
}

MAIN.C
#include “seq.h”
#define N 7 //假设打印7层三角

//使用循环队列算法,实现杨辉三角输出
int main()
{
int i,n,j; //循环控制变量
int x,temp; //存放元素值

SeqQueue Q;   //声明一个循环队列 
InitQueue(&Q);  //队列初始化 
EnterQueue(&Q,1);  //第一行元素1进栈 
for(n=2;n<=N;n++)
{
	for(j=N-n+2;j>=1;j--)  //格式控制,每行前输出空白 
	printf(" ");
	
	EnterQueue(&Q,1);    //每层开始为1,入队尾 
	for(i=1;i<=n-2;i++)  //利用(n-1)上一层的元素,产生下一层中间n-2个元素 
	{
		DeleteQueue(&Q,&temp);  //上一层队首元素出队 
		printf("%3d",temp);     //打印上一行元素值 
		GetHead(&Q,&x);         //获取上一行目前元素的值 
		temp=temp+x;            //计算出下一行的值 
		EnterQueue(&Q,temp);    //将新值存入队尾 
	}
	DeleteQueue(&Q,&x);         //上一行最后一个元素出队 
	printf("%3d\n",x);
	EnterQueue(&Q,1);           //每层最后一个为1,入队 
}
//打印出最后一行 
while(Q.front!=Q.rear)          //当队不为空时 
{
	DeleteQueue(&Q,&x);
	printf("%3d",x);
}
return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值