需掌握STL,链表,字节对齐,指针与数组;自动增长数组,进阶。
vector用的就是数组链表,list用的就是离散链表。
所谓数组链表就是数组内存放链表地址,vector可以变长是类似数组拷贝的原理,比如上来开辟100个长度,满了在来100;实际上是来了一个200的数组,把原来的100拷贝到了200里,定位快。那么list存链表可以直接插入或追加方便,但是查找依然是遍历耗时。
实现原理就是new内存地址保存struct。任何需求都是定制性开发,根据需求和环境进行逻辑设计。
1mb的内存放8个字节的指针可以放131072个,这么多随便放吧,索引定位很快的。
#include <stdio.h>
//普通链表
typedef struct LinkedBuffer
{
int i;
char* buffer;
LinkedBuffer* linked;
}Linkedb;
//数组链表
typedef struct LinkedArray
{
double d;
int i;
char* buffer;
}Linkeda;
int main()
{
/*----------------------------------数组链表--------------------------------------*/
Linkeda *linked[1024];//长度1024
int ptr_size = sizeof(*linked);
int ary_size = sizeof(linked);
printf("%d\n", ptr_size);
printf("%d\n", ary_size);
//自己指定,快速定位。扩容相对费时,不可插入可覆盖或特殊逻辑插入。
linked[5] = new Linkeda;
linked[5]->i = 5;
printf("linked[5]:%d\n", linked[5]->i);
//扩容参照c++ 自动增长数组
/*----------------------------------单向链表--------------------------------------*/
Linkedb *linkedb = new Linkedb;
Linkedb *linkedb1 = new Linkedb;
Linkedb *linkedb2 = new Linkedb;
Linkedb *linkedb3 = new Linkedb;
linkedb->i = 0;
linkedb->buffer = NULL;
linkedb->linked = linkedb1;
linkedb1->i = 1;
linkedb1->buffer = new char[1024];//长度1024,你懂的(Linkedb)设计随心。
linkedb1->linked = linkedb2;
linkedb2->i = 2;
linkedb2->buffer = new char[1024];//长度1024,你懂的(Linkedb)设计随心。
linkedb2->linked = linkedb3;
linkedb3->i = 3;
linkedb3->buffer = new char[1024];//长度1024,你懂的(Linkedb)设计随心。
linkedb3->linked = linkedb;//这里赋值NULL链表结束。赋值linkedb形成循环
/*----------------------------------可以单独创建插入删除-------------------------*/
Linkedb lin = *linkedb;
for (size_t i = 0; i<8; i++)
{
printf("%d\n",lin.i);
if (lin.linked!=NULL)
{
lin = *lin.linked;
}
else
{
break;
}
}
/*当然可以扩展树结构、图结构*/
}