数据结构 - 双链表的头插法和后插法
1.单链表的局限性
-> 单链表是对数组的一个扩展,解决了数组的大小比较死板不容易扩展的问题。使用堆内存来存储数据,将数据分散到各个节点之间,其各个节点在内存中可以不相连,节点之间通过指针进行单向链接。链表中的各个节点内存不相连,有利于利用碎片化的内存。
-> 单链表各个节点之间只由一个指针单向链接,这样实现有一些局限性。局限性主要体现在单链表只能经由指针单向移动(一旦指针移动过某个节点就无法再回来,如果要再次操作这个节点除非从头指针开始再次遍历一次),因此单链表的某些操作就比较麻烦(算法比较有局限)。回忆之前单链表的所有操作(插入、删除节点、 遍历、从单链表中取某个节点的数·····),因为单链表的单向移动性导致了不少麻烦。
2.双向循环链表引入
单链表的节点 = 有效数据 + 指针(指针指向后一个节点)
双向链表的节点 = 有效数据 + 2个指针(一个指向后一个节点,另一个指向前一个节点)
3.双向链表结点的描述
即双链表的结点包含三个部分,两个指针域,一个数据域。
4.描述双链表的结构体
// 双链表的节点
struct node
{int data; // 有效数据struct node *pPrev; // 前向指针,指向前一个节点struct node *pNext; // 后向指针,指向后一个节点
};
5.创建一个节点
struct node *create_node(int data)
{struct node *p = (struct node *)malloc(sizeof(struct node));if (NULL == p){printf("malloc error.\n");return NULL;}p->data = data;p->pPrev = NULL;p->pNext = NULL; // 默认创建的节点前向后向指针都指向NULLreturn p;
}
6.双向循环链表的创建
dlistnode* dlist_create()
{dlistnode *H,*p,*r;int n;H = (dlistnode*)malloc(sizeof(dlistnode));if(NULL == H){printf("malloc failed\n");return NULL;}H ->prior = H;H ->next = H;r = H;while(1){printf("please input num(-1 exit):");scanf("%d",&n);if(n == -1){break;}p = (dlistnode*)malloc(sizeof(dlistnode));if(NULL == p){printf("malloc failed\n");return NULL;}p->data = n;p->prior = r;p->next = r->next;r->next = p;H->prior = p;r = p;}return H;
}
7.从尾部插入一个节点
// 将新节点new插入到链表pH的尾部
void insert_tail(struct node *pH, struct node *new)
{// 第一步先走到链表的尾节点struct node *p = pH;while (NULL != p->pNext){p = p->pNext; // 第一次循环走过了头节点}// 循环结束后p就指向了原来的最后一个节点// 第二步:将新节点插入到原来的尾节点的后面p->pNext = new; // 后向指针关联好了。新节点的地址和前节点的nextnew->pPrev = p; // 前向指针关联好了。新节点的prev和前节点的地址// 前节点的prev和新节点的next指针未变动
}
8.从头部插入一个节点
// 将新节点new前插入链表pH中。
// 算法参照图示进行连接,一共有4个指针需要赋值。注意的是顺序。
void insert_head(struct node *pH, struct node *new)
{// 新节点的next指针指向原来的第1个有效节点的地址new->pNext = pH->pNext;// 原来第1个有效节点的prev指针指向新节点的地址if (NULL != pH->pNext)pH->pNext->pPrev = new;// 头节点的next指针指向新节点地址pH->pNext = new;// 新节点的prev指针指向头节点的地址new->pPrev = pH;
}
数据结构 - 双链表的头插法和后插法相关推荐
- 单链表的头插法和尾插法c语言实现
/*单链表的头插法和尾插法c语言实现*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #d ...
- 单链表建立——头插法和尾插法
引言 当我们准备采用单链表形式实现线性表,第一步就是要建立单链表,即初始化.由于链表是一个动态结构,不需要预先分配空间,因此生成链表的过程就是"逐个插入"的过程,插入结点的位置可以 ...
- 链表的头插法和尾插法——头插尾插交替插入
private static ListNode dummy = new ListNode(0);//头插法public static void headInsert(ListNode node){if ...
- 单链表的头插法和尾插法实现代码(无头结点)
/*头指针,可以发现head是赋值为NULL,而不是head->next*/ //-----------------头插法------------------- node *head, *p; ...
- 关于单链表的头插法和尾插法
#include<stdio.h> #include<stdlib.h> typedef struct Node { // 定义的链表类型 ...
- 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表
http://blog.csdn.net/abclixu123/article/details/8210109 链表也是线性表的一种,与顺序表不同的是,它在内存中不是连续存放的.在C语言中,链表是通过 ...
- 头插法和尾插法创建链表(有无头结点)
头插法和尾插法创建链表(有无头结点) 文章目录 头插法和尾插法创建链表(有无头结点) 1 头插法 1.1头插法建表规则: 1.2 头插法建表代码实现 2 尾插法 2.1 尾插法建表规则: 2.2 尾插 ...
- 单链表的前插法和后插法创建
根据结点插入位置的不同,链表的创建方法可分为前插法和后插法 前插法 前插法是通过将新节点逐个插入链表的头部(头节点之后)来创建链表,每次申请一个新节点,读入相应的数据元素值,然后将新节点插入到头节点之 ...
- c语言 链表建立头插法尾插法,单链表的创建(头插法和尾插法)
单链表的创建分为头插法和尾插法,头插法是不断地向头结点插入新的结点.这样会使你所插入的结点值呈现逆序,所以头插法也可以实现单链表的逆置.尾插法是不断地向插入的新元素之后再插入新的元素.需要注意的是头插 ...
最新文章
- Python-map、reduce、filter、sorted函数
- 实践:大规模混合部署项目在字节跳动的落地
- 2019暑假第三周总结
- httpcline转发_如何实现Http请求报头的自动转发[应用篇]
- [BZOJ4027][HEOI2015]兔子与樱花(贪心)
- Trial SCN WebIDE版本下载
- Error: org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block: BP-965200530-172.21.
- OSS音频编程概述(DSP部分)
- 音视频开发(23)---音视频直播技术--10分钟搭建好直播平台
- 【工具使用系列】一小时学会使用MATLAB OPC 工具箱(OPC Toolbox)
- java map映射_java8流操作之map映射
- 如何遮挡电影英汉字幕
- pd.read_csv处理含中文的文件
- 为 Macbook Pro 选择外接键盘
- vite按需引入 Ant Design Vue 3.0
- Java字符串反转函数reverse()
- MotionEvent 事件解读
- uni-app H5打包上线流程
- bs84c12引脚_最新BS84B12A-3.pdf
- python学习第十三节:模块