热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

数据结构与算法(线性表_链式存储结构)

上次顺序表没有总结,就在这次一起写。顺序表比较适合存储稳定的数据,不大适合经常增减数据,如果在最后增加一个结点,这个时间复杂度为O(1),但如果要在最前面插入一个结点时,时间复杂度就变成
    上次顺序表没有总结,就在这次一起写。顺序表比较适合存储稳定的数据,不大适合经常增减数据,如果在最后增加一个结点,这个时间复杂度为O(1),但如果要在最前面插入一个结点时,时间复杂度就变成了O(n),因为它要搬动后面所有的结点,依次往后面移动一个位置。如果表太大的时候,有时难以分配足够的连续存储空间。因此有了一种拟补它缺点的另一种结构——链式存储结构。
     提到链式存储结构,我们都会想到什么呢,没错,就是链表,有些没学过的木有关系。链式存储结构指的就是链表吗?这个不一定吧,链式存储结构是一个比较大的概念,线性表不一定也只约束于顺序存储结构和链式存储结构吧~

    链表有一个特性,可以拥有不连续的内存空间,但是它有一个头指针,指针指向头结点,从头结点开始后面的所有结点,都由一个数据域和地址域构成,NO pictue you say a J8。

    

这就是一条链表,错误的是最后的结点没有指向NULL,别问我图哪里来的,盗图从来不需解释~
    链表中的结点,需要存两种信息,一种是数据,例如说成绩、座位号、名字,而另一个信息就是下一个结点的地址,看代码。

#include
#include
#include
#define EOF -1
#define LEN sizeof(struct data)
typedef struct data listlink;
int n;      //优化链表,存储链表结点数
struct data
{
    int num;
    float score;
    struct data *next;
};
listlink *Clist()
{
    listlink *head = NULL;
    listlink *p1,*p2;
    p1 = p2 = (listlink *)malloc(LEN);
    if(!p1)     //检测内存分配结果
    {
        return EOF;
    }
    printf("请输入座号:");
    scanf("%d",&p1->num);
    printf("请输入成绩:");
    scanf("%f",&p1->score);
    n = 0;      //全局变量,链表结点数量
    while( p1->num )
    {
        n++;
        if(n == 1)
        {
            head = p1;
        }
        else
        {
            p2->next = p1;
        }
        p2 = p1;
        p1 = (listlink *)malloc(LEN);   
        printf("请输入座号:");
        scanf("%d",&p1->num);
        printf("请输入成绩:");
        scanf("%f",&p1->score);
    }
    p2->next = NULL;
    return head;
}
void Plist(listlink *L)
{
    listlink *p;
    p = L;
    if(L)
    {
        do
        {
            printf("number:%d score:%f\n",p->num,p->score);
            p = p->next;
        }while(p);
    }
}
listlink *Dlist(listlink *L)
{
    int x;
    listlink *p1,*p2;
    if(L == NULL)
    {
        printf("空表,木有结点数据\n");
        goto END;
    }
    printf("\n请输入想要删除的结点(座号):");
    scanf("%d",&x);
    p1 = L;
    while( p1->num != x && p1->next != NULL)    //便利所有结点
    {
        p2 = p1;
        p1 = p1->next;
    }
    if(p1->num == x)
    {
        if(p1 == L)     //头结点
        {
            L = p1->next;
        }
        else
        {
            p2->next = p1->next;
        }
        printf("删除完毕!\n");
        n -= 1;
    }
    else
    {
        printf("表中没有该结点数据\n");
    }
END:return L;
}
listlink *Nlist(listlink *L)
{
    listlink *p1,*p2,*p3;
    int x,i;
    do
    {
        p1 = (listlink *)malloc(LEN);       //动态分配新内存
    }while(!p1);
    printf("\n请输入结点数据(座号,成绩):");     //接收结点数据
    do
    {
        scanf("%d %f",&p1->num,&p1->score);
    }while(p1->num == 0);
    if(L == NULL)       //检测空表
    {
        printf("空表,直接插入\n");
        L = p1;
        goto END;
    }
    printf("请输入结点插入位置:");
    scanf("%d",&x);     //接收结点位置
    while(x > n+1 || x <= 0)    //检测插入位置
    {
        printf("插入位置有误,请重新输入:");
        scanf("%d",&x);
    }
    printf("\n插入位置正确!\n");
    p2 = L;
    if(x == 1)      //插入位置为头结点
    {
        p1->next = L;
        L = p1;
    }
    else if(x == n+1)   //插入位置在最后
    {
        while(p2->next != NULL)
        {
            p2 = p2->next;
        }
        p2->next = p1;
        p1->next = NULL;
    }
    else
    {
        for(i = 1;i next;
        }
        p3 = p2;
        p3 = p3->next;
        p2->next = p1;
        p1->next = p3;
    }
END:printf("插入操作结束!\n");
    n += 1;
    return L;
}
int main()
{
    listlink *L;
    system("color 0A");
    printf("创建链表\n");
loop:L = Clist();
    if(L == EOF)
    {
        printf("\n内存分配出错,重新创建操作···\n");
        goto loop;
    }
    printf("\n该链表一共有%d个结点\n\n",n);
    Plist(L);
    
    L = Dlist(L);
    Plist(L);
    L = Nlist(L);
    Plist(L);
    system("pause");
}
 这只是个人写的代码,没有进行优化,主要是时间比较少,抱歉!

推荐阅读
  • XAMPP 遇到 404 错误:无法找到请求的对象
    在使用 XAMPP 时遇到 404 错误,表示请求的对象未找到。通过详细分析发现,该问题可能由以下原因引起:1. `httpd-vhosts.conf` 文件中的配置路径错误;2. `public` 目录下缺少 `.htaccess` 文件。建议检查并修正这些配置,以确保服务器能够正确识别和访问所需的文件路径。 ... [详细]
  • 题目《BZOJ2654: Tree》的时间限制为30秒,内存限制为512MB。该问题通过结合二分查找和Kruskal算法,提供了一种高效的优化解决方案。具体而言,利用二分查找缩小解的范围,再通过Kruskal算法构建最小生成树,从而在复杂度上实现了显著的优化。此方法不仅提高了算法的效率,还确保了在大规模数据集上的稳定性能。 ... [详细]
  • 本文对SQL Server系统进行了基本概述,并深入解析了其核心功能。SQL Server不仅提供了强大的数据存储和管理能力,还支持复杂的查询操作和事务处理。通过MyEclipse、SQL Server和Tomcat的集成开发环境,可以高效地构建银行转账系统。在实现过程中,需要确保表单参数与后台代码中的属性值一致,同时在Servlet中处理用户登录验证,以确保系统的安全性和可靠性。 ... [详细]
  • ES6引入了Symbol这一新型原始数据类型,其核心特性在于能够生成独一无二的值。起初,对于“独一无二”的概念我并未完全理解,但通过查阅相关资料并结合个人见解,逐步掌握了其精髓。Symbol的独特之处不仅在于其唯一性,还在于它在编程中的多种应用场景,如防止属性名冲突等。本文将深入探讨Symbol的特性和实际应用,帮助读者全面理解这一重要特性。 ... [详细]
  • 本文提出了一种基于栈结构的高效四则运算表达式求值方法。该方法能够处理包含加、减、乘、除运算符以及十进制整数和小括号的算术表达式。通过定义和实现栈的基本操作,如入栈、出栈和判空等,算法能够准确地解析并计算输入的表达式,最终输出其计算结果。此方法不仅提高了计算效率,还增强了对复杂表达式的处理能力。 ... [详细]
  • 遗传算法中选择算子为何置于交叉算子和变异算子之前?本文探讨了这一问题,并详细介绍了遗传算法中常用的选择算子类型及其作用机制。此外,还分析了不同选择算子对算法性能的影响,为实际应用提供了理论依据。 ... [详细]
  • 非线性门控感知器算法的实现与应用分析 ... [详细]
  • 阿里巴巴终面技术挑战:如何利用 UDP 实现 TCP 功能?
    在阿里巴巴的技术面试中,技术总监曾提出一道关于如何利用 UDP 实现 TCP 功能的问题。当时回答得不够理想,因此事后进行了详细总结。通过与总监的进一步交流,了解到这是一道常见的阿里面试题。面试官的主要目的是考察应聘者对 UDP 和 TCP 在原理上的差异的理解,以及如何通过 UDP 实现类似 TCP 的可靠传输机制。 ... [详细]
  • 在《数字图像处理及应用(MATLAB)第4章》中,详细探讨了“逢七必过”游戏规则的实现方法,并结合数字图像处理技术进行了深入分析。本章通过丰富的实例和代码示例,展示了如何利用MATLAB实现这一游戏规则,并介绍了数字图像处理的基本原理和技术应用。内容涵盖了图像增强、滤波、边缘检测等多个方面,为读者提供了全面的技术支持和实践指导。 ... [详细]
  • 线性回归模型及其损失函数详解
    在线性回归模型中,假设输入特征与输出结果之间存在线性关系,即特征与结果之间的关系不超过一次方程。该模型适用于处理收集到的数据集,其中每个数据点的各个分量被视为一个特征。每个特征都对应一个未知的参数,通过最小化损失函数来估计这些参数,从而实现对模型的优化。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 在2022年11月2日的AcWing每日编程挑战中,任务是计算一个长度为n的整数序列中的逆序对数量。逆序对是指在序列中,若存在两个下标i和j(i < j),且a[i] > a[j],则称这两个元素构成一个逆序对。本题要求实现一个算法来高效地统计这些逆序对的数量。 ... [详细]
  • OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战
    OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战 ... [详细]
  • 探讨 OpenCV 和 Matlab 在最小二乘法直线拟合中的结果差异及原因分析
    在使用最小二乘法进行直线拟合时,OpenCV和Matlab的计算结果存在显著差异。通过详细分析发现,这种不一致性可能源于两种软件在算法实现、数据处理方式以及数值稳定性上的不同。进一步研究还表明,输入数据的格式和预处理步骤也可能对最终结果产生影响。为了确保结果的一致性和准确性,建议在实际应用中对这两种工具的输出进行对比验证,并选择最适合具体应用场景的方法。 ... [详细]
  • 二分查找算法详解与应用分析:本文深入探讨了二分查找算法的实现细节及其在实际问题中的应用。通过定义 `binary_search` 函数,详细介绍了算法的逻辑流程,包括初始化上下界、循环条件以及中间值的计算方法。此外,还讨论了该算法的时间复杂度和空间复杂度,并提供了多个应用场景示例,帮助读者更好地理解和掌握这一高效查找技术。 ... [详细]
author-avatar
等待1314578
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有