zoukankan      html  css  js  c++  java
  • 双向循环链表及内核链表

    1.双向循环链表原理图

     设计双向循环链表节点

    typedef struct _DCLink{
        struct _DCLink *prev;
        struct _DCLink *next;
        int data;
    }DCLink;

    设计双向循环链表的接口

    1.创建链表节点

    DCLink *create_node(elemType data);

    2.创建链表

    DCLink *crate_dclink();

    3.插入数据

    bool insert_dclink(DCLink *head,elemType data);

    4.删除数据

    bool delete_dclink(DCLink *head,elemType data);

    5.查找

    DCLink *local_dclink(DCLink *head,elemType data);

    6.显示

    void display_dclink(DCLink *head);

    下面是示例代码

    dclink.h

    #ifndef DCLINK_H
    #define DCLINK_H

    #include <stdio.h>
    #include <stdbool.h>
    #include <stdlib.h>
    #include <unistd.h>

    typedef int elemType;

    typedef struct _DCLink{
      struct _DCLink *prev;
      struct _DCLink *next;
      elemType data;
    }DCLink;

    //设计双向循环链表的接口
    //创建链表节点
    DCLink *create_node(elemType data);
    //创建链表
    DCLink *create_dclink();
    //插入数据
    bool insert_dclink(DCLink *head,elemType data);
    bool insert_dclink_tail(DCLink *head,elemType data);
    //删除数据
    bool delete_dclink(DCLink *head,elemType data);
    //查找
    DCLink *local_dclink(DCLink *head,elemType data);
    //显示
    void display_dclink(DCLink *head);
    #endif
    dclink.c

    #include "dclink.h"

    //创建链表节点
    DCLink *create_node(elemType data)
    {
      DCLink *node = malloc(sizeof(DCLink));
      //初始化
      node->data = data;
      node->prev node->next = node;
      return node;
    }

    //创建链表
    DCLink *create_dclink()
    {
      return DCLink *create_node(0);
    }

    //插入数据  头插法
    bool insert_dclink(DCLink *head,elemType data)
    {
      if(head == NULL)return false;
      
      //创建一个新的节点
      DCLink *node = create_node(data);
      node->next = head->next;
      node->prev = head;
      head->next->prev = node;
      head->next = node;
      return true;
    }

    //尾插法
    bool insert_dclink_tail(DCLink *head,elemType data)
    {
      head = head->precv;
      insert_dclink(head,data);
    }

    //删除数据
    bool delete_dclink(DCLink *head,elemType data)
    {
      DCLink *node = local_dclink(head,data);
      if(node == NULL)return false;
      
      node->prev->next = node->next;
      node->next->prev = node->prev;
      free(node);
      return true;
    }

    //查找
    DCLink *local_dclink(DCLink *head,elemType data)
    {
      if(head == NULL)return NULL;
      //记录头结点用于判断结束循环
      DCLink *p = head->next;

      while(p != head0
      {
        if(p->data == data)return p;
        p = p->next;  
      }
      return NULL;
    }

    //显示
    void display_dclink(DCLink *head)
    {
      if(head == NULL)return;
      //记录头结点用于判断结束循环
      DCLink *p = head->next;
      
      while(p != head0
      {
        printf("%d",p->data);
        p = p->next;
      }
      printf(" ");
    }
    #include "dclink.h"
    
    int main()
    {
        //创建节点
        DCLink head = create_node(0);
        
        insert_dclink(head,12);
        
        display_dclink(head);
        
        return 0;
    }

    内核循环链表(原理图)

    设计一个结构L1/L2

    struct list_head{
        struct list_head *next;
        struct list_head *prev;
    };

    设计一个结构体S1/S2

    struct Student{
        int age;
        struct list_head list;
    };
     

     内核链表太难了,我也不是很会,就不写了。有哪里写错请指出,谢谢。

  • 相关阅读:
    python_day11 mysql
    python_day10 多线程 协程 IO模型
    python_day09 多进程 多线程 协程 paramiko模块
    python_day08 接口与归一化设计 多态与多态性 封装 面向对象高级 异常处理 网络编程
    python_day07 常用模块xml/configparser/hashlib/subprocess 面向对象程序设计
    python_day06 匿名函数与内置函数 常用模块
    python_day05 协程函数 面向过程编程 递归和二分法 模块和包的使用 常用模块 开发代码规范
    python_day04 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式
    python_day03 文件处理复习和函数定义调用参数对象
    python_day02 基本数据类型操作,字符编码,文件处理
  • 原文地址:https://www.cnblogs.com/smallqizhang/p/12394814.html
Copyright © 2011-2022 走看看