【链表的学习】实现链表的几种方法

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.上述链表的手写代码已经比较简单了,如果还嫌麻烦,可以使用C++的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

//插入结点,见后面的习题“自行车停放”
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

007的米奇妙妙屋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值