数据结构:利用队列打印杨辉三角

杨辉三角。如图所示。

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

1 6 15 20 15 6 1

按三角形的形式输出N=7时的杨辉三角。

要求程序通过一个主菜单(1.输入N;2.构建杨辉三角;3.输出;4.退出)调用各功能函数。

复制代码
#include <stdio.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE 1
#define MAXSIZE 50
typedef struct
{
    int element[MAXSIZE];
    int front;
    int rear;
}SeqQueue;

int menu_select();    //菜单驱动程序
SeqQueue* CreateYangHuiTriangle(SeqQueue *Q,SeqQueue *TQ,int N);        //创建顺序表
void PrintYangHuiTriangle(SeqQueue *WQ,int n);            //输出顺序表信息
int CountYangHuiTriangle();
void InitQueue(SeqQueue *Q);
int EnterQueue(SeqQueue *Q,int x);
int DelQueue(SeqQueue *Q,int *x);
int GetHead(SeqQueue *Q,int *x);
int IsEmpty(SeqQueue *Q);

int menu_select()    //菜单驱动程序
{
    int sn;
    printf("       杨辉三角管理系统\n");        //显示菜单
    printf("==============================\n");
    printf("   1、建立几层杨辉三角\n");
    printf("   2、杨辉三角的建立:\n");
    printf("   3、杨辉三角的输出\n");
    printf("   0、退出杨辉三角管理系统\n");
    printf("==============================\n");
    printf("  请选择0--3:  ");

    for(;;)        //菜单功能选择
    {
        scanf("%d",&sn);
        if(sn<0 || sn>3)
            printf("\n输入选择错误,请重新选择 0--3: ");
        else
            break;
    }
    return sn;
}


void InitQueue(SeqQueue *Q)//初始化
{
    Q->front=Q->rear=0;
}

int EnterQueue(SeqQueue *Q,int x)//入队
{
    if((Q->rear+1)%MAXSIZE==Q->front)
        return (FALSE);
    Q->element[Q->rear]=x;
    Q->rear=(Q->rear+1)%MAXSIZE;
    return (TRUE);
}

int DelQueue(SeqQueue *Q,int *x)//出队
{
    if(Q->front==Q->rear)
        return(FALSE);
    else
    {
        *x=Q->element[Q->front];
        Q->front=(Q->front+1)%MAXSIZE;
    }
    return (TRUE);
}

int GetHead(SeqQueue *Q,int *x)//取对头元素
{
    if(Q->front==Q->rear)
        return (FALSE);
    *x=Q->element[Q->front];
    return (TRUE);
}

int IsEmpty(SeqQueue *Q)
{
    if(Q->rear==Q->front)
        return (TRUE);
    else
        return (FALSE);
}

int CountYangHuiTriangle()
{
    int n;
    scanf("%d",&n);
    return n;
}
/*TODO:打印队列WQ的数据
功能描述:队列WQ已经保存了所有入队的元素,根据层数n,输出n层数据,每层的数据有n个,每层输出完后用用printf("\n")结束
 为了显示成三角形,数字输出格式为printf("%2d",a);每一层没有数字的部分用printf("  ") 来前后填充,
参数说明: WQ-SeqQueue型队列指针 用来保存杨辉三角所有的数字
       n-整型 层数
返回值说明:无
比如:
               1
             1   1
           1   2   1
         1   3   3   1
       1   4   6   4   1
     1   5  10  10   5   1
   1   6  15  20  15   6   1
*/
void PrintYangHuiTriangle(SeqQueue *WQ,int n)
{
    int i,j,a,m,b;
    SeqQueue *P;
    P = WQ;
    if(P->front!=P->rear)
    {
        b=2*n;
        for(i=0;i<=n;i++)
        {
            for(j=0;j<i;j++)
            {
                //TODO:从队列P中出队,并赋值给a
                if(a==1 && a==P->element[j]-j)
                {
                    for(m=0;m<=(b+1)/2;m++)
                    {
                        //TODO:输出打印两个空格
                    }
                }
                //TODO:输出打印a
                //TODO:输出打印两个空格
            }
            //TODO:输出打印换行
            b-=2;
        }
    }
}
/*TODO:创建SeqQueue型队列存储杨辉三角所有的数字
功能描述:根据杨辉三角的特性,操作队列TQ,根据出队一层的数据计算出下一层的数据并入队,并且在此过程中,将出队的数据入队到队列Q中
最后把TQ队列没有出队的数据全部出队,并入队到Q中返回
参数说明: Q-SeqQueue型队列指针 用来保存杨辉三角所有的数字
       TQ-SeqQueue型队列指针  用来保存中间产生的数据
       N-整型 层数
返回值说明:SeqQueue型队列的指针
*/
SeqQueue* CreateYangHuiTriangle(SeqQueue *Q,SeqQueue *TQ,int N)
{

}
int main(void)
{
    int n;
    SeqQueue *WQ = malloc(sizeof(SeqQueue));
    SeqQueue *TMP = malloc(sizeof(SeqQueue));
    for(;;) // 无限循环,选择0 退出
    {
        switch(menu_select())     // 调用菜单函数,按返回值选择功能函数
        {
            case 1:
                printf("请输入你要建立几层杨辉三角:\n");//输出顺序表信息的函数调用
                n=CountYangHuiTriangle();
                break;
            case 2:
                printf("杨辉三角已建立!\n");    //建立杨辉三角的函数调用
                if(n==0){
                    printf("请输入你要建立几层杨辉三角:\n");
                    n=CountYangHuiTriangle();
                    break;
                }
                WQ = CreateYangHuiTriangle(WQ,TMP,n);
                break;
            case 3:
                if(n==0){
                    printf("请输入你要建立几层杨辉三角:\n");
                    n=CountYangHuiTriangle();
                    break;
                }
                if(WQ->front==WQ->rear){
                    printf("请建立杨辉三角:\n");
                    break;
                }
                PrintYangHuiTriangle(WQ,n);//输出顺序表信息的函数调用
                break;
            case 0:
                printf(" 再见!\n");                //退出系统
                free(WQ);
                free(TMP);
                return 0;
        } // switch语句结束
    } // for循环结束
    return 0;
} // main()函数结束
复制代码

 

posted @   Oo名字不好取oO  阅读(690)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示