[数据结构]C语言队列的实现http://www.cnblogs.com/racaljk/p/7822307.html
我个人把链表、队列、栈分为一类,然后图、树分为一类。(串不考虑),分类的理由就是每一类有规律可循,即你能通过修改极少数的代码把链表变成队列、栈。(这里我们不考虑其他诸如设计模式等因素),因此本贴在讲完队列之后还会归纳一下这一类数据结构的规律,帮助大家更好理解数据结构
首先需要知道队列是什么,这里给一个定义:队列是只允许一段进行插入操作,一段进行删除操作的线性表,队列是先进先出的结构,允许插入成为队尾,允许删除成为队头
如上图就是一个队列,这里我相信你已经对队列有了一个概念了吧,于是就可以继续看下面了
队列同样存在插入删除操作,由于我们这里讨论的是链式队列的实现,所以不存在队列满的情况
学了这么多章数据结构我相信你能很容易的写出队列的结构了:
- struct node{
- char data;
- struct node *next;
- };
- struct queue{
- struct node *front;
- struct node *rear;
- };
- struct queue *create_queue(){
- struct queue *q=new queue;
- q->front=NULL;
- q->rear=NULL;
- return q;
- }
然后来考虑入队操作:
如上图,我们希望把e节点插入到这个队列里面,其实细心的朋友可能已经发现了这其实就是链表的尾部插入,没错,等一下我会总结一下这些规律
,这里暂且不谈。
我们能很容易写出下面插入节点到队列的代码(如果不能你就要发反思是否认真学习了):
- void en_queue(struct queue *q,char c){
- struct node *e=new node;
- if(!n){
- return;
- }
- e->data=c;
- e->next=NULL;
- if(q->rear==NULL){
- q->front=q->rear=e;
- }else{
- q->rear->next=e;
- q->rear=e;
- }
- }
然后出队:
看着上面的图片如果你能与链表联系起来并想到这就是链表的头插法的逆向,那就说明你真的学懂了
我们只需要把front的next指向a2,然后把,然后删除a1即可完成出队,同样,要想删除a1就应该创建一个临时变量
代码如下:
- void out_queue(struct queue *q){
- struct node * temp;
- if(q->front==NULL)
- return;
- if(q->front==q->rear)
- {
- q->front=q->rear=NULL;
- return;
- }
- temp=q->front;
- q->front=temp->next;
- delete temp;
- }
遍历操作也顺利成章:
- void print(struct queue *q){
- struct node *n=q->front;
- while(n!=NULL){
- std::cout<< n->data;
- n=n->next;
- }
- }
作者:racaljk