什么是链表?
链表是一种常见而重要的动态存储分布的数据结构。
我们知道数组元素是存储在一段连续地址上的。这样就带来了一线缺点,假如我们要删除或添加一个元素呢?那也就是说一旦增加或者删除元素就要其他相关的元素地址都要进行移动。
我们假设要在一个数组中插入一个元素在其中间位置,因为地址是连续的就需要我们把先读取位置找到对应位置后把该位置之后的元素都要向后偏移腾出位置,然后再插入。这无疑是比较麻烦的且不灵活。
而链表就很好的解决了这一问题,链表的每一项都是个结构体,在结构体里边定义一个指针指向下一个节点的地址,用一个指针指向的方式把数据串起来了。这样的话灵活性就有了。
假设:有A、B、C、D,一组数据,我想要删除C数据,只需吧B结点的指针指向D节点即可。
增加节点数据亦是如此,将B节点指向新添加的节点将新添加的节点指向C节点即可:
链表与数组的比较及实现
首先我们用数组的方式存放数据并输出:
#include <stdio.h>
int main()
{
int i;
int arry[] = {1,2,3};
for(i=0;i<sizeof(arry)/sizeof(arry[0]);i++)
{
printf("%d ",arry[i]);
}
putchar('\n');
system("pause");
return 0;
}
同样我们用链表的方式存储并输出数据:
#include <stdio.h>
//定义结构体
struct Test
{
int data;
struct Test *next;//链表有一个指向自己的指针
};
int main()
{
int i;
int arry[] = {1,2,3};
for(i=0;i<sizeof(arry)/sizeof(arry[0]);i++)
{
printf("%d ",arry[i]);
}
putchar('\n');
//定义结构体变量
struct Test t1 = {1,NULL};
struct Test t2 = {2,NULL};
struct Test t3 = {3,NULL};
return 0;
}
目前我们知道数组的存储位置是连续的知道其中一个的位置就饿可以知道其他数据的位置,而我们在上边的例子中定义的三结构体变量并不一定连续,并且目前三个变量之间没有任何联系,我们要输出t1就只能输出t1,其他的元素我们便无从下手,那么怎么才能使其产生联系呢,由此就有了链表 。
链表里边有一个指针除了需要存储的数据之外还有一个指针,用来存放其下一个节点的地址。由此:
#include <stdio.h>
//定义结构体
struct Test
{
int data;
struct Test *next;//链表有一个指向自己的指针
};
int main()
{
int i;
int arry[] = {1,2,3};
for(i=0;i<sizeof(arry)/sizeof(arry[0]);i++)
{
printf("%d ",arry[i]);
}
putchar('\n');
//定义结构体变量
struct Test t1 = {1,NULL};
struct Test t2 = {2,NULL};
struct Test t3 = {3,NULL};
//指向对应节点地址形成链表
t1.next = &t2;
t2.next = &t3;
//输出
printf("%d %d %d\n",t1.data, t1.next->data, t1.next->next->data);
return 0;
}
由此我们就使得三个数据有了对应的联系:
程序执行得到同样的结果: