31-链式队列的基本操作实现

LinkQueue.h文件

#ifndef LINKQUEUE_H
#define LINKQUEUE_H

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

//定义节点的存储结构
typedef struct LINKQUEUENODE
{

    void *data;             //数据域
    struct LINKQUEUENODE *next; //指针域

}LinkQueueNode;

//定义链式队列的存储结构
typedef struct LINKQUEUE
{
    struct LINKQUEUENODE *front;    //队首
    struct LINKQUEUENODE *rear;     //队尾

}LinkQueue;

//初始化链式队列
LinkQueue *Init_LinkQueue();

//销毁队列
void Free_LinkQueue(LinkQueue *queue);

//判断队列是否为空
int IsEmpty_LinkQueue(LinkQueue *queue);

//入队
void Insert_LinkQueue(LinkQueue *queue , void *data);

//出队
void Remove_LinkQueue(LinkQueue *queue);

#endif



LinkQueue.c文件

#include "LinkQueue.h"

//初始化链式队列
LinkQueue *Init_LinkQueue()
{
    LinkQueue *queue = (LinkQueue *)malloc(sizeof(LinkQueue));
    queue->front = NULL;
    queue->rear = NULL;
    return queue;
}

//销毁队列
void Free_LinkQueue(LinkQueue *queue)
{
    if(queue == NULL)
    {
        return;
    }

    if(queue->front == NULL)
    {
        return;
    }
    //DelNode记录要删除的节点
    LinkQueueNode *DelNode = queue->front;
    while(DelNode != NULL)
    {
        //先缓存下一个节点
        LinkQueueNode *NextNode = DelNode->next;
        free(DelNode);
        DelNode = NextNode;
    }
    free(queue);
    queue = NULL;
}

//判断队列是否为空
int IsEmpty_LinkQueue(LinkQueue *queue)
{
    if(queue == NULL)
    {
        return -1;
    }
    if(queue->rear == NULL)
    {
        return 0;
    }
    return 1;
}

//入队
void Insert_LinkQueue(LinkQueue *queue , void *data)
{
    if(queue == NULL || data == NULL)
    {
        return;
    }
    LinkQueueNode *temp = (LinkQueueNode *)malloc(sizeof(LinkQueueNode));
    temp->data = data;
    temp->next = NULL;
    //队列是否为空
    if(queue->rear == NULL)
    {
        queue->front = temp;
        queue->rear = temp;
    }
    //队列不为空
    else
    {
        queue->rear->next = temp;
        queue->rear = temp;
    }

}

//出队
void Remove_LinkQueue(LinkQueue *queue)
{
    if(queue == NULL)
    {
        return;
    }

    if(queue->rear == NULL)
    {
        return;
    }
    LinkQueueNode *DelNode = queue->front;
    //判断队列中是否只有一个节点
    if(queue->front == queue->rear)
    {
        queue->front = NULL;
        queue->rear = NULL;
    }
    else
    {   //队首指向要删除的节点的下一个节点
        queue->front = DelNode->next;
    }
    free(DelNode);
    DelNode = NULL;
}



main.c文件

#include "LinkQueue.h"

typedef struct STUDENT 
{
    char name[20];
    int age;
}Student;

int main(void)
{

    LinkQueue *queue = Init_LinkQueue();
    //创建数据
    Student s1 =  {"xiaoming",17};
    Student s2 = {"zhangsan" , 20};
    Student s3 = {"lisi" , 27};
    Student s4 = {"wangwu" , 18};
    printf("---------------入队--------------\n\n");
    //数据入队
    Insert_LinkQueue(queue , (void *)&s1);
    Insert_LinkQueue(queue , (void *)&s2);
    Insert_LinkQueue(queue , (void *)&s3);
    Insert_LinkQueue(queue , (void *)&s4);
    printf("---------------出队--------------\n");
    while(queue->rear != NULL)
    {
        Student *s = (Student *)queue->front->data;
        printf("name = %s , age = %d\n" , s->name , s->age);
        //出队
        Remove_LinkQueue(queue);
    }
    printf("---------------释放队列--------------\n");
    //释放队列
    Free_LinkQueue(queue);
    return 0;
}

测试结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_35733751/article/details/80737866