跨平台C语言长连接之quene数据结构

作者在写这个东西之前,已经有近1年多没有写过C语言,其实有点生疏的。

鉴于网上的quene,不是风格不喜欢,就是代码实用性不强,或者是有BUG,可悲。大学学过的东西,网上却一大堆垃圾。

好了,以下是代码,很清晰,支持自定义数据。

//
// Created by WenYF on 2016/11/2.
//
// 队列先进先出,不阻塞

#include "queue.h"

typedef struct ifelement_struct {
    void *data;
    struct ifelement_struct *next;
} ifelement;

typedef struct ifqueue_struct {
    int size;
    ifelement *front;
    ifelement *rear;
} ifqueue;

// 构造一个队列
void* if_queue_new() {
    ifqueue *queue = (ifqueue*) malloc (sizeof(ifqueue));
    queue->size = 0;
    queue->front = NULL;
    queue->rear = NULL;

    return (void*)queue;
}

// 添加一个到队尾
void if_queue_add(void *q, void *data) {
    if (!data || !q) {
        return;
    } else {
        ifqueue *queue = (ifqueue *) q;
        ifelement *element = (ifelement*) malloc (sizeof(ifelement));
        logD("add data addr = %d", data);
        element->data = data;
        element->next = NULL;
        if (queue->size == 0) {
            // 队列为空
            // 首尾指向同一个
            queue->front = element;
            queue->rear = element;
        } else {
            // 尾部指向新的
            queue->rear->next = element;
            queue->rear = element;
        }
        queue->size++;
    }
}

// 得到第一个,并从队列移除
// return: null or 数据指针
void* if_queue_poll(void *q) {
    if (!q) {
        return NULL;
    } else {
        ifelement *frontEle = NULL;
        ifqueue *queue = (ifqueue *) q;
        void* data = NULL;
        if (queue->size == 0) {
            return NULL;
        } else if (queue->size == 1) {
            frontEle = queue->front;
            queue->front = NULL;
            queue->rear = NULL;
        } else {
            frontEle = queue->front;
            queue->front = frontEle->next;
        }

        queue->size--;

        data = frontEle->data;
        free(frontEle);

        logD("poll data addr = %d", data);
        return data;
    }
}

// 得到第一个,不从队列移除
void* if_queue_peek(void *q) {
    if (!q) {
        return NULL;
    } else {
        ifqueue *queue = (ifqueue *) q;
        ifelement *frontEle = queue->front;

        if (frontEle) {
            void* data = frontEle->data;
            return data;
        } else {
            return NULL;
        }
    }
}

// 清除所有
// 只会清理队列,不会清理队列中的数据,数据需要调用者自己清理
void if_queue_clear(void *q) {
    if (!q) {
        return;
    } else {
        ifqueue *queue = (ifqueue *) q;
        ifelement *ele = queue->front;
        ifelement *elePre = NULL;
        while (ele) {
            elePre = ele;
            ele = ele->next;
            free(elePre);
        }

        queue->size = 0;
        queue->front = NULL;
        queue->rear = NULL;
    }
}

// 得到长度
// return: -1参数为null,其他表示大小
int if_queue_length(void *q) {
    if (!q) {
        return -1;
    } else {
        ifqueue *queue = (ifqueue *) q;
        return queue->size;
    }
}

// 释放队列
void if_queue_delete(void *q) {
    if (!q) {
        return;
    } else {
        if_queue_clear(q);
        free(q);
    }
}


如果有不对的地方,还望指出,谢谢。毕竟人是会犯错误的。

好了,大家有需要的可以看看parser和session,那是和ifserver通信相关的。

欢迎大家下载学习。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值