双向链式队列-C语言

代码实现简单,记录一下

c 复制代码
typedef struct List {
    int key;
    int val;
    struct List *prev;
    struct List *next;
}DlistNode;

typedef struct Dlist {
    DlistNode *head;
    DlistNode *tail;
    int len;
}Dlist;

Dlist *InitDlist(void) {
    Dlist *dl = (Dlist *)malloc(sizeof(Dlist));
    dl->head = (DlistNode *)malloc(sizeof(DlistNode));
    dl->tail = (DlistNode *)malloc(sizeof(DlistNode));
    dl->tail->next = NULL;
    dl->tail->prev = dl->head;
    dl->head->prev = NULL;
    dl->head->next = dl->tail;
    dl->len = 0;
    return dl;
}

DlistNode *DlistPush(Dlist *dl, int key, int val) {
    // printf("add: %d %d\n", key, val);
    DlistNode *p = (DlistNode *)malloc(sizeof(DlistNode));
    p->key = key;
    p->val = val;
    p->next = dl->tail;
    p->prev = dl->tail->prev;
    dl->tail->prev = p;
    p->prev->next = p;
    dl->len++;
    return p;
}

DlistNode *DlistPop(Dlist *dl) {
    DlistNode *p = dl->head->next;
    // printf("del: %d %d\n", p->key, p->val);
    dl->head->next = dl->head->next->next;
    dl->head->next->prev = dl->head;
    dl->len--;
    return p;
}

int DlistDel(Dlist *dl, DlistNode *d) {
    // printf("del: %d %d\n", d->key, d->val);
    DlistNode *p = d->prev, *q = d->next;
    p->next = q;
    q->prev = p;
    int res = d->val;
    free(d);
    dl->len--;
    return res;
}

使用

c 复制代码
# 初始化
Dlist *dl = InitDlist();
# push
DlistPush(dl, 0, 1);
# Pop
DlistPop(dl);
# 删除指定元素
DlistNode *d = xxx;
DlistDel(dl, d);
相关推荐
難釋懷6 小时前
Redis数据结构-Set结构
数据结构·redis·bootstrap
知识领航员8 小时前
蘑兔AI音乐深度实测:功能拆解、实测表现与适用场景
java·c语言·c++·人工智能·python·算法·github
如何原谅奋力过但无声9 小时前
【灵神高频面试题合集06-08】反转链表、快慢指针(环形链表/重排链表)、前后指针(删除链表/链表去重)
数据结构·python·算法·leetcode·链表
平行侠9 小时前
037插入排序 - 整理扑克牌的算法
数据结构·算法
,,?!,12 小时前
数据结构算法-排序算法
数据结构·算法·排序算法
程序leo源13 小时前
C语言知识总结
c语言·开发语言·c++·经验分享·笔记·青少年编程·c#
‎ദ്ദിᵔ.˛.ᵔ₎13 小时前
C++哈希表
数据结构·c++·散列表
爱编码的小八嘎13 小时前
C语言完美演绎9-30
c语言
爱编码的小八嘎14 小时前
C语言完美演绎9-28
c语言
阿旭超级学得完14 小时前
C++11(初始化)
java·开发语言·数据结构·c++·算法