数据结构之队列的链式实现

[复制链接]
 楼主| 韩山童 发表于 2017-1-6 10:15 | 显示全部楼层 |阅读模式
上一次我们简单实现了堆栈,这次让我们用C语言实现队列,也就是FIFO。不足之处请大神们指点赐教。再次先行谢过。我本人比较钟爱于链表,如果朋友有需要的话,我会补充队列的数组实现。好了,下面进入正题。
1.首先,我们定义队列的节点数据类型:
  1. typedef int ElemType; //队列中的实际数据

  2. //队列的节点数据类型
  3. typedef struct _Node
  4. {
  5.     ElemType data;
  6.     _Node* next;
  7. }Node,*PNode;


2.队列主要有两个操作:入队和出队。下面分别实现。
(1)入队操作:

  1. void enqueue(PQueue q,ElemType e)
  2. {
  3.     if (NULL == q->Front)//如果队列开始时是空的
  4.     {
  5.         PNode s = (PNode)malloc(sizeof(Node));
  6.         s->data = e;
  7.         s->next = NULL;
  8.         q->Front = s;
  9.         q->Rear = s;
  10.         return;
  11.     }

  12.     //队列非空
  13.     PNode s = (PNode)malloc(sizeof(Node));
  14.     s->data = e;
  15.     q->Rear->next = s;
  16.     s->next = NULL;
  17.     q->Rear = s;

  18. }


这样就实现了入队操作。如果有朋友不熟悉链表,我会后续补充一下。
(2)出队操作:

  1. void dequeue(PQueue q,ElemType ret)
  2. {
  3.     PNode tmp = NULL;
  4.     if (NULL == q->Front)//队列为空的话 直接返回。
  5.     {
  6.         printf("队列已经为空!!!\n");
  7.         return;
  8.     }

  9.     //队列不为空
  10.     tmp = q->Front;   //获取对头节点
  11.     if (q->Front == q->Rear)//如果队列中只有一个节点
  12.     {
  13.         q->Front = q->Rear = NULL;
  14.     }
  15.     else   //队列中由多个元素
  16.     {
  17.          q->Front = q->Front->next;
  18.          ret = tmp->data;
  19.          free(tmp);
  20.          tmp = NULL;  //这一步最好加上,避免野指针
  21.    }
  22. }

3.测试:
(1)输出队列中的元素:
  1. void print(PQueue q)
  2. {
  3.     PNode p = q->Front;
  4.     while (NULL != p)
  5.     {
  6.         printf("%d ",p->data);
  7.         p = p->next;
  8.     }
  9. }


(2)main函数:
#include "Queue.h"
int main()
{
    Queue q={NULL,NULL};
    ElemType e;
    enqueue(&q,1);
    enqueue(&q,2);
    enqueue(&q,3);
    enqueue(&q,4);
    enqueue(&q,5);

    print(&q);

    return 0;
}
输出:1 2 3 4 5
好了,这样,一个简单的队列就实现了。这里只是给出了队列的简单实现,大家可以根据需要去优化一下这个代码。蟹蟹各位的支持!
Meyeah 发表于 2017-1-6 18:06 | 显示全部楼层
咋不用C++实现啊?
 楼主| 韩山童 发表于 2017-1-6 18:14 | 显示全部楼层
Meyeah 发表于 2017-1-6 18:06
咋不用C++实现啊?

该网站用C语言的偏多吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

43

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

10

主题

43

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部