8月11日

链式队列

//头文件
#ifndef _LINKQUEUE_H
#define _LINKQUEUE_H

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

#define SUCCESS 10000
#define FAILURE 10001
#define TRUE    10002
#define FALSE   10003

struct Node              
{
    int data;                 // 数据域
    struct Node *next;        // 指针域
};
typedef struct Node node;

struct Queue
{
    node *front;           // 队头指针
    node *rear;            // 队尾指针
};
typedef struct Queue Q;

int Init(Q **q);           // 初始化
int Insert(Q *q,int e);    // 向链式队列中插入节点
int Delete(Q *q);          // 删除队列节点信息
int Empty(Q *q);           // 判断队列是否为空
int Getfrist(Q *q);        // 得到队列第一个元素
int Clear(Q *q);           // 清空队列
int Destroy(Q **q);        // 销毁

#endif

#include "Queue.h"

int Init(Q **q)       // 初始化
{
    *q = (Q *)malloc(sizeof(Q)*1);
    if( (*q) == NULL)       // 判断空间是否分配成功
    {
        return FAILURE;
    }

    node *p = (node *)malloc(sizeof(node)*1);   // 申请头结点
    if(p == NULL)         // 判断空间是否分配成功
    {
        return FAILURE;
    }

    (*q)->front = (*q)->rear = p;  // front和rear都指向头节点
    p->next = NULL;  // 头节点next指向NULL
    return SUCCESS;
}

int Insert(Q *q,int e)     // 插入 数据e
{
    if(q == NULL)          // 入参判断
    {
        return FAILURE;
    }
    node *p = (node *)malloc(sizeof(node)*1);  // 为节点分配空间
    p->data = e;                               // 为节点分配数据
    q->rear->next = p;                         // rear->next 指向 节点p
    p->next = NULL;                            // p的next指向空
    q->rear = p;                               // rear 指向 p
    return SUCCESS;
}

int Delete(Q *q)               // 删除节点,删除前记录节点,释放节点空间
{
    if(q == NULL || q->front == q->rear)   // 入参判断 以及 判断队列是否为空
    {
        return FAILURE;
    }

    int e;
    node *p = q->front->next;    // 记录位置
    e = p->data;                 // 记录数据
    q->front->next = p->next;    // 尾指向下一个节点
    if(p->next == NULL)          // 判断是不是最后一个,是就把尾指针指向队头指针
    {
        q->rear = q->front;       
    }
    free(p);
    return e;
}
    
int Empty(Q *q)        // 判断是否为空
{
    if(q == NULL)      // 入参判断
    {
        return FAILURE;
    }

    return (q->front == q->rear)? TRUE : FALSE; 
}

int Getfrist(Q *q)
{
    if(q == NULL || q->front == q->rear)    // 入参判断 以及 判断队列是否为空
    {
        return FAILURE;
    }

    return q->front->next->data;    // 返回第一个元素,但是不出队
}

int Clear(Q *q)     // 就是把所有的有数据的节点删除,并把删除节点申请的空间释放掉
{
    if(q == NULL || q->front == q->rear)     // 入参判断 以及 判断队列是否为空
    {
        return FAILURE;
    }
    node *p = q->front->next;  // 先记录删除的节点
    while(p)
    {
        q->front->next = p->next;
        free(p);
        p = p->next;
    }
    q->rear = q->front;   // 清空后让队尾指针指向队头指针 ,防止队尾指针变成野指针

    return SUCCESS;
}

int Destroy(Q **q)   // 释放掉申请队列的结构体空间 和 节点的结构体的空间
{
    if(q == NULL || (*q) == NULL)  // 入参判断
    {
        return FAILURE;
    }
    free((*q)->front);             // 释放头节点
    free(*q);                      // 释放队结构体空间
    return SUCCESS;
}


#include "Queue.h"

int main()
{
    int ret,i;
    Q *p;   

    ret = Init(&p);                               //初始化
    if(ret == FAILURE)
    {
        printf("Init FAILURE!\n");
    }
    else
    {
        printf("Init SUCCESS!\n");
    }

    for(i = 0; i < 5; i++)
    {
        ret = Insert(p,i);           // 插入节点
        if(ret == FAILURE)
        {
            printf("Insert %d Failure!\n",i);
        }
        else
        {
            printf("Insert %d Success!\n",i);
        }
    }
    for(i = 0; i < 3; i++)
    {
        ret = Delete(p);                         // 删除节点
        if(ret == FAILURE)
        {
            printf("Delete Failure!\n");
        }
        else
        {
            printf("Delete %d Success!\n",ret);
        }
    }
    
    ret = Empty(p);          // 判断是否为空
    if(ret == FAILURE)
    {
        printf("Failure!\n");
    }
    else if(ret == TRUE)
    {
        printf("Queue is Empty!\n");
    }
    else
    {
        printf("Queue is not Empty!\n");
    }

    ret = Getfrist(p);                             // 获取第一个元素
    if(ret == FAILURE)
    {
        printf("Get frist Failure!\n");
    }
    else
    {
        printf("Get frist is %d \n",ret);
    }
    
    ret = Clear(p);                                // 清空队列
    if(ret == FAILURE)
    {
        printf("Clear Failure!\n");
    }
    else
    {
        printf("Clear Success!\n");
    }

    ret = Destroy(&p);                            // 销毁队列
    if(ret == SUCCESS)
    {
        printf("Destroy Success!\n");
    }
    else
    {
        printf("Destroy Failure!\n");
    }

    return 0;
}

 

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭