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; };
内核链表太难了,我也不是很会,就不写了。有哪里写错请指出,谢谢。
原文:https://www.cnblogs.com/smallqizhang/p/12394814.html