数据结构——c队列实现

使用双向链表

#include<stdlib.h>

// 队列结点的结构
typedef struct _qNode{
    int data;
    struct _qNode *prior;
    struct _qNode *next;
}QNode;

// 队列
typedef struct _queue{
    QNode *head;
    QNode *tail;
} queue;

// 初始化,注意这里使用一级指针
void initQueue(queue *q)
{
    q->head = NULL;
    q->tail = NULL;
}

// 入队
void enqueue(queue *q, int val)
{
    QNode *temp = (QNode*)malloc(sizeof(QNode));
    
    // 队列为空
    if( q->head == NULL)
    {    
        // 对新结点设置值
        temp->data = val;
        temp->prior = NULL;
        temp->next = NULL;
        // 修改队列的头指针和尾指针
        q->head = temp;
        q->tail = temp;

        return;
    }
    
    // 设置新结点值
    temp->data = val;
    // 在旧链表头结点前插入新结点,使新结点成为链表头结点
    temp->next = q->head;
    q->head->prior = temp;
    q->head = temp;
}


// 出队, 从链表
int dequeue(queue *q)
{
    int val = 0;
    QNode *t;
    // 只有一个结点
    if( q->tail->prior == NULL)
    {
        val = q->tail->data;
        t = q->tail;
        q->tail = q->head = NULL;
        
        free(t);
        return val;    
    }
    
    t = q->tail;
    q->tail = q->tail->prior;  //指向倒数第二个结点
    q->tail->next = NULL;
    
    val = t->data;
    free(t);
    
    return val;
}

void printQ(QNode *q)
{
    while(q)
    {
        printf("%3d", q->data);
        q = q->prior;
    }
}

运行如下

$ ./queue 
  5  6  7

 

posted @ 2020-09-18 13:04  桃花春风一杯酒  阅读(164)  评论(0)    收藏  举报