队列--顺序表实现和单向链表实现

顺序表实现

头文件

#ifndef CPROJECT_QUEUE_H
#define CPROJECT_QUEUE_H

#include <stdlib.h>
#include <stdio.h>

typedef int data_t;

typedef struct queue{
    data_t *data;
    int last;
    int count;
}queue_t;

queue_t *queue_create(int m);

int is_empty_queue(queue_t *q);

int is_full_queue(queue_t *q);

int queue_length(queue_t *q);

void queue_push(queue_t  *q, data_t x);

data_t queue_pop(queue_t *q);

void queue_destory(queue_t **q);

void queue_show(queue_t *q);

void test_queue();

#endif

源文件

#include "../header/queue.h"

queue_t *queue_create(int m){

    queue_t *q = (queue_t *) malloc(sizeof(queue_t ));
    q->data = (data_t *) malloc(sizeof(data_t )*m);
    q->last = -1;
    q->count = m;

    return q;
}

int is_empty_queue(queue_t *q){
    return q->last == -1;
}

int is_full_queue(queue_t *q){
    return q->last == (q->count - 1);
}

int queue_length(queue_t *q){
    return (q->last + 1);
}

void queue_show(queue_t *q){

    for (int i = 0; i <= q->last; ++i) {
        printf("%d ",q->data[i]);
    }
    printf("\n");
}

void queue_push(queue_t  *q, data_t x){

    if(is_full_queue(q))
        return;
    for (int i = q->last; i >= 0; --i) {
        q->data[i+1] = q->data[i];
    }
    q->data[0] = x;

    q->last += 1;
}

data_t queue_pop(queue_t *q){
    data_t temp = q->data[q->last];
    q->last -= 1;
    return temp;
}

void queue_destory(queue_t **q){
    free((*q)->data);
    free(q);
    q = NULL;
}

void test_queue(){
    queue_t *q = queue_create(20);
    for (int i = 1; i <= 10; ++i) {
        queue_push(q,i);
    }
    queue_show(q);

    printf("out:%d\n", queue_pop(q));

    queue_show(q);
}

单链表实现

头文件

#ifndef CPROJECT_QUEUE_LINK_H
#define CPROJECT_QUEUE_LINK_H

#include <stdio.h>
#include <stdlib.h>

typedef int data_t;

typedef struct Qnode{
    data_t data;
    struct Qnode *next;
}qnode;

typedef struct lqueue{
    qnode *tail;
    qnode *head;
}lqueue_t;

qnode *qnode_create(data_t x);

lqueue_t *lqueue_create();

int is_empty_lqueue(lqueue_t *lq);

int lqueue_length(lqueue_t *lq);

void lqueue_push(lqueue_t  *lq, data_t x);

data_t lqueue_pop(lqueue_t *lq);

void lqueue_show(lqueue_t *lq);

void test_lqueue();

#endif

源文件

#include "../header/queue_link.h"

qnode *qnode_create(data_t x){
    qnode *qn = (qnode *) malloc(sizeof(qnode));
    qn->next = NULL;
    qn->data = x;
    return qn;
}
//head出,tail进
lqueue_t *lqueue_create(){

    lqueue_t *lq = (lqueue_t *) malloc(sizeof(lqueue_t ));

    lq->tail = NULL;
    lq->head = NULL;

    return  lq;
}

int is_empty_lqueue(lqueue_t *lq){
    return lq->head == NULL;
}

int lqueue_length(lqueue_t *lq){
    int count = 0;
    qnode *p = lq->head;
    while (p != NULL){
        count++;
        p = p->next;
    }
    return count;
}

void lqueue_push(lqueue_t  *lq, data_t x){
    qnode *new = (qnode *) malloc(sizeof(qnode));
    new->next = NULL;
    new->data = x;

    //判断是否为空队列,为空则将tail和head都指向new
    if(is_empty_lqueue(lq))
        lq->head = lq->tail = new;
    else{
        //不是则插入在tail后面,然后tail往后移一个位置
        lq->tail->next = new;
        lq->tail = lq->tail->next;
    }
}
//把当前head出队,head往后移一个位置
data_t lqueue_pop(lqueue_t *lq){

    data_t val;

    if(is_empty_lqueue(lq))
        return -1;
    if(lq->head == lq->tail){   //只有一个节点
        val = lq->head->data;
        free(lq->head);//tail和head指向同一片区域,free一个即可
        lq->head = lq->tail = NULL;
    } else{     //有多个节点,把当前head出队,head往后移一个位置
        qnode *temp = lq->head;
        val = temp->data;
        lq->head = lq->head->next;
        free(temp);
    }

    return val;
}

void lqueue_show(lqueue_t *lq){
    qnode *p = lq->head;
    while (p != NULL){
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");
}

void test_lqueue(){
    lqueue_t *lq = lqueue_create();
    for (int i = 0; i < 10; ++i) {
        lqueue_push(lq,i);
    }
    lqueue_show(lq);

    printf("out:%d\n", lqueue_pop(lq));
    lqueue_show(lq);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值