-
顺序表的缺点
1.添加和删除操作需要移动元素
2.当数据量特别大的情况,可能没有连续的累出你可使用 -
链表:通过指针方式建立元素之间前后链接关系
-
定义操作
1.创建链表
bool linklist_init(LinkList* plist);
2.添加元素
bool linklist_append(LinkList* plist,LinkType value);
bool linklist_prepend(LinkList* plist,LinkType value);
3.获取元素
LinkType linklist_get(LinkList* plist,int index);
4.获取元素个数
int linklist_size(LinkList *plist);
5.插入元素
bool linklist_insert(LinkList* plist,int index,LinkType value);
6.删除元素
bool linklist_remove(LinkList *plist,int index);
7.销毁链表
bool linklist_destory(LinkList* plist);
- 优化
1.创建
将结构体定义和初始化合二为一
LinkType linklist_create();
2.随机访问元素
LinkType* linklist_at(LinkList* plist,int index);
3.遍历
typedef void (*LinkList_Traversal)(const LinkType* value);
void linklist_traverse(LinkList* plist,LinkList_Traversal fp);
4.获取链表大小
每次获取链表元素个数都要整个遍历一遍,时间复杂度为O(n)。在LinkList中添加成员int size;记录链表元素个数,时间复杂度降为O(1)。注意初始化、添加和删除元素函数都需要添加相应处理。
5.尾部添加数据
每次尾添加数据都要整个遍历一遍,时间复杂度为O(n)。在LinkList中添加成员Node* tail;记录链表最后一个节点,时间复杂度降为O(1)。注意初始化、添加和删除元素函数都需要添加相应处理。
6.头节点
链表添加第一个节点和最后一个节点需要额外处理,添加一个额外的头节点可以简化处理。头指针出现改变的情况,链表添加第一个节点和最后一个节点与添加删除中间节点处理一致。
- 插入和删除操作分析
1.插入
- 头插入
- 尾插入
2.删除- 开头删除
- 尾部删除
- 中间删除
- 开头删除
- 注意
1.空链表删除节点(此情况使用断言或者抛出异常)
2.待删除节点的链表中只有一个节点(删除后把头指针和尾部指针设置为空)