发布时间:2023-05-30 10:00
我们都知道,数据结构在编程领域是一门十分重要的知识,因为程序说白了就是数据的运算,那么数据运算时建立在数据存储的基础上的。虽然现在的高级语言在日常开发中可能用不到数据结构,因为语言本身给大家提供了丰富的数据存储类型,比如说C#的List、Array、Dictionary、Queue等,又比如C++的STL,但是这并不代表我们就不需要去学习数据结构了,如果后续你需呀做到架构师,这门知识是不可或缺的。
下面小编就跟大家一起来看一下C/C++怎么去实现一个简单的单向链表,希望从中能让大家对链表有一个清晰的认识。
那么说起链表,我们是不是很容易想起‘链条啊’
对,没错,就是这种一节一节连接起来的链条,我们用图示将之形象化一下(画的很丑,大家别介意哈~~):
如上图,链条它每一节在物理上他其实是连续的对吧,是一节紧挨着一节。怎么样,有没有很想C/C++里的数组啊,也就是数据结构里的顺序表。但是这种不能动态增加啊,而实际开发中我们有时数组个数是不确定的,这怎么办呢?能不能用一节加一节,所以链表的概念就因此而生了。
我们能不能将链条的连接处(图上红点)断开,但是又加上某种联系,让我能通过这种联系通过前一个能够找到后一个。这样我们又想到什么?
这个比喻在链表中成立的先决条件是:(假设每家地址都只有前一家知道)否则就是树形结构了
这个比喻我觉得十分的适当,那就是家族。大家想,以前的家族大家都强调说住在一块,房子都是一家挨着一家的,这样的好处是我只需要知道家族的地址和你家排第几我就能找到你家对吧,但是后面改革开放了,很多人背井离乡发展,或者人多土地不够了需要去别地建房子,但是血缘不能断啊,于是我们就将各自的家庭地址互相联系,那这样,我是不是就可以这样找你,我通过你大伯知道你二伯的地址,再通过你二伯得到你家的地址,然后去家地址上是不是就能找到你父亲啦。
怎么样,这样我是不是就可以通过你大伯就能将你爸爸那一辈的所有家庭都找到啊,这就是链表。我们也用图示将之形象化:
图中一个节点分两块,一块为存放数据的数据域(家庭成员),一块为存放指向下一个结点的地址的指针称为指针域(别人家的地址)。
接下来我们来简单的创建一个链表:
1、首先你得要构造好你一个节点的数据结构,为了简单,我这里就存放一个整型数字和一个指针
2、创建(数据来源为输入)
代码截图并且在右上角附上了思路说明图:其实核心就在中间节点p上,首先我是让p和head指向同一块内存,这样在新增第一个节点后通过p->next = temp ;这行代码将head的头部作用确立,只要他的next指向第二个节点就可以了。这里要说一下,可能很多人不明白明明是
p->next = temp ;那为什么head->next 也会= temp,其实这就是指针的神奇之处,因为前面说过(如右上角图,此时的p和head还是指向同一个地址,在这里p->next = temp就是讲地址上的next赋值了,改变的是地址上的值,所以只要是指向这个地址的所有指针的next值都是一样的)。
好,第一个节点加进去之后,后面的照样走,循环就好了。最后需要注意的一个点是,最后一节点是没有指向的,记得将之置为空。
我们测试一下:
运行看一下:
好的,没有问题。
其实,链表的概念理解起来并不难,稍微难的是难在怎么用代码去实现需要会灵活的运用指针。好了,这篇这是将怎么实现一个链表,后面我会再将,增加节点、删除节点。另外的改和查其实很简单就不去写了。
最后附上源代码:
#include \"stdafx.h\"
#include
#include
using namespace std ;
struct list
{
int num ;
list* next ;
};
list* creatList ()
{
//定義一個頭指針和一個臨時指針
list* head , *p;
//先需要開闢出來一個節點
head = new list ;
//让頭指針与中間變量指针指向同一个节点,让p去代替头去干累活
p = head ;
int num = 0;
while(true)
{
std::cout << \"Please input the data for single linker : \";
std::cin >> num;
if(num != 0)
{
//开辟新的节点出来
list* temp = new list;
temp->num = num ;
//head 和 p在此時是指向同一個內存 同一個節點
p->next = temp ;
//此时p就指向了新增加的节点了
p = temp ;
}
else break;
}
//p 在此處成為尾節點
p->next = NULL ;
return head ;
}
int main()
{
list *test = creatList();
std::cout
list* node = test->next ;
while (node!=NULL)
{
list* p = node ;
node = node->next;
delete p ;
}
delete test ;
system(\"pause\");
delete test
return 0 ;
}