链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作。
目前成都创新互联公司已为千余家的企业提供了网站建设、域名、网页空间、网站托管维护、企业网站设计、阿拉尔网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。特征
- 由于链表的内存空间是零散的,所以不支持随机访问。
- 插入、删除不需要移动数据,所以效率高。
- 因为链表的每个内存块都不是连续的,所以不需要提前计算内存的大小,内存空间可以根据结点数量的改变而改变。
图解如下:
2.链表与数组的不同链表与数组不一样,链表的储存空间不是连续的,是通过指针指向下一个节点,进行访问,这也说明了链表访问是有顺序的, 必须先从头开始,再依次找到想要访问的数据节点。而数组不一样,数组的空间是连续的,我们可以直接去访问某一个数组的数据(比如直接输出a[4]的值)。链表的存储空间是动态空间,我们可以自行的删减空间,可以随意改动空间;数组的空间是固定的,这也说明了数组的数据空间是不可以随意去改动。
3.输入输出数组 (1)数组输入输出#includeint main()
{
int a[100];
int n;
scanf("%d", &n);
for (int i = 0; i< n; i++)
scanf("%d", &a[i]);
for (int i = 0; i< n; i++)
printf("%d ", a[i]);
}
可以看出用数组直接输入输出是很简单的,但是我初始的空间是100个(sizeof(int)),这个空间是固定的,而且我输入输出的数字个数所占用的空间必须在这范围内,否则会报错,造成空间溢出。那么如果用链表去输入输出就会更加灵活,我们需要多少空间可以自行开辟,随取随用。
(2)链表的输入输出#include#includestruct node//先定义一个结构体,里面包含数据与结构体指针
{
int data;
struct node* next;
};
int main()
{
struct node* head, * tail, * p;
head = (struct node*)malloc(sizeof(struct node));//先在头指针开辟一个存储空间,但是不储存数据
head->data = 9;
head->next = NULL;//初始化头指针指向空指针
tail = NULL;//尾指针初始化为空指针
int x;
int n;
scanf("%d", &n);//输入想要的数字n个
int i = 0;
//输入数组
while (idata = x;
p->next = NULL;//p的指向下一个指针为空指针
if (head->next == NULL)
head->next = p;//固定头指针指向的指针,然后保持不变
else
tail->next = p;//此时的空间是新开辟的空间,tail->next即是上一个空间p->next
tail = p;//为指针指向p,可以理解作为一个桥梁,用来储存是一个指向的空间
i++;
}
//输出数组
int j;
for (j = 0, p = head->next; j< n; p = p->next,j++)
printf("%d ", p->data);
return 0;
}
这里我们不难看出用链表输入输出一个数组需要的代码量是非常大的。但是如果对于大数据的输入输出的话我们可以通过改变结构体的成员(即数据域)来照常输入输出,实际上链表的代码量并没有增加多少;如果用数组去输入输出大数据的话,那增加的代码量是翻倍的增加,由此,可以体现出链表的优势 。
总结:数组优于链表的:
1.内存空间占用的少,因为链表节点会附加上一块或两块下一个节点的信息.但是数组在建立时就固定了.所以也有可能会因为建立的数组过大或不足引起内存上的问题.
2.数组内的数据可随机访问.但链表不具备随机访问性.这个很容易理解.数组在内存里是连续的空间.比如如果一个数组地址从100到200,且每个元素占用两个字节,那么100-200之间的任何一个偶数都是数组元素的地址.可以直接访问.链表在内存地址可能是分散的.所以必须通过上一节点中的信息找能找到下一个节点.
3.查找速度上.这个也是因为内存地址的连续性的问题.不罗索了.
链表优于数组的:
1.插入与删除的操作.如果数组的中间插入一个元素,那么这个元素后的所有元素的内存地址都要往后移动.删除的话同理.只有对数据的最后一个元素进行插入删除操作时,才比较快.链表只需要更改有必要更改的节点内的节点信息就够了.并不需要更改节点的内存地址.
2.内存地址的利用率方面.不管你内存里还有多少空间,如果没办法一次性给出数组所需的要空间,那就会提示内存不足,磁盘空间整理的原因之一在这里.而链表可以是分散的空间地址.
3.链表的扩展性比数组好.因为一个数组建立后所占用的空间大小就是固定的.如果满了就没法扩展.只能新建一个更大空间的数组.而链表不是固定的,可以很方便的扩展.
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧