• c语言:链队列


    1.队列的链接储存结构称为链列表,通常用单链表表示,因此此节点结构与单链表的节点结构相同。为了使空队列和非空队列,=的操作一致,链队列也加上了头结点。

    2.为了操作上的方便,设置队头指针指向链队列的头结点,队尾指针指向终端节点。

    3.链表示意图
    这里写图片描述

    4.代码如下

    #include<stdio.h>
    #include<stdlib.h>
    
    /*
    链队列
    */
    //定义结构体
    typedef struct node{    //定义链队列的节点结构
        int data;
        struct node *next;
    }Node;
    
    typedef struct link_queue{  //定义链队列
        Node *front,*rear;   
    }LQ;
    
    //初始化队列
    void InitLinkQueue(LQ *q){
        Node *s=NULL;
        s=(Node*)malloc(sizeof(Node));
        //判断内存是否申请成功
        if(s==NULL){
            printf("Malloc Failure
    ");
            exit(-1);
        }
        q->front=q->rear=s;   //将队头指针和队尾指针均指向节点s
    }
    
    //入队
    void EnQueue(LQ *q,int enData){
        Node *s=NULL;
        s=(Node *)malloc(sizeof(Node));
        if(s==NULL){
            printf("Malloc Failure
    ");
            exit(-1);
        }
        s->data=enData;
        s->next=NULL;
        q->rear->next=s;   //将节点s插入到队尾
        q->rear=s;
    }
    
    //出队
    int DeQueue(LQ *q){
        int deData;
        Node *s=NULL;
        s=(Node *)malloc(sizeof(Node));
        if(s==NULL){
            printf("Malloc Failure
    ");
            exit(-1);
        }
        //判断是否为空表
        if(q->rear==q->front){
            printf("下溢
    ");
            exit(-1);
        }
        deData=q->front->next->data;
        s=q->front->next;    //暂存队头元素
        q->front->next=s->next;
        //判断出队前 队列元素是否只剩剩下最后一个
        if(s->next==NULL) q->rear=q->front;    //此时队列中只有一个元素了
        //释放
        free(s);
        return deData;
    }
    
    //取队头元素算法
    int GetFront(LQ *q){
        //判断队列是否为空
        if(q->rear==q->front){
            printf("下溢
    ");
            exit(-1);
        }
        return q->front->next->data;
    }
    
    //队列判空算法
    int Empty(LQ *q){
        if(q->rear==q->front) return 1;    //队列为空
        else return 0;
    }
    
    //队列清空
    void CleanQueue(LQ *q){
        Node *s=NULL;
        s=(Node*)malloc(sizeof(Node));
        if(s==NULL){
            printf("Malloc Failure
    ");
            exit(-1);
        }
    
        while(q->front!=q->rear){
            s=q->front;
            q->front=s->next;
            free(s);
        }
        //循环完了之后还剩下最后一个节点没有被释放
        s=q->front;
        free(s);
        printf("Bingo
    ");
    }
    
    int main(void){
        LQ *q=NULL;
        int enData,deData,ret1,ret2;
        char ch;
    
        q=(LQ*)malloc(sizeof(LQ));
        if(q==NULL){
            printf("Malloc Failure
    ");
            exit(-1);
        }
        //初始化
        InitLinkQueue(q);
        //入队
        while(1){
                printf("请输入入队的数:");
                ret1=scanf(" %d",&enData);
                if(ret1!=1){
                    //getchar();
                    fflush(stdin);
                    continue;
                }
                EnQueue(q,enData);
                printf("是否继续:");
                ret2=scanf(" %c",&ch);
                if(ch!='y'&&ch!='Y'&&ret2==1){
                    break;
                }
        }
            //出队
            while(1){
                printf("出队的数为:%d
    ",DeQueue(q));
                printf("是否继续:");
                ret1=scanf(" %c",&ch);
                if(ch!='y'&&ch!='Y'&&ret1==1){
                    break;
                }
            }
    
            //清空队列
            CleanQueue(q);
            system("pause");
        return 0;
    }
    
  • 相关阅读:
    牛客寒假5-D.炫酷路途
    牛客寒假5-A.炫酷双截棍
    HDU-1024
    牛客寒假6-J.迷宫
    牛客寒假6-G.区间或和
    牛客寒假6-E.海啸
    【BZOJ3456】—城市规划(生成函数+多项式求逆)
    【BZOJ3456】—城市规划(生成函数+多项式求逆)
    【TopCoder SRM548 Div1】—KingdomAndCities(组合数学)
    【TopCoder SRM548 Div1】—KingdomAndCities(组合数学)
  • 原文地址:https://www.cnblogs.com/cmustard/p/6769944.html
Copyright © 2020-2023  润新知