队的链式存储

Posted on 2016-06-01 13:08  洪爵士  阅读(159)  评论(0编辑  收藏  举报

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\n",p->age,p->num);
    p=(Player*)Back_LinkQueue(queue);
    printf("队尾:Age:%d Num:%d\n",p->age,p->num);
    //打印
    while(Size_LinkQueue(queue)>0)
    {
        p=(Player*)Front_LinkQueue(queue);
        printf("Age:%d Num:%d\n",p->age,p->num);
        Pop_LinkQueue(queue);
    }
    //销毁队列
    Destroy_LinkQueue(queue);
    return 0;

}