链表经典算法

链表经典算法

链表的插入,删除,修改,查找等经典算法,以及基本应用实例

#include <iostream>
using namespace std;
typedef int T;
class List{
    struct Node{
        T         data;
        Node*     next;
        Node(const T& d=T()):data(d),next(0){}//零初始化
    };
    Node* head;//头指针,用来保存头节点的地址
    int len;
public:
    List():head(NULL),len(0){ }
    void push_front(const T& d){
   //前插
        insert(d,0);
    }
    List& push_back(const T& d){
   //尾插
        insert(d,size());
        return *this;
    }
    int size()const{
        return len;
    }
    Node*& getptr(int pos){
   //找链表中指向指定位置的指针
        if(pos<0||pos>size()) pos=0;
        if(pos==0) return head;
        Node* p = head;
        for(int i=1; i<pos; i++)
            p = p->next;
        return (*p).next;
    }
    void insert(const T& d, int pos){
   //在任意位置插入
        Node*& pn = getptr(pos);
        Node* p = new Node(d);
        p->next = pn;
        pn = p;
        ++len;
    }
    void travel()const{
   //遍历
        Node* p = head;
        while(p!=NULL){
            cout << p->data << ' ';
            p = p->next;
        }
        cout << endl;
    }
    void clear(){
   //清空这个链表
        while(head!=NULL){
            Node* p = head->next;
//            cout << "delete " << head << endl;
            delete head;
            head = p;
        }
        len = 0;
    }
    ~List(){
//        cout << this << "*******" << head << endl;
        clear();
    }
    void erase(int pos){
   //有效位置为0~size()-1
        if(pos<0||pos>=size()) return;
        Node*& pn = getptr(pos);
        Node* p = pn;
        pn = pn->next;
        delete p;
        --len;
    }
    void remove(const T& d){
        int pos;
        while((pos=find(d))!=-1)
            erase(pos);
    }
    int find(const T& d)const{
        int pos = 0;
        Node* p = head;
        while(p){
            if(p->data==d) return pos;
            p = p->next; ++pos;
        }
        return -1;
    }
    void set(int pos, const T& d){
        if(pos<0||pos>=size()) return;
        getptr(pos)->data = d;
    }
    bool empty()const{
   return head==NULL;}
    T front()const{
   if(empty())throw "空";return head->data;}
    T back()const{
        if(empty())throw "空";
        Node* p=head;
        while(p->next!=NULL)
            p = p->next;
        return p->data;
    }
};
int main()
{
    List l;
    l.push_front(5);//5
    l.push_front(8);//8 5
    l.push_front(20);//20 8 5
    l.insert(9,2);//20 8 9 5
    l.insert(6,100);//6 20 8 9 5
    l.insert(7,-10);//7 6 20 8 9 5
    l.insert(1,2);//7 6 1 20 8 9 5
    l.push_back(10).push_back(15).travel();
    l.erase(0);//x7:6 1 20 8 9 5 10 15
    l.erase(l.size()-1);//x15:6 1 20 8 9 5 10
    l.erase(2);//x20:6 1 8 9 5 10
    l.travel();
    l.push_back(6);//6 1 8 9 5 10 6
    l.insert(6, 3);//6 1 8 6 9 5 10 6
    l.travel();
    l.remove(6);//1 8 9 5 10
    l.travel();
    l.set(0, 666);
    l.set(4, 789);
    l.set(l.find(9),123);
    l.set(1, 777);
    l.travel();
    cout << l.front() << "..." << l.back() << ',' << l.size() << "个" << endl;
    while(!l.empty()) l.erase(0);
    cout << "size:" << l.size() << endl;
    return 0;
}

 

转载于:https://www.cnblogs.com/macong/archive/2012/11/11/2765240.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110286.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 阿里-中间件团队博客「建议收藏」

    阿里-中间件团队博客「建议收藏」阿里中间件团队博客地址:http://jm.taobao.org/截至2019-03-15日已发布的博客列表:2017双11专题10 2018广东云栖大会1 ACM3 AHAS1 APM1 ARMS8 AlibabaCloudToolkit1 Aliware1 ApacheRocketMQ1 BCP1 CNCF1 Docker1 Dubbo10 Dubbo…

    2022年8月13日
  • 验证码 verifycode 留存可用

    验证码 verifycode 留存可用验证码verifycode留存可用

    2022年7月15日
  • 外包公司怎么样「建议收藏」

    外包公司怎么样「建议收藏」其实大家每天心里都像明镜一样的明白“低技术含量的外包没有前途”,好多人都认为外包没有技术,其实这种思想不对,国外有大量的高端技术外包业务等着我们干,但是反问一句“你们能干吗?”,现在大部分的公司都是平均每个项目开发4个月,干完就再转一个组再做别的项目,从Java.NETCC++到你们没有听说过的RPG,一个有着7年开发经验的外包人员可以说自已会十几种开发语言做过几十个case,但是我们不…

    2022年5月19日
  • 单片机spi通信_stm32单片机常用的片内外设

    单片机spi通信_stm32单片机常用的片内外设提示:若转载,请备注来源,谢谢!文章目录前言一、SPI协议是什么?1.优点2.缺点3.结构二、SPI协议1.模式概念理解2.通信过程分析3.SPI个人协议理解总结前言题目上写的是单片机,其实不管你的板子上不上系统(FreeRtos、Linux),协议都是不变的。题外话:工作过程中,一直在移植别人写好的SPI协议,然后和外设的芯片(例如:Flash芯片、NFC芯片等)进行通信,但是都没有往底层深入的看,下午看了照着代码看了三个多小时,写这篇博客作为总结。一、SPI协议是什么?S

    2022年10月9日
  • 【直观详解】什么是正则化

    【直观详解】什么是正则化转自:https://charlesliuyx.github.io/2017/10/03/%E3%80%90%E7%9B%B4%E8%A7%82%E8%AF%A6%E8%A7%A3%E3%80%91%E4%BB%80%E4%B9%88%E6%98%AF%E6%AD%A3%E5%88%99%E5%8C%96/https://www.zhihu.com/question/20924039【内容简介】主…

    2022年7月13日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号