第三章:队列及其应用之一---输出杨辉三角

#include <stdio.h>
#include <string.h>
#define N 100
#define OK 1
#define ERROR 0
int f[N]={0,1,1,0};
//使用一个队列输出n行杨辉三角;
/*
技巧:
    为使第i行与第i+1行数据可以区分开,在两行之间放入一个数字0;
*/
void Print1(int n)
{
    //自己的算法使用一个队列输出杨辉三角;
    int i,j,m;
    //n代表打印n行;
    printf("这是一个打印杨辉三角的函数:\n");
    i=1;j=4;
    /*j=(j+1)%N;*/
    while(n--)
    {
        do{
            int t;
            if(i==0) t=N-1;
            else t=i-1;  //防止当i=0时,i-1溢出;
            f[j]=f[i]+f[t];
            if(f[j]) printf("%d  ",f[j]);
            i=(i+1)%N;j=(j+1)%N;
            m=i-1;
            if(m==-1) m=N-1;
        }while(f[m]);//当f[m]为0时,计算当下并在后面补0,并退出这一重循环;
        f[j]=0;    j=(j+1)%N;    
        printf("\n");
    }
}
typedef struct LinkList
{
    int *x;
    int base,top;
}LinkList;
LinkList L;
void ChuShi(LinkList &L)
{
    //初始化队列函数;
    L.x = new int[N];
    L.top=L.base=0;
    printf("队列初始化完毕!\n");
}
void Jin(LinkList &L,int m)
{
    //将数值m插入队尾;
    L.x[L.base]=m;
    L.base=(L.base+1)%N;
}
void Chu(LinkList &L,int &t)
{
    //最前方的系数出队;
    t=L.x[L.top];
    L.top=(L.top+1)%N;
}
void yanghui(int n)
{
    //书上的方法,也是使用一个队列输出杨辉三角,但具体操作有所不同!
    /*
    好处:
        当你向队列中队尾加入元素的时候,只需要将值得多少传入函数中即可,
    而不需要再去记录队尾的位置,这个在队列的结构体中自己有所体现!
    */
    int i,j;
    Jin(L,1);Jin(L,1);
    int s=0,t;
    for(i=1;i<=n;i++)
    {
        Jin(L,0);//各行之间插入一个0表示区分;
        for(j=1;j<=i+2;j++)
        {
            //处理第i行的i+2个元素;
            Chu(L,t);
            Jin(L,s+t);
            s=t;
            if(j!=i+2) printf("%d  ",s);
        }
        printf("\n");
    }
}
int main()
{
    printf("请输入需要打印的杨辉三角的行数:\n");
    int x;
    scanf("%d",&x);
    /*自己的方法:
    printf("1   1\n");
    Print1(x);
    */

    //书上的方法:
    ChuShi(L);
    yanghui(x);

    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值