双向链表结点的插入
文章图片
【双向链表结点的插入】
文章图片
// * ======================================== */
// *程式实例: 4_3_2.c*/
// *双向链结串列内节点插入*/
// * ======================================== */
#include struct dlist// * 双向串列结构宣告*/
{
int data;
// * 节点资料*/
struct dlist *front;
// * 指向下一节点的指标*/
struct dlist *back;
// * 指向前一节点的指标*/
};
typedef struct dlist dnode;
// * 双向串列新型态*/
typedef dnode *dlink;
// * 双向串列指标新型态*/// * ---------------------------------------- */
// *双向链结串列的列印*/
// * ---------------------------------------- */
void printdlist(dlink head)
{
while ( head != NULL )// * 串列走访回路*/
{
printf("[%d]",head->data);
// * 列印节点资料*/
head = head->front;
// * 指向下一个节点*/
}
printf("\n");
// * 换行*/
}// * ---------------------------------------- */
// *双向链结串列的节点插入*/
// * ---------------------------------------- */
dlink insertnode(dlink head,dlink ptr,int value)
{
dlink new_node;
// * 新节点的指标*/// * 建立新节点,配置节点记忆体 */
new_node = ( dlink ) malloc(sizeof(dnode));
if ( !new_node )// * 检查记忆体指标*/
return NULL;
new_node->data = https://www.it610.com/article/value;
// * 建立节点内容*/
new_node->front = NULL;
// * 设定指标初值*/
new_node->back = NULL;
// * 设定指标初值*/if ( head == NULL )// * 如果串列是空的*/
return new_node;
// * 传回新节点指标*/if ( ptr == NULL )
{
// * 第一种情况: 插在第一个节点之前, 成为串列开始 */
new_node->front = head;
// * 新节点指向串列开始*/
head->back = new_node;
// * 原节点指向新节点*/
head = new_node;
// * 新节点成为串列开始*/
}
else
{
if ( ptr->front == NULL )// * 是否有下一个节点*/
{
// * 第二种情况: 插在串列的最後 */
ptr->front = new_node;
// * 最後节点指向新节点*/
new_node->back = ptr;
// * 新节点指回最後节点*/
}
else
{
// * 第三种情况: 插入节点至串列中间节点内 */
ptr->front->back = new_node;
// *下一节点指回新节点*/
new_node->front = ptr->front;
// *新节点指向下一节点*/
new_node->back = ptr;
// * 新节点指回插入节点*/
ptr->front = new_node;
// * 插入节点指向新节点*/
}
}
return head;
// * 传回串列起始指标*/
}// * ---------------------------------------- */
// *主程式:*/
// *使用插入节点的方式来建立串列, 完成後将*/
// *串列内容印出.*/
// * ---------------------------------------- */
void main()
{
dlink head = NULL;
// * 环状链结串列指标*/
dlink tail = NULL;
// * 串列最後的指标*/
int list[6] = { 1, 2, 3, 4, 5, 6 };
// * 阵列内容*/
int i;
head = insertnode(head,head,list[0]);
// *建立第一个节点*/
printdlist(head);
// * 印出串列*/
tail = head;
// * 保留串列最後指标*/
// * 第一种情况: 插在第一个节点之前 */
head = insertnode(head,NULL,list[1]);
printdlist(head);
// * 印出串列*/
// * 第二种情况: 插在串列的最後 */
head = insertnode(head,tail,list[2]);
printdlist(head);
// * 印出串列*/
for ( i = 3;
i < 6;
i++ )// * 建立串列节点*/
{
// * 第三种情况: 插入节点至串列中间节点内 */
head = insertnode(head,head,list[i]);
printdlist(head);
// * 印出串列*/
}
}
推荐阅读
- leetcode|leetcode 92. 反转链表 II
- LeetCode|LeetCode 876. 链表的中间结点
- redis|redis 链表
- C语言数据结构之二叉链表创建二叉树
- 链表|链表 LC.19/83/92/61/143/21/160/141/147/138/142
- 数据结构|C++技巧(用class类实现链表)
- 27|27 二叉搜索树与双向链表
- 如何理解vue数据双向绑定原理
- LinkedBlockingQueue分析
- 乘风破浪的新手妈妈D78