杨辉三角的队列实现

#include <stdio.h>
#include <stdlib.h>

//宏定义
#define OK 1
#define ERROR 0

//类型定义
typedef int QElemType;
typedef int Status;

//链队结点定义
typedef struct QNode
{
  QElemType  data;
  struct QNode *next;
}QNode,*QueueNode;

//链队定义
typedef struct LQueue
{
  QueueNode front;
  QueueNode rear;
}LQueue,*LinkQueue;

//构造一个空队列
Status InitQueue(LinkQueue Q)
{
  Q->front=Q->rear=(QueueNode)malloc(sizeof(QNode));
  if(!Q->front)
  {
    printf("构造空队列失败,系统内存不足!\n");
    return ERROR;
  }
  
  Q->front->next=NULL;
  return OK;
}

//销毁一个队列
Status DestroyQueue(LinkQueue Q)
{ 
  while(Q->front)
  {
    Q->rear=Q->front->next;
    free(Q->front);
    Q->front=Q->rear;
  }
  free(Q);
  printf("成功销毁该队列!\n");
  return OK;
}

//插入元素e为Q的新的队尾元素
Status EnQueue(LinkQueue Q,QElemType e)
{
  QueueNode p=(QueueNode)malloc(sizeof(QNode));
  if(!p)
  {
    printf("插入元素失败,系统内存不足!\n");
    return ERROR;
  }
  
  p->data=e;
  p->next=NULL;
  Q->rear->next=p;
  Q->rear=p;
  return OK;
}

//若队列不空,则删除Q的队头元素,并用e返回其值,并返回OK,否则返回ERROR
Status DeQueue(LinkQueue Q,QElemType *e)
{
  QueueNode p;
  
  if(Q->front==Q->rear)
  {
    printf("删除元素失败,队列已空!\n");
    return ERROR;
  }
  
  p=Q->front->next;
  *e=p->data;
  Q->front->next=p->next;
  if(Q->rear==p)
  {
    Q->rear=Q->front;
  }
  free(p);
  return OK;
}

//初始化杨辉三角
Status InitYangHui(LinkQueue Q)
{
  EnQueue(Q,0);
  EnQueue(Q,1);
  EnQueue(Q,0);
  return OK;
}

//打印杨辉三角
Status PrintYangHui(LinkQueue Q,int n)
{
  int i,j,e;
  
  //单独打印第一行
  for(i=1;i<=n-1;i++)//对显示的数据进行排版
    printf("\t");
  
  printf("%d\n",Q->front->next->next->data);
  
  //从第二行开始打印
  for(i=2;i<=n;i++)
  {
    for(j=1;j<=n-i;j++) //对显示的数据进行排版
      printf("\t");
    
    do
    {
      DeQueue(Q,&e);
      e=e+Q->front->next->data;
      EnQueue(Q,e);
      printf("%d\t\t",e);
    }while(Q->front->next->data!=0);  //当第二次取队头元素为0时,结束循环
    
    printf("\n"); //每次打印一行过后,换行
    EnQueue(Q,0); //每次循环后,在队尾增加一个0,以保证下次循环的进行
  }
  return OK;
}
int main()
{
  int n;
  LinkQueue Q=(LinkQueue)malloc(sizeof(LQueue));
  InitQueue(Q);
  InitYangHui(Q);
  printf("请输入杨辉三角的层数n:\n");
  scanf("%d",&n);
  PrintYangHui(Q,n); 
  DestroyQueue(Q);  //释放内存,防止内存泄漏
  return 0;
}

    原文作者:杨辉三角问题
    原文地址: https://blog.csdn.net/qin_jin_blog/article/details/22063299
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞