美文网首页
数据结构 ⑤ 双向循环链表

数据结构 ⑤ 双向循环链表

作者: _涼城 | 来源:发表于2020-04-04 22:13 被阅读0次
双向循环链表.png

双向循环链表的实现

  • 初始化

    /*
      初始化
     */
    void DuLinkListInit(DuLinkList *Head){
      *Head = (DuLinkList)malloc(sizeof(DuLNode));
      if (*Head == NULL)
      {
          printf("初始化失败\n");
      }
      (*Head)->next = (*Head);
      (*Head)->prior = (*Head);
      (*Head)->data = -1;
      printf("初始化成功\n");
    }
    
  • 插入

    /*
      插入
     */
    void insertDuLNode(DuLinkList *head,int place,int num){
      //校验合法
      if (place == 0)
      {
          printf("请从1开始插入\n");
          return;
      }
       //1. 创建指针p,指向双向链表头
        DuLNode *p = (*head);
    
        int i = 1;
        
        //2.双向循环链表为空,则返回error
        if(*head == NULL){
            printf("插入失败 链表为空\n");
        }
       
        //3.找到插入前一个位置上的结点p
        while (i < place && p->next != *head) {
            p = p->next;
            I++;
        }
        
        //4.如果i>index 则返回error
        if (i < place) {
            printf("插入失败 %d\n", place);
            return;
        }
        
        //5.创建新结点temp
        DuLNode *temp = (DuLNode *)malloc(sizeof(DuLNode));
        
        //6.temp 结点为空,则返回error
        if (temp == NULL) {
            printf("插入失败");
        }
        
        //7.将生成的新结点temp数据域赋值e.
        temp->data = num;
        
        //8.将结点temp 的前驱结点为p;
        temp->prior = p;
        //9.temp的后继结点指向p->next;
        temp->next = p->next;
        //10.p的后继结点为新结点temp;
        p->next = temp;
        
        //如果temp 结点不是最后一个结点
        if (*head != temp->next) {
            
            //11.temp节点的下一个结点的前驱为temp 结点
            temp->next->prior = temp;
        }else{
    
            (*head)->prior = temp;
            
        }
        printf("插入成功-%d\n",temp->data);
    }
    
    
  • 删除

    /*
      删除
     */
    void deleteDuLNode(DuLinkList *head,int place){
       
        int i = 1;
        DuLinkList temp = (*head)->next;
        
        if (*head == NULL) {
          printf("删除失败\n");
            return;
        }
        
        if(temp->next == *head){
            free(*head);
            (*head) = NULL;
            printf("删除成功\n");
            return;
        }
        
        //1.找到要删除的结点
        while (i < place && temp != (*head)) {
            temp = temp->next;
            I++;
        }
       
       if (temp == *head){
            printf("删除失败%d\n",temp->data);
    
            return;
        }else{
          printf("删除%d\n",temp->data);
        }
    
        //2.修改被删除结点的前驱结点的后继指针 
        temp->prior->next = temp->next;
        //3.修改被删除结点的后继结点的前驱指针 
        temp->next->prior = temp->prior;
        //4. 删除结点temp
        free(temp);
        printf("删除成功\n");
        return ;
    }
    

相关文章

  • 常见的数据结构

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

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

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

  • 0x05双向循环链表

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

  • 链表

    内容 链表数据结构 向链表添加元素 从链表移除元素 使用 LinkedList 表 双向链表 循环链表 链表数据结...

  • 集合-LinkedList解析

    一、概要 Java中底层数据结构是链表、双端链表,Android中数据结构是双向循环链表 非线程安全数据结构,允许...

  • container 中的容器

    container包中有三个非常常用的数据结构(容器),分别是:list(双向链表)、ring(双向循环链表)、h...

  • 数据结构与算法相关

    第二章 数据结构与算法相关 1.常用的数据结构有哪些? 数组、栈、队列、链表(单链表、双向链表、循环链表)、树、散...

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

    双向链表 双向链表示意图如下: 数据结构定义 创建双向链表 双向链表插入元素 双向链表删除元素 双向链表打印元素 ...

  • 双向链表

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

  • 数据结构

    数据结构 队列&栈&链表&集合&hash表&树&图 队列 先进先出 栈 先进后出 链表 单向链表 双向链表 循环链...

网友评论

      本文标题:数据结构 ⑤ 双向循环链表

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