数据结构--双向链表的实现(内含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; }
相关文章推荐
- 看数据结构写代码(6)双向链表的实现
- 数据结构基础(12) --双向循环链表的设计与实现
- 数据结构基础(12) --双向循环链表的设计与实现
- 数据结构----链表(单向链表)(java实现代码)
- C语言 数据结构之链表实现代码
- 数据结构(C实现)------- 双向链表
- 数据结构之双向链表的Java实现
- 数据结构笔记:3.7 双向链表概念及基本操作代码
- 数据结构之双向链表的实现
- 数据结构课程设计-----用C#实现双向链表
- 数据结构基础(12) --双向循环链表的设计与实现
- 数据结构算法代码实现——线性表的链式表示与实现(单链表)(三 )
- 【数据结构04】双向链表概述及Java实现
- 数据结构基础(12) --双向循环链表的设计与实现
- 数据结构之链表、栈和队列 java代码实现
- 数据结构之双向链表的Java实现
- python——python 数据结构之双向链表的实现
- 数据结构中双向链表和双向循环链表C语言实现
- 已知线性表中的元素以值递增顺序排列,并以双向链表为存储结构。试实现以下功能:删除表中所有[MinNum, MaxNum]范围内的数据。
- 数据结构(四)线性表中链表:双向循环链表功能的实现