数据结构:利用队列打印杨辉三角
杨辉三角。如图所示。
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()函数结束
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通