链队列和循环队列及其应用——杨辉三角
#include<stdio.h>
#include<stdlib.h>
typedef struct Node //链队列;
{
int data;
struct Node *next;
} LinkQueueNode;
typedef struct
{
LinkQueueNode *front;
LinkQueueNode *rear;
} LinkQueue;
void InitQueue(LinkQueue *Q)
{
Q->front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
if(Q->front!=NULL)
{
Q->rear=Q->front;
Q->front->next=NULL;
}
}
void EnterQueue(LinkQueue *Q,int x)
{
LinkQueueNode *NewNode;
NewNode=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));
if(NewNode!=NULL)
{
NewNode->data=x;
NewNode->next=NULL;
Q->rear->next=NewNode;
Q->rear=NewNode;
}
}
void DeleteQueue(LinkQueue *Q,int *x)
{
LinkQueueNode *p;
if(Q->front==Q->rear) return;
p=Q->front->next;
Q->front->next=p->next;
if(Q->rear==p) Q->rear=Q->front;
*x=p->data;
free(p);
}
#define maxn 100
int N;
typedef struct //循环队列;
{
int elem[maxn];
int front;
int rear;
} SeqQueue;
void initQueue(SeqQueue *Q)
{
Q->front=Q->rear=0;
}
void enterQueue(SeqQueue *Q,int x)
{
if((Q->rear+1)%maxn==Q->front) return;
Q->elem[Q->rear]=x;
Q->rear=(Q->rear+1)%maxn;
}
void deleteQueue(SeqQueue *Q,int *x)
{
if(Q->front==Q->rear) return;
*x=Q->elem[Q->front];
Q->front=(Q->front+1)%maxn;
}
void getHead(SeqQueue Q,int *x)
{
*x=Q.elem[Q.front];
}
void YangHuiTriangle() //杨辉三角;
{
SeqQueue Q;
int temp,x;
initQueue(&Q);
enterQueue(&Q,1);
for(int n=2; n<=N; n++)
{
enterQueue(&Q,1);
for(int i=1; i<=n-2; i++)
{
deleteQueue(&Q,&temp);
printf("%d ",temp);
getHead(Q,&x);
temp+=x;
enterQueue(&Q,temp);
}
deleteQueue(&Q,&x);
printf("%d\n",x);
enterQueue(&Q,1);
}
while(Q.front!=Q.rear)
{
deleteQueue(&Q,&x);
printf("%d ",x);
}
printf("\n");
}
int main()
{
int x;
LinkQueue q;
InitQueue(&q);
for(int i=0; i<10; i++) EnterQueue(&q,i);
for(int i=0; i<10; i++)
{
DeleteQueue(&q,&x);
printf("%d ",x);
}
printf("\n");
SeqQueue s;
initQueue(&s);
for(int i=0; i<10; i++) enterQueue(&s,i+10);
for(int i=0; i<10; i++)
{
deleteQueue(&s,&x);
printf("%d ",x);
}
printf("\n");
printf("输入打印几行杨辉三角:\n");
scanf("%d",&N);
YangHuiTriangle();
return 0;
}