链表经典算法

链表经典算法

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

#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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • fstream 中文路径_gradle files have changed

    fstream 中文路径_gradle files have changed在C++的标准库中,std::fstream是个挺好用的文件读写流,操作文件很方便,因为是C++标准库,所以没有其它的环境依赖。在使用fstream过程中,有个打开中文路径文件会失败的问题,自己的代码中一直没处理好,这几天终于有点闲心,把这里改透。涉及很多知识点,也是个遗留已久的问题,特此做个记录。在最后用了个一劳永逸的解决此问题方法:将fstream、FILE再包装下。中文路径使用fstream调试程序过程中,发现打开含中文路径的文件时,会打开失败。查了一些资料,说在VS2008、vs200..

  • Java集合类详解

    Java集合类详解Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap└WeakHashMapCollection接口  Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Element

  • HTML CSS整理笔记[通俗易懂]

    HTML CSS整理笔记[通俗易懂]常见字体单位:1.em移动端常用的字体尺寸单位,说白em就相当于“倍”,比如设置当前的div的字体大小为1.5em,则当前的div的字体大小为:当前div继承的字体大小*1.5。但当div进行嵌套时,em始终按当前div继承的字体大小来缩放。2.remr是root的意思,即相对于根节点html的font-size进行缩放,当有嵌套关系时,嵌套关系的元素的字体大小始终按照根节点的字体大小…

  • 手把手教你如何掌控安装Tensorflow(Windows和Linux两种版本)[通俗易懂]

    现在越来越多的人工智能和机器学习以及深度学习,强化学习出现了,然后自己也对这个产生了点兴趣,特别的进行了一点点学习,就通过这篇文章来简单介绍一下,关于如何搭建Tensorflow以及如何进行使用。建议的话,还是要学习了一点Python基础知识和Linux知识是最好的!版本:Windows7一:安装Anaconda和Tensorflow步骤:1:从官方网站下载Anacond…

  • C++学习之路——名字空间与模板

    C++学习之路——名字空间与模板例题:把课程当中的函数模板与类模板两个程序自己写一遍并写好注释。代码如下:#include “pch.h”#include<vector>#include<string>#include <iostream>using namespace std;//模板类template<class T> class Stack{publ…

  • 传统请求风格 VS RestFul 风格

    传统请求风格 VS RestFul 风格RestFul风格概念Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。功能资源:互联网所有的事物都可以被抽象为资源资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。分别对应添加、删除、修改、查询。传统方式操作资源:通过不同的参数来实现不同的效果!方法单一,post和get​ http://127.0.0.1/item/queryItem.actio

发表回复

您的电子邮箱地址不会被公开。

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