首页 > 其他 > 详细

链式队列的表示和实现

时间:2015-11-18 12:36:15      阅读:223      评论:0      收藏:0      [点我收藏+]

表示

typedef struct node4q_t {
    data_t data;
    struct node4q_t *next;
} linknode4q_t, *linklist4q_t;

typedef struct
{
    linklist4q_t front, rear;
} linkqueue_t;

实现

//创建
linkqueue_t *CreateEmptyLinkqueue(void)
{
    linkqueue_t *queue;
    queue = (linkqueue_t *)malloc(sizeof(linkqueue_t));
    if (NULL != queue)
        queue->front = queue->rear = NULL;
    return queue;
}



//清空
int ClearLinkqueue(linkqueue_t *queue)
{
    linknode4q_t *node;
    if (NULL != queue) {
        while (NULL != queue->front) {
            node = queue->front;
            queue->front = node->next;
            free(node);
        }
        queue->rear = NULL;
        return 0;
        
    } else {
        return -1;
    }
}
//销毁
int DestroyLinkqueue(linkqueue_t *queue)
{
    if (NULL != queue) {
        ClearLinkqueue(queue);
        free(queue);
        return 0;
    } else {
        return -1;
    }
}
//是否为空
int EmptyLinkqueue(linkqueue_t *queue)
{
    if (NULL != queue) {
        return (queue->front == NULL ? 1 : 0);
    } else {
        return -1;
    }
}



//入队
int EnQueue(linkqueue_t *queue, data_t x)
{
    if (NULL == queue) return -1;
    
    linknode4q_t *node_new;
    node_new = (linknode4q_t *)malloc(sizeof(linknode4q_t));
    if (NULL == node_new) return -1;
    
    node_new->data = x;
    node_new->next = NULL;

    if (NULL != queue->front) {
        queue->rear->next = node_new;
        queue->rear = node_new;
    } else {
        queue->front = queue->rear = node_new;
    }
    return 0;
}
//出队
int DeQueue(linkqueue_t *queue, data_t *x)
{
    if (NULL == queue) return -1;
    if (NULL == queue->front) return -1;
    if (NULL == x) return -1;
    
    linknode4q_t *node_remove;
    node_remove = queue->front;
    
    queue->front = node_remove->next;
    
    if (NULL == queue->front) queue->rear = NULL;
    
    if (NULL != x)
        *x = node_remove->data;
        
    free(node_remove);
    
    return 0;
}

测试代码

void iterate_queue(linkqueue_t * queue)
{
    linknode4q_t *node;

    /* browse from the front to the rear */
    printf("queue = front{");

    node = queue->front;
    while (NULL != node) {
        printf("%d->", node->data);
        node = node->next;
    }
    
    if (1 == EmptyLinkqueue(queue)) {
        printf("}rear\n");
    } 
    else {
        printf("\b\b}rear\n");
    }

    return;
}

int main()
{
    int i;
    data_t data;
    linkqueue_t *queue;

    queue = CreateEmptyLinkqueue();

    for (i = 1; i < 10; i++) {
        printf("Enter %2d: ", i);
        EnQueue(queue, i);
        iterate_queue(queue);
    }

    while (!EmptyLinkqueue(queue)){
        DeQueue(queue, &data);
        printf("Out   %2d: ", data);
        iterate_queue(queue);
    }

    /* run again */
    for (i = 1; i < 10; i++) {
        printf("Enter %2d: ", i);
        EnQueue(queue, i);
        iterate_queue(queue);
    }

    while (!EmptyLinkqueue(queue)){
        DeQueue(queue, &data);
        printf("Out   %2d: ", data);
        iterate_queue(queue);
    }
    
    DestroyLinkqueue(queue);

    return 0;
}

结果

Enter  1: queue = front{1}rear
Enter  2: queue = front{1->2}rear
Enter  3: queue = front{1->2->3}rear
Enter  4: queue = front{1->2->3->4}rear
Enter  5: queue = front{1->2->3->4->5}rear
Enter  6: queue = front{1->2->3->4->5->6}rear
Enter  7: queue = front{1->2->3->4->5->6->7}rear
Enter  8: queue = front{1->2->3->4->5->6->7->8}rear
Enter  9: queue = front{1->2->3->4->5->6->7->8->9}rear
Out    1: queue = front{2->3->4->5->6->7->8->9}rear
Out    2: queue = front{3->4->5->6->7->8->9}rear
Out    3: queue = front{4->5->6->7->8->9}rear
Out    4: queue = front{5->6->7->8->9}rear
Out    5: queue = front{6->7->8->9}rear
Out    6: queue = front{7->8->9}rear
Out    7: queue = front{8->9}rear
Out    8: queue = front{9}rear
Out    9: queue = front{}rear
Enter  1: queue = front{1}rear
Enter  2: queue = front{1->2}rear
Enter  3: queue = front{1->2->3}rear
Enter  4: queue = front{1->2->3->4}rear
Enter  5: queue = front{1->2->3->4->5}rear
Enter  6: queue = front{1->2->3->4->5->6}rear
Enter  7: queue = front{1->2->3->4->5->6->7}rear
Enter  8: queue = front{1->2->3->4->5->6->7->8}rear
Enter  9: queue = front{1->2->3->4->5->6->7->8->9}rear
Out    1: queue = front{2->3->4->5->6->7->8->9}rear
Out    2: queue = front{3->4->5->6->7->8->9}rear
Out    3: queue = front{4->5->6->7->8->9}rear
Out    4: queue = front{5->6->7->8->9}rear
Out    5: queue = front{6->7->8->9}rear
Out    6: queue = front{7->8->9}rear
Out    7: queue = front{8->9}rear
Out    8: queue = front{9}rear
Out    9: queue = front{}rear

 

链式队列的表示和实现

原文:http://www.cnblogs.com/vsyf/p/4918581.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!