首页 > 其他分享 >数据结构:双向链表

数据结构:双向链表

时间:2024-08-29 22:52:05浏览次数:10  
标签:pTmpNode pNewNode NULL 链表 pHead 双向 数据结构 LinkNode pNext

目录

结构体

创建链表

插入链表

头插法

尾插法

 遍历打印

删除

更新

查找

销毁


结构体

typedef int DataType;

typedef struct node
{
    struct node *pPre;
    DataType data;
    struct node *pNext;
}LinkNode;

创建链表

LinkNode *CreateDouList()
{
    LinkNode *pHead=NULL;
    pHead=malloc(sizeof(LinkNode));
    if(pHead==NULL)
    {
        return NULL;
    }
    pHead->pPre=NULL;
    pHead->pNext=NULL;
    return pHead;
}

插入链表

头插法

int HeadInsertDouList(LinkNode *pHead,DataType Tmpdata)
{
//申请新节点
    LinkNode *pNewNode=NULL;
    pNewNode=malloc(sizeof(LinkNode));
    if(pNewNode==NULL)
    {
        return 0;
    }
//为新节点数据项赋值
    pNewNode->data=Tmpdata;
//新节点pnext指向原来的第一个节点
    pNewNode->pNext=pHead->pNext;
//新节点的pre指向头结点
    pNewNode->pPre=pHead;
//头节点的pnext指向新节点
    pHead->pNext=pNewNode;
//链表不为空时,后一个节点的pre指向新节点
    if(pNewNode->pNext!=NULL)
    {
        pNewNode->pNext->pPre=pNewNode;
    }
    return 0;
}

尾插法

int TailInsertDouList(LinkNode *pHead,DataType Tmpdata)
{
    LinkNode *pNewNode=NULL;
    LinkNode *pTmpNode=NULL;
    pNewNode=malloc(sizeof(LinkNode));
    if(pNewNode==NULL)
    {
        return 0;
    }
    pTmpNode=pHead;
    while(pTmpNode->pNext!=NULL)
    {
        pTmpNode=pTmpNode->pNext;
    }
    pNewNode->data=Tmpdata;
    pNewNode->pNext=NULL;
    pNewNode->pPre=pTmpNode;
    pTmpNode->pNext=pNewNode;
    return 0;

}

 遍历打印

int ShowDouList(LinkNode *pHead)
{
    LinkNode *pTmpNode=NULL;
    pTmpNode=pHead->pNext;
    while(pTmpNode!=NULL)
    {
        printf("%d  ",pTmpNode->data);
        pTmpNode=pTmpNode->pNext;
    }
    return 0;
}

删除

//删除
int DeleteDouList(LinkNode *pHead,DataType Tmpdata)
{
    LinkNode *pTmpNode=NULL;
    LinkNode *pNextNode=NULL;
    pTmpNode=pHead->pNext;
    while(pTmpNode!=NULL)
    {
        if(pTmpNode->data==Tmpdata)
        {
           pNextNode = pTmpNode->pNext;
            pTmpNode->pPre->pNext=pTmpNode->pNext;
            if(pTmpNode->pNext!=NULL)
            {
                pTmpNode->pNext->pPre=pTmpNode->pPre;
            }
            
            free(pTmpNode);
        }
        pTmpNode=pNextNode;
        //pTmpNode=pTmpNode->pNext;虽然pTmpNode被释放,但是堆区里面的内容如果没有被重新分配,数据就还存在,此时可以访问到但是属于非法访问
    }
    return 0;
}

更新

int UpdateDouList(LinkNode *pHead,DataType OldData,DataType NewData)
{
    LinkNode *pTmpNode=NULL;
    pTmpNode=pHead->pNext;
    while(pTmpNode!=NULL)
    {
        if(pTmpNode->data==OldData)
        {
            pTmpNode->data=NewData;
        }
        pTmpNode=pTmpNode->pNext;
    }
    return 0;
}

查找

LinkNode *FindDouList(LinkNode *pHead,DataType data)
{
    LinkNode *pTmpNode=NULL;
    pTmpNode=pHead->pNext;
    while(pTmpNode!=NULL)
    {
        if(pTmpNode->data==data)
        {
            return pTmpNode;
        }
        pTmpNode=pTmpNode->pNext;
    }
}

销毁

//销毁
int DestroyDouList(LinkNode **pHead)
{
    LinkNode *pTmpNode=NULL;
    LinkNode *pTmpNext=NULL;
    pTmpNode=*pHead;
    while(pTmpNode!=NULL)
    {
        pTmpNext=pTmpNode->pNext;
        free(pTmpNode);
        pTmpNode=pTmpNext;
    }
    *pHead=NULL;
}

标签:pTmpNode,pNewNode,NULL,链表,pHead,双向,数据结构,LinkNode,pNext
From: https://blog.csdn.net/m0_64378221/article/details/141686214

相关文章

  • 高阶数据结构-->图(中)
    前言:本文介绍了并查集的优化方案和图的2种基本的遍历方式。并查集的优化:普通的并查集可以看看我的这篇文章:高阶数据结构-->图(上)-CSDN博客先来谈谈为什么要优化?原先的并查集在面对一些极端情况时,查找根的效率会降低不少,举个例子:示例:此时当我们要查找5的根的时候,会不断往......
  • 数据结构与算法 第3天(栈和队列)
    栈和队列也是线性表,限制插入和删除的位置只能在端点栈(stack)后进先出LIFO表尾进入,表尾删除一、案例案例一:进制转换例子159转换成八进制159/8=19...719/8=2...32/8=0...2结果为237案例二:括号匹配的检验左括号先入栈,右括号有匹配的话与左括号一起出栈案例三:表......
  • 2023数据结构408程序题C语言
    如A=(0,5,5,3,5,7,5,5),则5为主元素;又如A=(0,5,5,3,5,1,5,7),则A中没有主元素。假设A中的n个元素保存在一个一维数组中,请设计一个尽可能高效的算法,找出A的主元素。若存在主元素,则输出该元素;否则输出-1。#include<stdio.h>#include<stdlib.h>//定义结构体数组S,其中的元......
  • 数据结构之广度优先搜索
    一、基本思想BFS的基本思想是使用队列(Queue)数据结构来实现。队列是一种先进先出(FIFO)的数据结构,这符合BFS逐层访问节点的需求。在BFS中,首先将起始节点加入队列,并标记为已访问。然后,从队列中取出一个节点,访问其所有未被访问的相邻节点,并将这些相邻节点加入队列。重复这个过程......
  • 力扣: 环形链表
    文章目录需求MapSet快慢指针结尾需求给你一个链表的头节点head,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。......
  • 数据结构之最小生成树
    一、算法概述构建最小生成树的常用算法有两种:Prim算法和Kruskal算法。1.Prim算法Prim算法从某一个顶点开始,逐步增加边和顶点,直到形成最小生成树。算法的基本思想是:1、初始化:选择一个顶点作为起始点,将其加入已选集合,其他顶点属于未选集合。2、循环:在未选集合中选择一条......
  • 数据结构-顺序表-详解
    数据结构-顺序表-详解1.是什么2.静态顺序表2.1实现2.2缺点3.动态顺序表3.1总览3.2动态顺序表的创建3.3初始化3.4销毁3.5打印3.6插入尾插头插3.7删除尾删头删1.是什么顺序表是一种基本的数据结构,它使用一组连续的内存空间来存储数据元素,这些元素在逻辑上也是连续......
  • 数据结构(C)---双端队列(Deque)
    在使用本博客提供的学习笔记及相关内容时,请注意以下免责声明:信息准确性:本博客的内容是基于作者的个人理解和经验,尽力确保信息的准确性和时效性,但不保证所有信息都完全正确或最新。非专业建议:博客中的内容仅供参考,不能替代专业人士的意见和建议。在做出任何重要决定之前,请咨询相......
  • 数据结构与算法(循环链表,双向链表)
    循环链表最后一个元素指向首元素带尾指针的循环链表合并双向链表双向链表:在单链表的每个结点里再增加一个指向其直接前驱的指针域prior,这样链表中就形成了有两个方向不同的链,故称为双向链表双向链表插入操作思路代码删除操作思路代码三种链表比较顺序表......
  • [学习笔记] Splay & Treap 平衡树 - 数据结构
    [学习笔记]Splay&Treap平衡树-数据结构Splay树又名伸展树,一种平衡二叉查找树,通过\(\text{Splay}\)操作不断把节点旋到根节点来维护整颗树的平衡。说人话,很玄学的玩意,复杂度是单log级别的。为啥是单log,科学的解释请移步OI-WIKI。不科学的解释就是,通过不断\(\tex......