美文网首页
线性表-双向链表与双向循环链表

线性表-双向链表与双向循环链表

作者: 爱哭鬼丫头 | 来源:发表于2020-04-11 21:51 被阅读0次

双向链表

双向链表示意图如下:


非空的双向链表.jpg

数据结构定义

typedef struct Node {
    struct Node *next;
    struct Node *pre;
    ElemType data;
}Node;

typedef Node * LinkList;

创建双向链表

Status CreateList(LinkList * list) {
    *list = (LinkList)malloc(sizeof(Node));
    if (NULL == list) {
        return ERROR;
    }
    (*list)->pre = NULL;
    (*list)->next = NULL;
    (*list)->data = -1;
    
    LinkList p = *list;
    for (int i = 0; i < 10; i++) {
        LinkList tmp = (LinkList)malloc(sizeof(Node));
        tmp->data = i;
        p->next = tmp;
        tmp->pre = p;
        p = tmp;
    }
    return OK;
}

双向链表插入元素

Status InsertList(LinkList *list, int i, ElemType data) {
    if (i < 1) {
        return ERROR;
    }
    
    LinkList node = (LinkList)malloc(sizeof(Node));
    node->data = data;
    node->pre = NULL;
    node->next = NULL;
    
    LinkList tmp = *list;
    for (int j = 1; j < i && tmp; j++) {
        tmp = tmp->next;
    }
    
    if (NULL == tmp) {
        return ERROR;
    }
    
    if (NULL == tmp->next) {
        tmp->next = node;
        node->pre = tmp;
    } else {
        node->next = tmp->next;
        tmp->next->pre = node;
        node->pre = tmp;
        tmp->next = node;
    }
    return OK;
}

双向链表删除元素

Status Delete(LinkList *list, int i, ElemType *e) {
    if (i < 1 || NULL == list) {
        return ERROR;
    }
    
    LinkList p = *list;
    for (int j = 1; j < i && p; j++) {
        p = p->next;
    }
    
    if (NULL == p) {
        return ERROR;
    }
    
    LinkList deletNode = p->next;
    *e = deletNode->data;
    
    p->next = deletNode->next;
    if (p->next) {
        p->next->pre = p;
    }
    free(deletNode);
    return OK;
}

双向链表打印元素

void PrintList(LinkList list) {
    LinkList p = list->next;
    if (NULL == p) {
        printf("链表为空\n");
        return;
    }
    printf("链表数据为:\n");
    while (p) {
        printf("%d\n",p->data);
        p = p->next;
    }
}

双向链表删除指定元素

Status LinkListDeletVAL(LinkList *list, int data) {
    LinkList p = *list;
    while (p) {
        if (p->data == data) {
            p->pre->next = p->next;
            if (p->next != NULL) {
                p->next->pre = p->pre;
            }
            free(p);
           
        }
        p = p->next;
    }
    return OK;
}

双向循环链表

双向循环链表示意图如下:


空的双向循环链表.jpg 非空双向循环链表.jpg

数据结构定义(同上)

typedef struct Node {
    struct Node *next;
    struct Node *pre;
    ElemType data;
}Node;

typedef Node * LinkList;

双向循环链表创建元素

Status CreateList(LinkList * list) {
    *list = (LinkList)malloc(sizeof(Node));
    if (NULL == list) {
        return ERROR;
    }
    (*list)->pre = *list;
    (*list)->next = *list;
    (*list)->data = -1;
    
    LinkList p = *list;
    for (int i = 0; i < 10; i++) {
        LinkList tmp = (LinkList)malloc(sizeof(Node));
        tmp->data = i;
        
        p->next = tmp;
        tmp->pre = p;
        tmp->next = *list;
        (*list)->pre = tmp;
        p = tmp;
    }
    return OK;
}

双向循环链表插入元素

Status InsertList(LinkList *list, int i, ElemType data) {
    if (i < 1) {
        return ERROR;
    }
    
    LinkList node = (LinkList)malloc(sizeof(Node));
    node->data = data;
    node->pre = NULL;
    node->next = NULL;
    
    LinkList tmp = *list;
    for (int j = 1; j < i && tmp; j++) {
        tmp = tmp->next;
    }
    node->next = tmp->next;
    tmp->next->pre = node;
    node->pre = tmp;
    tmp->next = node;
    return OK;
}

双向循环链表删除结点

Status Delete(LinkList *list, int i, ElemType *e) {
    if (i < 1 || NULL == list) {
        return ERROR;
    }
    
    LinkList p = *list;
    for (int j = 1; j < i && p; j++) {
        p = p->next;
    }
    
    LinkList deletNode = p->next;
    *e = deletNode->data;
    
    p->next = deletNode->next;
    p->next->pre = p;
    free(deletNode);
    return OK;
}

双向循环链表与双向链表的基本算法实现,差异很小~

相关文章

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

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

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

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

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

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

  • 双向链表和双向循环链表

    双向链表 线性表-双向链表的结点结构: 带头结点的双向链表: 1.双向链表初始化 2.遍历双向链表 2.双向链表插...

  • 0x05双向循环链表

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

  • 单链表线性表

    用链表来表示线性表,还有循环链表,双向链表其中算法很多都是相同的,循环链表的特点是最后一个指针指向头指针,双向链表...

  • 链表

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

  • 数据结构-单向链表

    一、线性表 线性表可以分为: 顺序表(数组) 链表(单向链表、双向链表、循环链表) 二、链表 链表是一种链式存储的...

  • 双向链表

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

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

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

网友评论

      本文标题:线性表-双向链表与双向循环链表

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