美文网首页
双向循环链表

双向循环链表

作者: dawter | 来源:发表于2016-08-25 22:54 被阅读0次

双向循环链表

  • 初始化
  • 添加元素
  • 删除元素
  • 输出整个链表

实现代码

/*
 * bidirectional circular linked list
 */
#include <stdio.h>
#include <stdlib.h>

struct bclist {
        struct bclist *next;
        struct bclist *prev;
        int data;
};

struct bclist* bclist_init(int data)
{
        struct bclist *p = malloc(sizeof(struct bclist));
        if(p) {
                p->next = p;
                p->prev = p;
                p->data = data;
        }
        return p;
}

struct bclist* bclist_add(struct bclist* h, int data)
{
        struct bclist *p = h;

        if(NULL == h) {
                return h;
        }

        do {
                if(p->data == data) {
                        return h;
                }
                p = p->next;
        }while(p != h);

        p = malloc(sizeof(struct bclist));
        if(NULL == p) {
                return h;
        }
        p->next = h;
        p->prev = h->prev;
        h->prev = p;
        p->prev->next = p;

        p->data = data;

        return h;
}

struct bclist* bclist_delete(struct bclist* h, int data)
{
        struct bclist *p = h;
        struct bclist *q = NULL;

        do {
                if(p->data == data) {
                        q = p;
                        p = p->prev;
                        q->next->prev = q->prev;
                        q->prev->next = q->next;
                        free(q);
                }
                p = p->next;
        } while(p != h);

        return h;
}

struct bclist* bclist_free(struct bclist* h)
{
        struct bclist* p = h;
        do {
                p = p->next;
        } while(p != h);

        return h;
}

void bclist_print(struct bclist* h)
{
        struct bclist* p = h;

        do {
                printf("%d ", p->data);
                p = p->next;
        }while(p != h);

        printf("\n");
}

int main(int argc, char** argv)
{
        const int ret = 0;
        struct bclist* h = NULL;

        h = bclist_init(0);
        bclist_add(h, 1);
        bclist_add(h, 2);
        bclist_add(h, 3);
        bclist_add(h, 2);
        bclist_print(h);

        bclist_delete(h, 2);
        bclist_add(h, 5);
        bclist_print(h);

        return ret;
}

尚未实现

  • bclist_free删除链表所有元素

相关文章

  • 双向链表&双向循环链表

    链表分为:单链表、单向循环链表、双向链表、双向循环链表本节主要说明:双向链表、双向循环链表 定义结点 一、双向链表...

  • 0x05双向循环链表

    1 双向循环链表创建 2 双向循环链表插入元素 3 遍历双向循环链表 4双向循环链表删除结点

  • 双向链表

    双向链表的结构 既然单链表有循环链表,双向链表当然也有双向循环链表,如下图: 问: 双向链表中某个节点p的后继节点...

  • 线性表--链式存储结构--双向链表

    双向链表 一、双向链表结构 双向链表结点结构 既然单链表可以有循环链表,那么双向链表当然也可以有。 由于这是双向链...

  • 数据结构与算法之数组与链表

    线性表包括数组,链表(单链表,双向链表,循环链表,双向循环链表,静态链表),栈(顺序栈,链式栈),队列(普通队列,...

  • 链表

    链表 缺点:查找复杂有点:定点删除/插入元素 单链表 双向链表 循环链表 双向循环链表 数组与链表的区别 数据存储...

  • 数据结构与算法之栈与队列

    线性表包括数组,链表(单链表,双向链表,循环链表,双向循环链表,静态链表),栈(顺序栈,链式栈),队列(普通队列,...

  • 常见的数据结构

    常见的数据结构有: 数组 链表单链表、双向链表、循环链表、双向循环链表、静态链表 栈顺序栈、链式栈 队列普通队列、...

  • 33_双向循环链表的实现

    关键词:双向循环链表 0. 课程目标 使用Linux内核链表实现双向循环链表 template < typenam...

  • 数据结构与算法04-双向链表以及双向循环链表

    一、双向链表 0、定义结点 1、创建双向链接 2、打印循环链表的元素 3、双向链表插入元素 4、删除双向链表指定位...

网友评论

      本文标题:双向循环链表

      本文链接:https://www.haomeiwen.com/subject/mbbasttx.html