您的位置:首页 > 理论基础 > 数据结构算法

数据结构--双向链表的实现(内含c代码,已调试,可用)

2022-03-08 14:02 567 查看

10 个数据结构:数组链表队列散列表二叉树跳表Trie 树

本节先对双向向链表的学习(主要是使用代码进行实现

1:双向链表的理论介绍:

链表原理如下图所示:

 

 双链表是链表的一种,由节点组成,每个数据结点中都有两个指针,分别指向直接后继和直接前驱。

(上面的理论也是粘贴复制的因为有太多的理论介绍了。主要是为了记录自己代码实现,增加成就感,O(∩_∩)O哈哈~)

 

2:双向链表的代码实现

#include <stdio.h>
#include <malloc.h>
#include <string.h>

#define false 0
#define true  1
//双向链表
typedef struct node{
struct node * next;
struct node * pre;
int data;
}my_doubly_list;

//双向链表初始化
my_doubly_list* init_signal_list(void)
{
//定义一个链表头指针
my_doubly_list* list_head = NULL;

//申请链表堆空间
list_head = (my_doubly_list*)malloc(sizeof(my_doubly_list));
if(NULL == list_head)
{
return NULL;
}

memset(list_head, 0, sizeof(my_doubly_list));
list_head->next = NULL;
list_head->pre = NULL;
return list_head;
}

//双向链表的插入(此处采用头插法)
bool insert_signal_list(my_doubly_list* list_head, int insert_data)
{
my_doubly_list* tmp_list_ptr = NULL;
my_doubly_list * insert_list_data = NULL;

if(NULL == list_head)
{
return false;
}
tmp_list_ptr = list_head;

//申请链表节点堆空间
insert_list_data = (my_doubly_list*)malloc(sizeof(my_doubly_list));
if(NULL == list_head)
{
return false;
}

if(NULL == list_head->next)
{
//头插法
insert_list_data->data = insert_data;
insert_list_data->pre = tmp_list_ptr;
insert_list_data->next = tmp_list_ptr->next;
tmp_list_ptr->next = insert_list_data;
}
else
{
my_doubly_list* tmp_next_ptr = list_head->next;
//先把后面的节点指向我们新增的节点的位置上
tmp_next_ptr->pre = insert_list_data;

//在将我们的新节点指向头结点之后的节点;
insert_list_data->next = tmp_list_ptr->next;
//再把新节点pre指向头结点
insert_list_data->pre = tmp_list_ptr;

//再把头结点指向新增的节点。
tmp_list_ptr->next = insert_list_data;

//最后吧数值复制
insert_list_data->data = insert_data;
}

return true;
}

//单向链表的插入(此处采用尾插法)
void print_signal_list(my_doubly_list* list_head)
{
//申请一个临时的head指针。避免对head指针的直接操作,丢失头指针的位置
my_doubly_list* tmp_list_ptr = NULL;

tmp_list_ptr = list_head;
while(NULL != tmp_list_ptr && NULL != tmp_list_ptr->next)
{
//获取下一个节点
tmp_list_ptr = tmp_list_ptr->next;
printf("%d\n",tmp_list_ptr->data);
}
return;
}
int main(void)
{
//使用
my_doubly_list * list_head = init_signal_list();
if(NULL != list_head)
{
insert_signal_list(list_head,2);
insert_signal_list(list_head,4);
insert_signal_list(list_head,5);
insert_signal_list(list_head,6);
insert_signal_list(list_head,8);
}
print_signal_list(list_head);
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: