算法与数据结构-队列的基本操作C语言实现

序言

队列有顺序队列和链式队列,顺序队列通过数组方式来实现,链式队列通过链表方式来实现。

数组方式实现便于数据访问(大小和空间确定),链表方式实现便于数据操作(插入和删除灵活)。

这里介绍链式队列的基本操作及其C语言实现。


队列的基本操作有哪些

  • 创建并初始化

  • 清空/销毁队列

  • 判断队列是否为空

  • 队列遍历

  • 获取队列大小

  • 元素入队

  • 元素出队


1. 链式队列的定义

//队列节点
typedef struct queue_node
{
    int data;                   //数据域
    struct list_queue *next;    //指针域
}queueNode, *queNode;

//队列
typedef struct queue
{
    queNode front;        //队头指针
    queNode rear;         //队尾指针
    int nodeNum;          //节点计数,若需要
}queue, *Queue;


2. 队列的初始化

void InitQue(queue *que)
{
    que -> front = que -> rear = NULL;
    que -> nodeNum = 0;
}

//或者
bool InitQue(queue *que)
{
    que -> front = que -> rear = (Queue)malloc(sizeof(queue));
    que -> nodeNum = 0;
    if (! que -> front)
        return false;
    que -> front -> next = NULL;
    return true;
}


3. 判断队列是否为空

//判断队列是否为空
int IsEmpty(queue *que)
{
    if (que -> front == NULL && que -> rear == NULL && que -> nodeNum == 0)
        return 1;
    else
        return 0;
}


4. 清空队列

//清空队列
void EmptyQue(queue *que)
{
    queue *temp = que -> front;
    while (temp != NULL)
    {
        que -> front = que -> front -> next;
        free (temp);
        temp = que -> front;
    }
    que -> rear = NULL;
}


5. 队列遍历

bool QueueTraverse(queue *que)
{
    if (que -> front == NULL && que -> rear == NULL)       //而不是que -> front == que -> rear
    {
        printf("队列为空\n");
        return false;
    }
    queue *temp = que -> front;
    while (temp != que -> rear)
    {
        temp = temp -> next;     //指向下一个节点
        printf("%d", temp -> data);
    }
    return true;
}       


6. 获取队列大小

int QueueSize(queue *que)
{
    return que -> nodeNum;
}


7. 元素入队

int AddItem2Queue(queue *que, int x)
{
    //定义操作节点
    queNode temp = (queNode)malloc(sizeof(queueNode)); 
    if (!temp)
        return 1;
    temp -> next = NULL;
    temp -> data = x;

    //元素入队
    if (IsEmpty(que))
    {
        que -> front = que -> rear = temp;
        que -> nodeNum++;
    }
    else
    {
        que -> rear -> next = temp;
        que -> rear = temp;
        que -> nodeNum++;
    }
    return 0;
}


8. 元素出队

//获取元素但不删除节点
int ReadItemFromQueue(queue *que)
{
    if (que -> front == que -> rear)
    {
        printf("队列为空");
        return -1;
    }

    return que -> front -> data;
}


//获取元素且删除节点
int ReadItemFromQueue(queue *que)
{
    if (que -> front == que -> rear)
    {
        printf("队列为空");
        return -1;
    }

    queNode temp = (queNode)malloc(sizeof(queueNode));
    temp = que -> front;
    int x = temp -> data;
    que -> front = temp -> next;
    que -> nodeNum--;

    if (que -> rear == temp)         //只有一个节点
        que -> rear = NULL;

    free(temp);
    return x;
}



Acknowledgements:
http://blog.csdn.net/hehainan_86/article/details/11630857
http://blog.csdn.net/to_dreams/article/details/7708391
http://blog.csdn.net/jiajiayouba/article/details/9128815

2017.08.25

你可能感兴趣的:(算法与数据结构)