数据结构(一)线性链表、非线性链表、稀疏数组与队列、单向链表

本文介绍了数据结构的基本概念,重点讲述了逻辑结构中的线性链表、非线性链表,以及稀疏数组和队列。线性链表分为顺序存储和链式存储,稀疏数组适用于大部分元素为0或相同值的场景,队列则遵循先入先出的原则。文章还探讨了数据结构和算法的关系,并提供了链表相关面试题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构

结构,简单的理解就是关系,些如分子结构,就是说组成分子的原子之间的排到方式。严格点说,结构是指各个组成部分相互搭配和排的方式。在现实世界中,不同数据元素之间不是独立的,而是存在特定的关系,我们将这些关系称为结构。那数据结构是什么?
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。
在计算机虫,数据元素并不是孤立、杂乱无序的,而是具有内在联系的数据集合。数据元素之间存在的一种或多种特定关系,也就是数
据的组织形式。
为编写出-个好"的程序,必须分析待处理对象的特性及各处理对象之间存在的关系。这也就是研究数据结构的意义所在。

数据结构分为逻辑结构和物理结构

在这里插入图片描述

逻辑结构

 逻辑结构:是指数据对象中数据元素之间的相互关系。其实这也是我们今后最需要关注的问题。逻辑结构分为以下四种:

1.集合结构:

集合结构:集合结构中的数据元素除了同属于一个集合外它们之间没有其他关系。各个数据元素是“平等"的,它们的共同属性是"同属
于一个集合”。数据结构中的集合关系就类似于数学中的集合
在这里插入图片描述

2 线性结构:

数据元素之间一对一的关系
在这里插入图片描述

3.树状结构:

数据元素之间存在一对多的关系
在这里插入图片描述

4.图形结构:

数据中的元素是多对多的关系
在这里插入图片描述

物理结构:

说完了逻辑结构,我们再来说说数据的物理结构(很多书中也叫做存储结构,你只要在理解上把它们当回事就可以了)。
物理结构:是指数据的逻辑结构在计算机中的存储形式。
数据是数据元素的集合,那么根据物理结构的定义,实际上就是如何把数据元素存储到计算机的存储器中。存储器主要是针对内存而言
的,像硬盘、软盘、光盘等外部存储器的数据组织通常用文件结构来描述。
数据的存储结构应正确反映数据元素之间的逻辑关系,这才是最为关键的,如何存储数据元素之间的逻辑关系,是实现物理结构的重点
和难点。
数据元素的存储结构形式有两种:顺序存储和链式存储。
1.顺序存储结构
顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的(如图所示)。
在这里插入图片描述这种存储结构其实很简单,说自了,就是排队点位。大家都按顺序排好,每个人点一小段空间,大家谁也别插谁的队。我们之前学计算
机语言时,数组就是这样的顺序存储结构。当你告诉计算机,你要建立一一个有9个整型数据的数组时,计算机就在内存中找了片空地,按
照一个整型所占位置的大小乘以9,开辟一段连续的空间, 于是第一个数组数据就放在第一个位置, 第二个数据放在第二个,这样依次摆放。
2.链式存储结构
如果就是这么简单和有规律。一切就好办了。可实际上2总会有也会有人要上厕所:有人会放弃排队。所以这个队伍中会添加等成员,也有可能会去掉老元素,整个结构时刻都处于变化中,显然面对这样时常要变化的结构,顺序存储是不科学的。那怎么办呢?
现在如银行、医院等地方,设置了排队系统,也就是每个人去了。先领一个号,等着叫号,叫到时去办理业务或看病。在等待的时候,你爱在哪在哪,可以坐着、站着或者走动,甚至出去涟一圈,只要及时回来就行。你关注的是前一个号有没有被响到,响到了,下一个就轮到了。
链式存储结构是把数据示素存放在任意的存储单元黑,这组存储单元可以是连续的,也可以是否连续的。数据元素的存储关系并不能及映其逻辑关系,因此需要用一个指针存放数据元素的地址;这样通过地址就可以我到相关联数据元素的位置(如图1-5-6所示)。
在这里插入图片描述

数据结构和算法的关系

➢数据data结 构(structure)是一门研究组织数据方式的学科,有了编程语言也就有了
数据结构.学好数据结构可以编写出更加漂亮更加有效率的代码。
➢要学习好数据结构就要多多考虑如何将生活中遇到的问题,用程序去实现解决.
➢程序=数据结构+算法
➢数据结构是算法的基础,换言之,想要学好算法,需要把数据结构学到位。

线性链表和非线性链表

数据结构包括:线性结构和非线性结构。
线性结构
1)线性结构作为最常用的数据结构,其特点是数据元素之间存在- -对- - 的线性关系(a[0]=30)
2)线性结构有两种不同的存储结构,即顺序存储结构(最经典数组)和链式存储结构(经典链表)。顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的。(指存储元素的地址是连续的)
3)链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息
4)线性结构常见的有:数组、队列、链表和栈,后面我们会详细讲解.

非线性结构
非线性结构包括:二 维数组, 多维数组, 广义表,树结构,图结构

稀疏数组和队列

稀疏Sparsearray数组

在这里插入图片描述基本介绍
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法是: .
1)记录数组一共有几行几列,有多少个不同的值
2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
在这里插入图片描述右图的第一行【0】的6是一共6行,7一共7列,8指一共8个值
原来的数组是67=42大小的数组,可以将其变成93=27的稀疏数组

应用实例
1)使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)
2)把稀疏数组存盘,并且可以从新恢复原来的二维数组数
3)整体思路分析

在这里插入图片描述代码实现:

public class Sparcesearray {
   
    public static void main(String[] args) {
   

        //第一步   创建一个11*11的二维数组
        //给二维数组中添加棋子
        //1 表示黑子,2表示蓝色的,0表示没有棋子

        int cheersArray[][] = new int[11][11];
        cheersArray[1][2] =1;
        cheersArray[2][3] =2;
        cheersArray[4][5] =2;

        for (int[] ints : cheersArray) {
   
            for (int i : ints) {
   
                System.out.print("\t"+i);
            }
            System.out.println();
        }

        // 获取二维数组中元素不为0的个数  sum

        int sum=0;
        for (int i = 0; i < 11; i++) {
   
            for (int j = 0; j < 11; j++) {
   
                if (cheersArray[i][j]!=0){
   
                    sum++;
                }
            }
        }
        System.out.println("sum个数是"+sum);

        //创建稀疏数组
        int specArray[][] =new int[sum+1 ][3];
        specArray[0][0] =11;
        specArray[0][1] =11;
        specArray[0][2] =sum;
        //将二维数组中不为0的数放入到稀疏数组中去
        int count=0;
        for (int i = 0; i < 11; i++) {
   
            for (int j = 0; j < 11; j++) {
   
                if (cheersArray[i][j]!=0){
   
                    count++;
                  specArray[count][0]=i;
                  specArray[count][1]=j;
                  specArray[count][2]=cheersArray[i][j];
                }
            }
        }

        System.out.println("二维数组变成的稀疏数组是:");
        for (int[] ints : specArray) {
   
            for (int anInt : ints) {
   
                System.out.print("\t"+anInt);
            }
            System.out.println();
        }

        System.out.println("稀疏数组再次变为原来的二维数组是");
        //第三步将稀疏数组再次变成二维数组
        int cheersArray2[][] =new int[specArray[0][0]] [specArray[0][1]];

        //将稀疏数组中的值再次赋值给二维数组(循环从1开始,因为稀疏数组从第二行开始才是值)
        for (int i = 1; i <specArray.length ; i++) {
   
            cheersArray2[specArray[i][0]][specArray[i][1]] =specArray[i][2];
        }
        for (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值