链表的句柄指针都是“喜新厌旧”!!
1、“左增长型”:将句柄指向的内容挂在新分配内存的next上,而自己又去指向新的内存!永远都是指向“新来的”、“后进的”。
2、“右增长型”:将新分配内存挂在句柄指向的内容的next上,而自己又去指向新的内存!永远都是指向“新来的”、“后进的”。
不管怎么样,句柄都是永远指向“新来的”内存空间的。
原因是:
若句柄是指向最老的内存,每次添加新内存都需要从最老的内存移动到最后挂上链表的内存,然后将最新分配的内存再挂上去,
很麻烦且效率低下,所以句柄指向最后的内存,每次有新内存来直接挂上去就是了。
typedef struct _EmberAfPluginLinkedListElement {
struct _EmberAfPluginLinkedListElement* next;
struct _EmberAfPluginLinkedListElement* previous;
void* content;
} EmberAfPluginLinkedListElement;
//上面这个结构体就是双向链表了,下面这个结构体是給链表做个监控的指针,便于好操作链表
typedef struct {
EmberAfPluginLinkedListElement* head;
EmberAfPluginLinkedListElement* tail;
uint32_t count;
} EmberAfPluginLinkedList;
链表如何做到“先进先出”?
比如双向链表的句柄是*Dlist,这个Dlist每次都是指向新分配的node内存,想做到像队列那样的“先进先出”每次都得遍历两遍,
1、当需要存入链表就需要遍历到链表尾部添加,
2、当取的时候就需要遍历到链表头部取。
效率低下!
解决办法就是一个双向链表做两个指针句柄,一个指向链表的头,一个指向链表的尾部
指向尾部的句柄进行“右增长”。当有新内存来就将新内存指向自己的next,然后自己又指向新的内存。