链表经典算法

链表经典算法

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

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


相关推荐

  • 完全删除SQL SERVER[通俗易懂]

    完全删除SQL SERVER[通俗易懂]    我们在安装SQLSERVER的时候,有时会出现问题,而在重新安装的时候,有时候会因为上次安装遗留的东西而导致本次安装失败,所以完全删除SQLSERVER比较重要。完全删除方法如下:      1、控制面板里删除。2、安装目录文件夹删除。3、注册表删除。4、安装windows install clean up 删除所有sql相关的东西。    …

    2022年9月26日
    0
  • Windows下如何强制删除文件夹及文件的命令「建议收藏」

    Windows下如何强制删除文件夹及文件的命令「建议收藏」点击Win输入cmd以管理员身份打开输入命令:rd/s/q盘符:\某个文件夹(强制删除文件文件夹和文件夹内所有文件)例如rd/s/qF:\AdobePhotoshop\AdobePhotoshopCS6del/f/s/q盘符:\文件名(强制删除文件,文件名必须加文件后缀名)例如del/f/s/qF:\护眼精灵\huyanjingling.rarhttps://blog.csdn.net/hanhanwanghaha欢迎关注这个超级无敌可爱的人鸭,有什么问

    2022年6月10日
    355
  • matlab求解高阶常微分方程_状态依赖时滞微分方程的动力学研究

    matlab求解高阶常微分方程_状态依赖时滞微分方程的动力学研究**前言:**大学期间只学习过《常微分方程》,没想到有些学校竟然还学《时滞微分方程》,于是找到一本由内藤敏机(日本)等著,马万彪等译的《时滞微分方程——泛函数微分方程引论》(有需要的可以私聊,CSDN貌似上传不了书籍,说侵权emmm),看着头秃,不过受到不少启发,尤其是对Logistic方程的改进,真真是长见识了。没找到有人用欧拉法解一阶时滞微分方程的,于是一不做二不休便用MATLAB实现了一下下…

    2022年10月1日
    0
  • 如何修改opkg 源

    如何修改opkg 源http://downloads.openwrt.org.cn/上面的链接是openwrt国内的源,但是只有适合以下几个系统的源Hacked/18-Jun-201413:58-OpenWrt-DreamBox/01-J

    2022年5月9日
    204
  • intellij idea激活码_通用破解码

    intellij idea激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    61
  • hostapd android,使用hostapd和dnsmasq实现软AP「建议收藏」

    hostapd android,使用hostapd和dnsmasq实现软AP「建议收藏」由于要共享无线给android,虽然cm6.1可以用ad-hoc,但感觉android连ad-hoc要比连ap耗电。本来想看看有什么usb无线网卡可以在linux下用软ap,顺便用来替换掉上网本的无线网卡,我的上网本在linux下的无线驱动太差劲(可恨的rtl8187),连ad-hoc都不支持。结果在http://linuxwireless.org上发现我台式机的无线网卡的ath5k驱动很完善,可…

    2022年5月21日
    93

发表回复

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

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