• 队的链式存储


    LinkQueue.h

    #ifndef LINKQUEUE_H
    #define LINKQUEUE_H
    //节点的结构体
    typedef struct _QueueNode
    {
    	void* data;
    	struct _QueueNode* next;
    }QueueNode;
    
    //队列结构体
    typedef struct _LinkQueue
    {
    	QueueNode* head;//队头
    	QueueNode* rear;//队尾
    	int length;
    }LinkQueue;
    
    //初始化:创建队
    LinkQueue* Creat_LinkQueue();
    //入队列
    void Push_LinkQueue(LinkQueue* queue,void* data);
    //出队
    void Pop_LinkQueue(LinkQueue* queue);
    //求队的大小
    int Size_LinkQueue(LinkQueue* queue);
    //获得队的头部的元素
    void* Front_LinkQueue(LinkQueue* queue);
    //获取队的尾部元素
    void* Back_LinkQueue(LinkQueue* queue);
    //判读队是否为空
    int IsEmpty_LinkQueue(LinkQueue* queue);
    //销毁
    void Destroy_LinkQueue(LinkQueue* queue);
    
    #endif
    

      LinkQueue.c

    #include<stdlib.h>
    #include<stdio.h>
    #include"LinkQueue.h"
    //初始化:创建队
    LinkQueue* Creat_LinkQueue()
    {
        LinkQueue* queue=(LinkQueue*)malloc(sizeof(LinkQueue));
        if(queue==NULL)
        {
            return NULL;
        }
        queue->head=NULL;
        queue->rear=NULL;
        queue->length=0;
    
        return queue;
    }
    //入队列
    void Push_LinkQueue(LinkQueue* queue,void* data)
    {
        QueueNode* newnode=NULL;
        if(queue==NULL||data==NULL)
        {
            return;
        }
        //创建新的结点
        newnode=(QueueNode*)malloc(sizeof(QueueNode));
        if(newnode == NULL)
        {
            return;
        }
        newnode->data=data;
        newnode->next=NULL;
    
        //如果是个空队列
        if (queue->length==0)
        {
            queue->head=newnode;
            queue->rear=newnode;
            queue->length++;
            return;
        }
        //节点入队列
        queue->rear->next=newnode;
        queue->rear=newnode;
        queue->length++;
    }
    //出队
    void Pop_LinkQueue(LinkQueue* queue)
    {
        QueueNode* pNext=NULL;
        if(queue==NULL||queue->length==0)
        {
            return;
        }
        //只有一个结点的情况
        if(queue->length==1)
        {
            free(queue->head);
            queue->head=NULL;
            queue->rear=NULL;
            queue->length--;
            return;
        }
    
        //其他情况
        //缓存下一个结点
        pNext=queue->head->next;
        free(queue->head);
        queue->head=pNext;
        queue->length--;
    }
    //长度
    int Size_LinkQueue(LinkQueue* queue)
    {
        if(queue==NULL)
        {
            return -1;
        }
    
        return queue->length;
    }
    //获得队头的元素
    void* Front_LinkQueue(LinkQueue* queue)
    {
        if (queue==NULL)
        {
            return NULL;
        }
        if(queue->length==0)
        {
            return NULL;
        }
        return queue->head->data;
    }
    //获取队的尾部元素
    void* Back_LinkQueue(LinkQueue* queue)
    {
        int i=0;
        QueueNode* pCurrent=NULL;//辅助指针
        if(queue==NULL)
        {
            return NULL;
        }
        if(queue->length==0)
        {
            return NULL;
        }
        pCurrent=queue->head;
        for(i=0;i<queue->length-1;i++)
        {
            pCurrent=pCurrent->next;
        }
        return pCurrent->data;
    }
    //判读队是否为空
    int IsEmpty_LinkQueue(LinkQueue* queue)
    {
        if(queue==NULL)
        {
            return -1;
        }
        if(queue->length==0)
        {
            return 1;
        }
        return 0;
    }
    //销毁
    void Destroy_LinkQueue(LinkQueue* queue)
    {
        if(queue==NULL)
        {
            return;
        }
        while(queue->length>0)
        {
            Pop_LinkQueue(queue);
        }
        //释放队列的内存
        free(queue);
    }

    testLinkQueue.c测试队的链式存储

    #include <stdio.h>
    #include"LinkQueue.h"
    
    typedef struct _Player
    {
        int age;
        int num;
    }Player;
    
    int main()
    {
        
        //创建队列
        LinkQueue* queue=Creat_LinkQueue();
        //创建数据
        Player p1={10,2};
        Player p2={20,3};
        Player p3={30,4};
        Player* p=NULL;
        //入队列
        Push_LinkQueue(queue,&p1);
        Push_LinkQueue(queue,&p2);
        Push_LinkQueue(queue,&p3);
        p=(Player*)Front_LinkQueue(queue);
        printf("队头:Age:%d Num:%d
    ",p->age,p->num);
        p=(Player*)Back_LinkQueue(queue);
        printf("队尾:Age:%d Num:%d
    ",p->age,p->num);
        //打印
        while(Size_LinkQueue(queue)>0)
        {
            p=(Player*)Front_LinkQueue(queue);
            printf("Age:%d Num:%d
    ",p->age,p->num);
            Pop_LinkQueue(queue);
        }
        //销毁队列
        Destroy_LinkQueue(queue);
        return 0;
    
    }
  • 相关阅读:
    2020/10/23-大族激光
    Windows权限维持总结
    了解蓝军--jsonhijack漏洞学习
    white-space、word-break、word-wrap傻傻分不清楚
    Vue其他指令(v-cloak和v-text,v-html,v-pre,v-once)
    Vue循环渲染(v-for)
    Vue条件渲染(v-if)
    Vue绑定事件监听器(v-on)
    Vue绑定数据和元素属性(v-bind)
    记录一下,破解idea
  • 原文地址:https://www.cnblogs.com/jueshi0208/p/5549260.html
Copyright © 2020-2023  润新知