双向循环链表及内核链表

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("\n");
}
#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;
};
 

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

猜你喜欢

转载自www.cnblogs.com/smallqizhang/p/12394814.html