链表经典算法

链表经典算法

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

#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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PDF转换图片小工具(高清、无水印、支持随意页数)[通俗易懂]

    PDF转换图片小工具(高清、无水印、支持随意页数)[通俗易懂]疫情期间在家毕业需要,手写签名生成、成绩单的PDF文件需要加入到word中,经历了办理会员、限制5页等等的各种不方便,自己写了个小工具。平台:win764位vs15开发C#语言编写本文所编小工具,不限页数,支持高像素高清截图,随意页截取等截图如下所示:使用说明:选择起始页-终止页-像素级别(部分已默认,可以根据自己需要,一定得填写),点击按钮开始转换–选择需操作的PDF文件–选择转换完的图片的输出路径—程序提示转换成功即可。…

    2022年5月13日
    50
  • 杭电 2201

    杭电 2201

    2022年1月25日
    47
  • cmd 命令如何装逼 滚动屏幕[通俗易懂]

    在cmd环境下打开文件和文件夹。喜欢装逼的大伙可以看看。打开文件夹的话用start命令例如start文件夹打开文件进入指定目录后直接键入文件名就行或者直接start路径例如startg:\tmp<–打开文件夹startg:\tmp\1.txt<–打开文件改变cmd颜色colora0=…

    2022年4月17日
    154
  • VS Code 迎来新对手?JetBrains发布新一代轻量编辑器——Fleet

    VS Code 迎来新对手?JetBrains发布新一代轻量编辑器——Fleet11月29日,Jetbrains官网发布一个重大消息,即公布了一个轻量级编辑器——Fleet。????https://www.jetbrains.com/zh-cn/fleet/Fleet作为一个功能齐全的编辑器启动,具有语法高亮显示、简单的代码补全,以及用户对一个编辑器期待的所有功能,比如智能补全、重构、导航、调试等功能。话不多说,下面让我们了解一下Fleet新功能吧。Fleet适用于多种场景和多类编程语言JetBrains官方认为开发者通常在不同的项目中会使用到不同的技术,有时在单个项目

    2022年6月11日
    190
  • C#FindWindowEx参数详解

    C#FindWindowEx参数详解FindWindowEx参数详解本函数的其他内容在网络上都比较多,这里主要说一下它的参数设置和搜索结果的区别。函数功能:在窗口列表中寻找与指定条件相符的第一个子窗口。该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。函数原型:HWNDFindWindowEx(HWNDh

    2022年6月1日
    49
  • C#中使用SQLDMO的StoredProcedure对象(存储过程)创建数据表「建议收藏」

    C#中使用SQLDMO的StoredProcedure对象(存储过程)创建数据表「建议收藏」               …….               SQLDMO.StoredProcedurestrProc=newSQLDMO.StoredProcedure();               //Assignanametostoredprocedure               strProc.Name=”createCustomerT

    2022年7月26日
    7

发表回复

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

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