数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数

简介: 数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数

结点类型定义

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
 
typedef int LTDataType;
 
typedef struct ListNode
{
    LTDataType data;
    struct ListNode* next;
    struct ListNode* prev;
}LTNode;

初始化函数

LTNode* ListInit()
{
    //哨兵位头结点
    LTNode* phead = (LTNode*)malloc(sizeof(LTNode));
    phead->next = NULL;
    phead->prev = NULL;
 
    return phead;
}

创建新结点函数

LTNode* BuyListNode(LTDataType x)
{
    LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));
    newnode->data = x;
    newnode->next = NULL;
    newnode->prev = NULL;
    return newnode;
}

尾插函数

代码

void ListPushBack(LTNode* phead, LTDataType x)
{
    assert(phead);
 
    LTNode* newnode = BuyListNode(x);
    LTNode* tail = phead->prev;
 
    tail->next = newnode;
    newnode->prev = tail;
    newnode->next = phead;
    phead->prev = newnode;
}

实现思路

为什么这个尾插函数不需要传入二级指针呢?

详细看我们的代码:


我们至始至终,有改变其值的,只有tail中的next指针、newnode的prev指针、newnode的next指针和phead的prev指针。

而phead本身的地址,或者说phead本身的值并没有被改变,所以就不需要传入二级指针来改变phead的值了。

打印双向链表函数

void ListPrint(LTNode* phead)
{
    assert(phead);
 
    LTNode* cur = phead->next;
    while (cur != phead)
    {
        printf("%d ", cur->data);
        cur = cur->next;
    }
    printf("\n");
}

尾删函数

实现方式一

void ListPopBack(LTNode* phead)
{
    assert(phead);
    assert(phead->next != phead);
 
    LTNode* tail = phead->prev;
    LTNode* tailPrev = tail->prev;
    free(tail);
 
    tailPrev->next = phead;
    phead->prev = tailPrev;
}

实现方式二

void ListPopBack(LTNode* phead)
{
    assert(phead);
    assert(phead->next != phead);
    LTNode* tail = phead->prev;
 
    phead->prev = tail->prev;
    tail->prev->next = phead;
    free(tail);
}


第二种赋值的语句先后顺序无影响

需要注意的是:不能把哨兵位结点也一起删了,即当phead->next == phead时,就表示此事链表为空,只剩下一个哨兵位结点了。该结点不存数据。


线性表之双向链表(下)

目录
相关文章
|
8天前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
11天前
|
存储 算法 数据安全/隐私保护
【Python学习篇】Python实验小练习——高级数据结构(五)
【Python学习篇】Python实验小练习——高级数据结构(五)
25 1
|
1天前
|
算法 Java
[Java·算法·中等] LeetCode21. 合并两个有序链表
[Java·算法·中等] LeetCode21. 合并两个有序链表
9 2
|
1天前
|
存储 算法 Go
算法学习:数组 vs 链表
算法学习:数组 vs 链表
6 0
|
5天前
|
算法
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
|
8天前
|
存储 数据挖掘 数据处理
【python源码解析】深入 Pandas BlockManager 的数据结构和初始化过程
【python源码解析】深入 Pandas BlockManager 的数据结构和初始化过程
|
12天前
|
存储 算法 C语言
数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)
数据结构学习记录——图-最短路径问题(无权图单源最短路径算法、有权图单源最短路径算法、多源最短路径算法、Dijkstra(迪杰斯特拉)算法、Floyd算法)
18 1
|
12天前
|
存储 算法 测试技术
数据结构学习记录——树习题-Complete Binary Search Tree(题目描述、输入输出示例、数据结构的选择、核心算法、计算左子树的规模)
数据结构学习记录——树习题-Complete Binary Search Tree(题目描述、输入输出示例、数据结构的选择、核心算法、计算左子树的规模)
13 1
|
12天前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
12 1
|
12天前
|
存储
数据结构学习记录——如何建立图(邻接矩阵、邻接表-图节点的结构、创建并初始化、插入变、完整图的建立)
数据结构学习记录——如何建立图(邻接矩阵、邻接表-图节点的结构、创建并初始化、插入变、完整图的建立)
13 0

热门文章

最新文章