静态链表,双向链表,STL list
Posted 猪八戒1.0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态链表,双向链表,STL list相关的知识,希望对你有一定的参考价值。
1.静态链表
const int N = 10000; //按需要定义静态链表的空间大小
struct node //单向链表
int id; //这个结点的id
int data; //数据
int nextid; //指向下一个结点的id
nodes[N]; //静态分配需要定义在全局
//为链表的next指针赋初值,例如:
nodes[0].nextid = 1;
for(int i = 1; i <= n; i++)
nodes[i].id = i; //把第i个结点的id就赋值为i
nodes[i].nextid = i + 1; //next指针指向下一个结点
//定义为循环链表:尾指向头
nodes[n].nextid = 1;
//遍历链表,沿着nextid访问结点即可
//删除结点。设当前位于位置now,删除这个结点
nodes[prev].nextid = nodes[now].nextid; //跳过结点now,即删除now
now = nodes[prev].nextid; //更新now
2.双向链表
const int N = 10000;
struct node //双向链表
int id; //结点编号
int data; //数据
int preid; //前一个结点
int nextid; //后一个结点
nodes[N];
//为结点的指针赋初值,例如
nodes[0].nextid = 1;
nodes[1].preid = 0;
for(int i = 1; i <= n; i++) //建立链表
nodes[i].id = i;
nodes[i].preid = i-1; //前结点
nodes[i].nextid = i+1; //后结点
//定义为循环链表
nodes[n].nextid = 1; //循环链表:尾指向头
nodes[1].preid = n; //循环链表:头指向尾
//遍历链表,沿着preid和nextid访问结点即可
//删除结点。设当前位于位置now,删除这个结点
prev = nodes[now].preid;
next = nodes[now].nextid;
nodes[prev].nextid = nodes[now].nextid; //删除now
nodes[next].preid = nodes[now].preid;
now = next; //更新now
//插入结点,见后面的习题“自行车停放”
3.STL list
list是双向链表,它的内存空间可以是不连续的,通过指针访问结点数据,它能高效率地删除和插入。
//定义一个list
list<int>node;
//为链表赋值,例如定义一个包括n个结点的链表
for(int i=1;i<=n;i++)
node.push_back(i);
//遍历链表,用it遍历链表,例如从头遍历到尾:
list<int>::iterator it = node.begin();
while(node.size()>1) //list的大小由STL自己管理
it++;
if(it == node.end()) //循环链表,end()是list末端下一位置
it = node.begin();
//删除一个结点
list<int>::iterator next = ++it;
if(next==node.end()) next=node.begin(); //循环链表
node.erase(--it); //删除这个结点,node.size()自动减1
it = next; //更新it
//插入结点,见后面的习题“自行车停放”
以上是关于静态链表,双向链表,STL list的主要内容,如果未能解决你的问题,请参考以下文章
我在自己写一个STL,其中的list使用双向链表的,谁能帮我写一个迭代器。