队列——链队列

来源:互联网 发布:如何查看tcp端口 编辑:程序博客网 时间:2024/06/05 16:07

在队列的形成过程中,可以利用线性链表的原理,来生成一个队列。基于链表的队列,要动态创建和删除节点,效率较低,但是可以动态增长。队列采用的FIFO(first in first out),新元素(等待进入队列的元素)总是被插入到链表的尾部,而读取的时候总是从链表的头部开始读取。每次读取一个元素,释放一个元素。所谓的动态创建,动态释放。因而也不存在溢出等问题。由于链表由结构体间接而成,遍历也方便。

本文主要讲的是链队列相关操作,
首先是创建链队列:

Queue * q = (Queue*)malloc(sizeof(Queue)/sizeof(char));q->front = NULL;q->rear  = NULL;return q;

为队列分配一块内存,并将队头队尾都指向NULL,即置空队列,一个队列就建好了。
判断队列是否空:

return q->front == NULL;

链队列不存在队满问题,而判断队空也比较简单,只要队头元素不为空就不为空了。

进队:

    Node * node = (Node*)malloc(sizeof(Node)/sizeof(char));    node->data = x;    node->next = NULL;    if (q->front == NULL)    {        q->front = node;        q->rear  = node;    }    else    {        q->rear->next = node;        q->rear = node;    }

新建一个节点,初始化后将队尾指针指向新建结点,新建节点则成为了队尾指针。这样就完成了入队的过程。当然之前要判断队是否为空,若为空的话,队头队尾都指向新建结点。

出队:

    Node *p = q->front;    *x = p->data;    q->front = p->next;    free(p);

出队过程也很简单,用一个p保存队头元素,用一个x取出队头数值,然后将队头指针指向原先队头元素的下一个元素。当然之前要判断对是否为空,为空的话则置队尾也为NULL。

获取队头元素:

*x = q->front->data;

获取队头元素也比较简单,问题不大。
关于链队列的操作还有一些,比如遍历队列元素等,在这里就不多说了。

原创粉丝点击