一、链表与数组的区别
1. 存储方式:数组是一种连续的存储结构,元素在内存中是依次存放的,通过索引可以快速访问任意位置的元素;而链表是一种非连续的存储结构,每个节点存储了下一个节点的地址,通过指针可以找到下一个节点。
2. 插入和删除操作:在数组中插入或删除元素时,需要移动其他元素来保持连续性,时间复杂度为O(n);而在链表中插入或删除节点时,只需要修改指针指向,时间复杂度为O(1)。
3. 动态性:数组的大小是固定的,如果需要扩展数组大小,需要重新分配内存空间并复制原数组元素;而链表的大小可以动态增加或减少,不需要重新分配内存空间。
4. 访问效率:数组在通过索引访问元素时效率较高,时间复杂度为O(1);而链表在访问元素时需要从头节点开始遍历,时间复杂度为O(n)。
5. 空间复杂度:数组需要连续的内存空间存储元素,如果内存不足可能会导致无法存储更多元素;而链表的节点可以分散存储在不同的内存块中,不会受到内存连续性的限制。
通俗的来讲,数组就是一个瓶子里面放了很多个弹珠,但是你要将底部的弹珠取出来,得把上面的弹珠全部倒出来,这是一个很麻烦的操作过程,所以当元素进行频繁插入和删除操作时,就得用链表,如果说你只是要对元素进行频繁访问和查询,那么就用数组,毕竟瓶子里面有什么东西我还是可以直接看到的~~~
二、代码案例
接下来就通过一个简单的小代码案例,来理解一下数组和链表的区别。
#include <stdio.h>
struct Test{
int data;
struct Test *next;
};
void printlink(struct Test *head){
while(head != NULL){
printf("%d ",head->data);
head = head->next;
}
}
int main (){
int i ;
int arr[]= {1,2,3};
for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++){
printf("%d ",arr[i]);
}
putchar('\n');
struct Test t1 = {1,NULL};
struct Test t2 = {2,NULL};
struct Test t3 = {3,NULL};
struct Test t4 = {4,NULL};
struct Test t5 = {5,NULL};
struct Test t6 = {6,NULL};
struct Test t7 = {7,NULL};
struct Test t8 = {8,NULL};
t1.next = &t2;
t2.next = &t3;
t3.next = &t4;
t4.next = &t5;
t5.next = &t6;
t6.next = &t7;
t7.next = &t8;
printf("use t1 to print other four nums:\n");
//printf("%d %d %d %d",t1.data,t1.next->data,t1.next->next->data,t1.next->next->next->data); (两种打印方式,printf打印方式太过复杂,要打印到第八项得挂老长了,一点逼格都没有,我们做程序员的,哎就是要有点逼格~~,所以可以直接调用函数来实现打印)
printlink(&t1);//打印函数
return 0;
}
今天就到这里了,感兴趣的点个关注一起学习,一起进步~~~