数据结构 链队列的建立及其函数 C语言版

来源:互联网 发布:故宫神思知乎 编辑:程序博客网 时间:2024/06/05 17:43
#include <cstdio>#include <stdlib.h>typedef int QueueElementType;typedef struct Node{    QueueElementType data;    struct Node  *next;} LinkQueueNode;  //定义队列结点typedef struct{    LinkQueueNode *front; //队列头结点指针    LinkQueueNode *rear;  //队列尾结点指针} LinkQueue;  //定义队列int InitQueue(LinkQueue *Q )  //初始化队列{    Q->front=(LinkQueueNode * )malloc(sizeof(LinkQueueNode));    if(Q->front != NULL)    {        Q->rear=Q->front;        Q->front->next=NULL;        return 1;    }    else return 0;//溢出}int EnterQueue(LinkQueue *Q,QueueElementType x) //元素x入链队列 尾插法{    LinkQueueNode * newnode;    newnode=(LinkQueueNode *) malloc(sizeof(LinkQueueNode));    if(newnode != NULL)    {        newnode->data=x;        newnode->next=NULL;        Q->rear->next=newnode;        Q->rear=newnode;        return 1;    }    else return 0;}int GetHead(LinkQueue *Q,QueueElementType *x){    if(Q->front==Q->rear && Q->front->next==NULL) return 0;    *x=Q->front->next->data;    return 1;}int DeleteQueue(LinkQueue *Q,QueueElementType *x ) //链队列出队 从开始的头开始取{    LinkQueueNode *p;    if(Q->front==Q->rear)        return 0;    p=Q->front->next;    Q->front->next=p->next;    if(Q->rear==p )         Q->rear=Q->front;  //如果去掉结点p后,队列为空 不要忘记将队列置空    *x=p->data;    free(p);    return 1;}int IsEmpty(LinkQueue *Q) //队列为空返回1  不为空返回0{    if(Q->front==Q->rear ) return 1;    else return 0;}int N; //杨辉三角总行数void YangHuiTriangle() //打印杨辉三角{    LinkQueue Que;    InitQueue(&Que);    EnterQueue(&Que,1);    for(int n=2;n<=N;n++)  //生成到N行数据  打印出N-1行数据    {        EnterQueue(&Que,1);        for(int i=1;i<=n-2;i++)        {            int temp,x;            DeleteQueue(&Que,&temp);            printf("%d ",temp);            GetHead(&Que,&x);            EnterQueue(&Que,x+temp);        }        int end;        DeleteQueue(&Que,&end);        printf("%d\n",end);        EnterQueue(&Que,1);    }    int endh;    while(!IsEmpty(&Que))   //打印第N行(最后一行)数据 m    {        DeleteQueue(&Que,&endh);            printf("%d ",endh);    }    return ;}int main(){    LinkQueue Q ;int n,num;    InitQueue(&Q);    printf("输入要输入链队列的数的个数及要输入的数\n");    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        scanf("%d",&num);        if(!EnterQueue(&Q,num)) printf("队列满\n");    }    printf("队列的头为:\n");;    int x;    if(GetHead(&Q,&x)) printf("%d\n",x);    else  printf("该队列已经为空 不存在队列头\n");    printf("输入的数据依次出队\n");    while(DeleteQueue(&Q,&num)) printf("%d ",num);    printf("\n");    printf("输入要打印的杨辉三角的行数 至少为2\n");    scanf("%d",&N);    YangHuiTriangle();    return 0;}