本文共 1196 字,大约阅读时间需要 3 分钟。
链表由一系列节点组成,其中每个节点包括两个域,一个是数据域,用来存储数据,另一个是指针域,用来存储下一个节点的地址,链表在内存中是非连续的
例如:struct LinkNode{ int age;//定义数据域 struct LinkNode*next;//定义指针节点,指向下一个节点首地址};
链表在指定位置插入与删除元素不需要移动元素,只需要修改指针即可,而数组删除与加入元素则需要移动后面的元素,链表相对于数组来讲,则多了指针域空间开销,拿到链表第一个节点就相当于拿到整个链表
链表的分类:静态链表,动态链表
单向链表,双向链表,循环链表,单向循环链表,双向循环链表数组:一次分配一块连续的存储空间
优点:随机访问元素效率高 缺点:(1)需要分配一块连续的存储区域(很大区域,有可能分配失败) (2)删除和插入某个元素效率低 链表:无需一次性分配一块连续的内存区域,只需分配n快节点存储区域,通过指针建立关系 优点:(1)不需要一块连续的存储区域 (2)删除和插入某个元素效率高 缺点:随机访问元素效率低#include//链表结点定义struct LinkNode{ int data;//定义链表数据 struct LinkNode*next;//定义链表节点};void test(){ struct LinkNode node1 = { 10,NULL }; struct LinkNode node2 = { 20,NULL }; struct LinkNode node3 = { 30,NULL }; struct LinkNode node4 = { 40,NULL }; struct LinkNode node5 = { 50,NULL }; struct LinkNode node6 = { 60,NULL }; node1.next = &node2; node2.next = &node3; node3.next = &node4; node4.next = &node5; node5.next = &node6; //如何遍历链表:定义一个辅助指针 struct LinkNode* pCurrent = &node1; while (pCurrent != NULL) { //打印数据 printf("%d ", pCurrent->data); //指针移动到下一个元素的首地址 pCurrent = pCurrent->next; } }int main(){ test(); return 0;}
(本文是个人学习心得,如有错误还请多多指出)
转载地址:http://vwlgz.baihongyu.com/