目录
前言
01 数组存放数据的情况
02 链表储存数据的情况
后话
个人主页:@ChenPi
推荐专栏1: 《 C++ 》✨✨✨
推荐专栏2: 《 Linux C应用编程(概念类)》✨✨✨
推荐专栏3: 《链表_@ChenPi的博客-CSDN博客》 ✨✨✨
本篇简介 : 使用代码的形式演示链表与数组的区别✨ 只有我努力了 才有机会接触成功✨
链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。链表都有一个头指针,一般以head来表示,存放的是一个地址。链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。链表中每个节点都分为两部分,一个数据域,一个是指针域。说到这里你应该就明白了,链表就如同车链子一样,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。
作为有强大功能的链表,对他的操作当然有许多,比如:
- 链表的创建
- 修改
- 删除
- 插入
- 输出
- 排序
- 反序
- 清空链表的元素
- 求链表的长度等等
今天我们学如何创建链表
我们来编程啊,用链表的方式啊,来实现写代码啊,定义一个数组和链表做一个比较,去查看他们之间的一个联系和区别啊
我们先写一个使用数组储存数据的例子
#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不能直接看数组的地址,所以我们定义一个指针,让指针指向数组头
然后我们可以看到数组的值 12345,但中间为啥是空的呢?很多0,因为int类型的数据是四个字节 ,但我们只用了其中的1个字节,所以其他的空的
我既可以用数组的方式来存放数据
那当然也能用链表的方式来存放数据。
我现在来演示一下,用链表的方式怎么存放?我们说链表它有一个特点,是一个有一个指向自己的一个指针,我们来实现它
struct Link
{
int data;
struct Link *next;
};
现在我们有了一个结构体,结构体的名称叫Link,里面有一个整形变量叫data,还有一个指向指向这种同类型的这样的一个指针,指针的名字叫test
现在我们已经有了创建链表的最基本的变量,那是不是就可以创建一个链表
现在我们定义了三个结构体的节点了,但是我们明显感觉到这些节点之间并没有什么联系
就像这样,地址没有连续,结构体间之间是不是也没有连起来
那么,我们要怎样才能让它们互相联系起来呢?
其实很简单,结构体中的next变量是不是一个指针呀,指针就是存放地址的数字,那我如果让link1的next保存link2的地址,link2的指针保存link3的地址,那是不是就可以将他们串联起来了
你看,代码就是这样了,这样是不是就可以将他们串起来了,可能你会疑惑,link3后面都没数据了,为啥还要next = NULL;
这样做其实是种习惯了,怕它指针乱指,设置为NULL比较稳妥
我们编译打印一下看看
可以看到打印除了,可以看到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;
}
这一章我们先讲到这里,现在的写法写法会比较土一点。下一小章我们来正经的把这个链表再好好的完善一下。
如果有帮到您,记得点赞关注哦,谢谢