P2 链表和数组的区别

目录

前言 

 01 数组存放数据的情况

02 链表储存数据的情况

后话

前言 

                                P2 链表和数组的区别_第1张图片

个人主页:@ChenPi

推荐专栏1: 《 C++ 》✨✨✨ 

推荐专栏2: 《 ​​​​​​​​​​​​​​Linux C应用编程(概念类)》✨✨✨

推荐专栏3: ​​​​​​《链表_@ChenPi的博客-CSDN博客》 ✨✨✨
本篇简介  :  使用代码的形式演示链表与数组的区别

✨ 只有我努力了 才有机会接触成功✨

链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。链表都有一个头指针,一般以head来表示,存放的是一个地址。链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。链表中每个节点都分为两部分,一个数据域,一个是指针域。说到这里你应该就明白了,链表就如同车链子一样,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。

作为有强大功能的链表,对他的操作当然有许多,比如:

  1. 链表的创建
  2. 修改
  3. 删除
  4. 插入
  5. 输出
  6. 排序
  7. 反序
  8. 清空链表的元素
  9. 求链表的长度等等
     

今天我们学如何创建链表 

01 数组存放数据的情况

我们来编程啊,用链表的方式啊,来实现写代码啊,定义一个数组和链表做一个比较,去查看他们之间的一个联系和区别啊 

我们先写一个使用数组储存数据的例子

#include 

int main()
{
    int data[] = {1,2,3,4,5};
    for(int i = 0; i < 5; i++) 
    {
        printf("%d  ", data[i]);
    }
    printf("\n");
    return 0;
}

 然后我们就有这代码Debug调试一下,Vscode的调试主页有Ubuntu 1.84.2Visual Studio Code 下载配置与vscode查看内存Hex Editor插件,简单易懂-CSDN博客,可以找一下,因为vscod不能直接看数组的地址,所以我们定义一个指针,让指针指向数组头

P2 链表和数组的区别_第2张图片 然后我们可以看到数组的值 12345,但中间为啥是空的呢?很多0,因为int类型的数据是四个字节 ,但我们只用了其中的1个字节,所以其他的空的

02 链表储存数据的情况

我既可以用数组的方式来存放数据

那当然也能用链表的方式来存放数据。

我现在来演示一下,用链表的方式怎么存放?我们说链表它有一个特点,是一个有一个指向自己的一个指针,我们来实现它

struct Link
{
    int data;
    struct Link *next;
};

现在我们有了一个结构体,结构体的名称叫Link,里面有一个整形变量叫data,还有一个指向指向这种同类型的这样的一个指针,指针的名字叫test

现在我们已经有了创建链表的最基本的变量,那是不是就可以创建一个链表

P2 链表和数组的区别_第3张图片

现在我们定义了三个结构体的节点了,但是我们明显感觉到这些节点之间并没有什么联系

 P2 链表和数组的区别_第4张图片

就像这样,地址没有连续,结构体间之间是不是也没有连起来

那么,我们要怎样才能让它们互相联系起来呢?

其实很简单,结构体中的next变量是不是一个指针呀,指针就是存放地址的数字,那我如果让link1的next保存link2的地址,link2的指针保存link3的地址,那是不是就可以将他们串联起来了

P2 链表和数组的区别_第5张图片 就像这样,现在我们代码实现一下

 P2 链表和数组的区别_第6张图片

你看,代码就是这样了,这样是不是就可以将他们串起来了,可能你会疑惑,link3后面都没数据了,为啥还要next = NULL;

这样做其实是种习惯了,怕它指针乱指,设置为NULL比较稳妥

我们编译打印一下看看

P2 链表和数组的区别_第7张图片

可以看到打印除了,可以看到link1的下一个即link2的data被打印了出来,文字理解就是,Link1的下一个的数据被打印了出来

测试代码

#include 

struct Link
{
    int data;
    struct Link *next;
};

int main()
{
    struct Link link1 ={1,NULL};
    struct Link link2 ={2,NULL};
    struct Link link3 ={3,NULL};

    link1.next = &link2;
    link2.next = &link3;
    link3.next = NULL;

    printf("link1:%d link2:%d link3:%d\n", link1.data, link1.next->data, link1.next->next->data);
    return 0;
}

后话

这一章我们先讲到这里,现在的写法写法会比较土一点。下一小章我们来正经的把这个链表再好好的完善一下。

如果有帮到您,记得点赞关注哦,谢谢

你可能感兴趣的:(链表,链表,qt,c++,arm开发,linux,c语言,嵌入式)