数据结构---双向链表---循环链表---栈

news2024/9/30 21:31:59

目录

一、双向链表

1.1.创建双向链表

1.2.头插法

1.3.尾插法

1.4.查询节点

1.5.修改节点

1.6.删除节点

1.7.打印节点

1.8.销毁链表

二、循环链表

2.1.单循环链表

2.2.双循环链表

三、栈

3.1.顺序栈

1.创建栈

2.判断栈是否满

3.判断栈是否为空

4.进栈

5.出栈 

6.销毁栈

3.2.链栈

四、总结


一、双向链表

typedef int DataType;

typedef struct double_list
{
    DataType data;
    struct double_list *pnext;
    struct double_list *pprev;

}LinkNode;

1.1.创建双向链表

LinkNode *CreateLinkList(void)
{
    LinkNode *phead = NULL;
    phead = malloc(sizeof(LinkNode));
    if (phead == NULL)
    {
        return NULL;
    }

    phead->data = 0;
    phead->pnext = NULL;
    phead->pprev = NULL;

    return phead;
}

1.2.头插法

int HeadInsertLinkList(LinkNode *phead, DataType data)
{
    LinkNode *pnode = NULL;

    pnode = malloc(sizeof(LinkNode));
    if (pnode == NULL)
    {
        return -1;
    }
    pnode->data = data;

    if (phead->pnext == NULL)
    {
        pnode->pnext = NULL;
        pnode->pprev = phead;
        phead->pnext = pnode;
    }
    else
    {
        pnode->pnext = phead->pnext;
        pnode->pprev = phead;
        phead->pnext = pnode;
        pnode->pnext->pprev = pnode;
    }

    return 0;

}

1.3.尾插法

int TailInsertLinkList(LinkNode *phead, DataType data)
{
    LinkNode *pnode = NULL;
    LinkNode *ptmp = NULL;

    ptmp = phead->pnext;
    pnode = malloc(sizeof(LinkNode));
    if (pnode == NULL)
    {
        return -1;
    }
    pnode->data = data;

    if (phead->pnext == NULL)
    {
        pnode->pnext = NULL;
        pnode->pprev = phead;
        phead->pnext = pnode;
    }
    else
    {
        while(ptmp->pnext != NULL)
        {
            ptmp = ptmp->pnext;
        }

        pnode->pnext = NULL;
        pnode->pprev = ptmp;
        ptmp->pnext = pnode;

    }

    return 0;

}

1.4.查询节点

LinkNode *FindLinkList(LinkNode *phead, DataType data)
{
    LinkNode *ptmp = NULL;

    if (phead->pnext == NULL)
    {
        return NULL;
    }
    ptmp = phead->pnext;

    while (ptmp->pnext != NULL)
    {
        if (ptmp->data == data)
        {
            printf("%d存在\n", ptmp->data);
            break;
        }

        ptmp = ptmp->pnext;
    }

    return ptmp;

}

1.5.修改节点

int UpdateLinkList(LinkNode *phead, DataType olddata, DataType newdata)
{
    LinkNode *ptmp = NULL;

    if (phead->pnext == NULL)
    {
        return -1;
    }

    ptmp = phead->pnext;
    
    while (ptmp != NULL)
    {
        if (ptmp->data == olddata)
        {
            ptmp->data = newdata;
        }

        ptmp = ptmp->pnext;
    }

    return 0;

}

1.6.删除节点

int DelteLinkList(LinkNode* phead, DataType data)
{
    LinkNode *ptmp = NULL;
    LinkNode *qtmp = NULL;

    if (phead->pnext == NULL)
    {
        return -1;
    }

    ptmp = phead->pnext;
    qtmp = phead->pnext;

     while (ptmp != NULL)
    {
        qtmp = qtmp->pnext;
        if (ptmp->data == data && ptmp->pnext != NULL)
        {
            ptmp->pnext->pprev = ptmp->pprev;
            ptmp->pprev->pnext = ptmp->pnext;
            free(ptmp);
            
        }
        else if (ptmp->data == data && ptmp->pnext == NULL)
        {
            ptmp->pprev->pnext = ptmp->pnext;
            free(ptmp);
        }
        ptmp =qtmp;
    }

    return 0;
}

1.7.打印节点

int PrintLinkList(LinkNode *phead)
{
    LinkNode *ptmp = NULL;
    ptmp = phead->pnext;

    if (phead->pnext == NULL)
    {
        return -1;
    }

    while(ptmp != NULL)
    {
        printf("%d ", ptmp->data);
        ptmp = ptmp->pnext;
    }

    printf("\n");

    return 0;
}

1.8.销毁链表

int DestoryLinkList(LinkNode **phead)
{
    LinkNode *ptmp = NULL;

    if ((*phead)->pnext == NULL)
    {
        free(*phead);
        return 0;
    }

    if ((*phead)->pnext->pnext == NULL)
    {
        free((*phead)->pnext);
        free((*phead));
        return 0;
    }

    ptmp = (*phead)->pnext->pnext;
    while(ptmp != NULL)
    {
        free(ptmp->pprev);
        if (ptmp->pnext == NULL)
        {
            free(ptmp);
            ptmp = NULL;
            continue;
        } 
        ptmp = ptmp->pnext;
    }

    free(*phead);
    *phead = NULL;
                                                                                                                                                                                                                    
    return 0;

}

二、循环链表

2.1.单循环链表

2.2.双循环链表

三、栈

栈顶:允许进出栈位置

栈底:不允许进出栈的位置

3.1.顺序栈

typedef int DataType;

typedef struct stack 
{
    DataType *pdata;
    int top;    
    int tlen;
    
}seqstack;

1.创建栈

seqstack *CreateStack(int maxlen)
{
    //1.
    seqstack *pstack = NULL;
    pstack = malloc(sizeof(seqstack));
    if (pstack == NULL)
    {
        return 0;
    }

    //2.
    pstack->tlen = maxlen;
    pstack->top = 0;
    pstack->pdata = malloc(maxlen * sizeof(DataType));

    return pstack;

}

2.判断栈是否满

int IsFullStack(seqstack *pstack)
{
    if (pstack->top == pstack->tlen)
    {
        return 1;
    }
    return 0;
}

3.判断栈是否为空

int IsEmptyStack(seqstack *pstack)
{
    if (pstack->top == 0)
    {
        return 1;
    }

    return 0;
}

4.进栈

int EnterSqlStack(seqstack *pstack, DataType data)
{   
    if (IsFullStack(pstack) == 0)
    {
        pstack->pdata[pstack->top] = data;
        pstack->top++;
        return 0;
    }
    else 
    {
        return -1;
    }

}

5.出栈 

DataType PopSqlStack(seqstack *pstack)
{
    DataType data = 0;
    if (IsEmptyStack(pstack) == 0)
    {
        data = pstack->pdata[pstack->top - 1];
        pstack->top--;
        return data;
    }
    else
    {
        return -1;
    }
}

6.销毁栈

int DestroySeqStack(seqstack **seqstack)
{
    free((*seqstack)->pdata);
    free(*seqstack);
    *seqstack = NULL;

    return 0;
}

3.2.链栈

        使用普通的链表就可以实现,采用头插法插入节点,在从头第一个数据节点可以遍历删除节点,便可以实现栈先进后出的规则。

四、总结

        双向链表的好处是,可以直接访问一个节点的上一个节点;循环链表是将所有节点形成环,单循环链表,可以在末尾节点快速访问到第一个节点;双循环链表是可以,快速的访问尾节点;栈的特点就是先进栈的元素最后出战;栈的类型可以分为四种:满增栈、满减栈、空增栈、空减栈;链式栈,不要想复杂啦,普通的链表只要满足先进后出原则就可以啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2087543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度解读SGM41511电源管理芯片I2C通讯协议REG0A寄存器解释

REG0A 是 SGM41511 的第十一个寄存器,地址为 0x0A。这个寄存器包含了只读(R)和可读写(R/W)的位。上电复位值(PORV)为 xxxxxx00,其中 x 表示不确定的初始状态。这个寄存器提供了充电器…

microsoft微软excel或WPS表格打开vivado逻辑分析仪ILA保存的csv文件,自动转换科学计数法损失精度的bug

问题 vivado的逻辑分析仪ILA,可以方便的把数据导出成CSV(Comma-Separated Values)文件,实际是逗号作为分隔符的数据文件。 导出数据文件用文本编辑器打开,第74行有如下数据: 但是使用excel打开这个csv文件,则这个数…

基于Python的机器学习系列(15):AdaBoost算法

简介 AdaBoost(Adaptive Boosting)是一种提升(Boosting)算法,旨在通过组合多个弱分类器来提高整体模型的性能。AdaBoost的核心思想是通过加权结合多个表现较弱的分类器(通常是深度为1的决策树,称…

Spring Boot Web开发实践:响应参数的使用方法、IOC、DI和Bean基本介绍

主要介绍了SpringBootWeb响应参数的基本使用和spring框架的控制反转(IOC)和依赖注入(DI)以及Bean对象的声明、扫描、注入!!! 目录 前言 响应参数 分层解耦 三层架构 分层解耦 IOC & …

MVC与设计模式理解-lnmp学习之路

一、MVC 前言: MVC是一种应用架构模式,也可以说是一种业务架构或是一种应用设计思想,用于组织业务逻辑并分离代码的。 MVC组成结构是Model-View-Controller,Model是管控数据层,View是管控视图层,Controlle…

【Unity-UGUI组件拓展】| ContentSizeFitter 组件拓展,支持设置最大宽高值

🎬【Unity-UGUI组件拓展】| ContentSizeFitter 组件拓展,支持设置最大宽高值一、组件介绍二、组件拓展方法三、完整代码💯总结🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲…

图新地球桌面端-给地块贴纹理都是正北方向如何调整

0序 有部分做农保、农业管理的客户,需要结合GIS做一些方案效果,有时候会直接把面对象贴上作物类型的纹理,看上去会比纯色块更好看一些。而又不需要去做复杂的人工建模。 本文的重点是对导入的纹理进行角度调整,让纹理和地块的方向…

UE5开发——射击游戏

1. 枪支拾取动画 创建Text Block 编译保存 在h文件写入 &#xff0c;属性 private:UPROPETY(VisibleAnywhere, Category "Weapon Properties")class UWidgetComponent* PickupWidget; 先写这个&#xff1a; CreateDefaultSubobject<UWidgetComponent>(TEXT(…

JavaWeb——介绍(什么是Web、Web网站的开发模式)、初始Web前端(Web标准、学习内容)

目录 介绍 什么是Web Web网站的开发模式 初识Web前端 Web标准 学习内容 介绍 JavaWeb学习路线 &#xff08;仅用作参考&#xff09; 什么是Web Web&#xff1a;全球广域网&#xff0c;也称为万维网&#xff08;www World Wide Web)&#xff0c;能够通过浏览器访问的…

数据结构之内核链表,栈,队列

今天主要学习了内核链表&#xff0c;顺序栈&#xff0c;链式栈&#xff0c;顺序队列&#xff0c;链式队列的相关内容。 一.内核链表 内核链表和之前的单向&#xff0c;双向链表有所不同的是内核链表的结构是数据包含节点&#xff0c;特点如下&#xff1a; 1.一种链表结构能够操…

系统架构设计师——系统工程学

概述. 系统工程是一种跨学科的方法论&#xff0c;旨在通过系统方法组织管理技术来实现系统的规划、研究、设计、制造、试验和使用。它的核心在于从整体的角度出发&#xff0c;合理地开发、设计、实施和运用系统科学和技术&#xff0c;确保系统能够成功地实现其预定目的。以下是…

适用于车队管理和试验验证的数据记录仪-IPE853

IPE853是一款可扩展的数据记录仪&#xff0c;支持整车质量保证中的各项测量任务。它具有CAN/CAN FD、LIN、以太网等众多测量输入接口&#xff0c;并支持CCP/XCPonCAN、XCPonETH、J1939、OBD、WWH-OBD、KWPonCAN、UDS/ODX/PDX和CAN-send等多种协议&#xff0c;因此其可轻松访问汽…

vscode在html中的使用

目录 一、安装插件二、通过live Server 小型服务器运行项目三、其他常见设置 一、安装插件 ● Auto Rename Tag 自动修改标签对插件 ● Chinese Language Pack 汉化包 ● HTML CSS Support HTML CSS 支持 ● Intellij IDEA Keybindings IDEA快捷键支持 ● Live Server 实时加载…

解决线程中使用线程锁

问题&#xff1a;多线程操作同一个对象&#xff0c;利用锁保证数据操作的原子性 解决方案&#xff1a;使用线程锁 简要说明&#xff1a;线程锁本质上就是添加一个公共状态量&#xff0c;当线程拿到状态量后&#xff0c;则继续执行&#xff0c;否则就等待 扩展1&#xff1a;自…

【文献及模型、制图分享】大运河江苏段沿线典型传统村落空间形态特征与影响因素及其启示

文献介绍 大运河见证了中国数千年的繁荣与变迁&#xff0c;沿线传统村落是其历史文化的直接展示。对这些村落的空间形态进行研究&#xff0c;不仅能够深入了解传统村落形态特征&#xff0c;还为其保护和发展提供有力的支持。以大运河江苏段沿线的48个传统村落为研究对象&#…

C++入门基础知识40——【关于C++ 运算符——赋值运算符】

成长路上不孤单&#x1f60a;【14后&#xff0c;C爱好者&#xff0c;持续分享所学&#xff0c;如有需要欢迎收藏转发&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#xff01;&#xff01;&#xff01;&#xff01;&#xff…

大数据-107 Flink 基本概述 适用场景 框架特点 核心组成 生态发展 处理模型 组件架构

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

CSS3中的字体详解

字体 网页字体的三个来源&#xff1a; 用户机器上安装的字体&#xff0c;放心使用。保存在第三方网站上的字体&#xff0c;例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字体&#xff0c;可以用font-face规则随网页一起发送到浏览器。 字体相…

【文献及模型、制图分享】传统村多功能发展特征识别、类型划分与差异化引导——以安徽黟县44个传统村为例(多指标综合法及耦合协调模型

文献介绍 揭示多功能发展特征、划定多功能协同发展类型是传统村落传承保护与活化利用的现实需要&#xff0c;是传统村落保护发展研究的重要议题。以黟县44个中国传统村落为研究对象&#xff0c;采用多指标综合法及耦合协调模型&#xff0c;科学测度传统村落多功能发展水平及协…

【赵渝强老师】MongoDB的存储引擎

存储引擎&#xff08;Storage Engine&#xff09;是MongoDB的核心组件&#xff0c;它负责管理数据如何存储在硬盘&#xff08;Disk&#xff09;和内存&#xff08;Memory&#xff09;上。从MongoDB 3.2 版本开始&#xff0c;MongoDB支持多种类型的数据存储引擎。 视频讲解如下&…