列表结构接口实现

2023-11-07

//
//  main.cpp
//  List
//
//  Created by 杨涛睿 on 2020/8/9.
//  Copyright © 2020 杨涛睿. All rights reserved.
//

#include <iostream>
typedef int Rank;
#define Posi(T) ListNode<T>*

using namespace std;
template<typename T>
struct ListNode{
    T data;
    Posi(T) pred; Posi(T) succ; //前驱和后继
    ListNode(){}
    ListNode(T e,Posi(T)p = NULL,Posi(T)s = NULL):data(e),pred(p),succ(s){}
    Posi(T) insertAsPred(T const&e);
    Posi(T) insertAsSucc(T const&e);
};
template<typename T>
Posi(T) ListNode<T>::insertAsPred(const T &e){
  
    Posi(T) p = new ListNode(e,this->pred,this);
    pred->succ = p;
    pred = p;
    return p;
   
   /*
    不能在函数栈中创建结点,会被其他函数定义的变量覆盖!
    ListNode p(e,this->pred,this);
    pred->succ = &p;
    pred = &p;
    return &p;
    */
}
    
template<typename T>
class List{
private:
    int _size;
    Posi(T) header;
    Posi(T) trailer;
protected:
    void init();
    int  clear();
    void copyNodes ( Posi(T), int n);
public:
    T remove(Posi(T) p);
    /*重载下标操作符
     在函数后加const的含义是:该函数不修改对象内数据成员的值
     */
    T& operator[] ( Rank r ) const{
        Posi(T) p = header->succ;
        while(0<r--)p=p->succ;
        return p->data;
    }
    //插入结点
    Posi(T) insertAsBefore(T const&e,Posi(T)p);
    Posi(T) insertNode(T const&e);
    //构造函数
    List(){
        init();
    }
     List ( List<T> const& L ); //列表整体复制
     List ( List<T> const& L, Rank r, int n );//复制列表L自第R项起的第n项
     List ( Posi(T) p, int n ); //复制列表自位置P起的n项
    //析构函数
    ~ List();
    //无序列表唯一化
    int deduplicate();
    //有序列表唯一化
    int uniquify();
    //列表遍历
    void traverse();
    //无序列表查找,与有序列表共同约定d返回不大于e的最后者
    Posi(T) find(T const&e,Posi(T)p,int n);
    //有序列表查找
    Posi(T) search(T const&e,Posi(T)p,int n);
};


template<typename T>
void List<T>::init(){
    _size = 0;
    header = new ListNode<T>(0);
    trailer = new ListNode<T>(0);
    header->succ = trailer;
    trailer->pred = header;
    header->pred = NULL;
    trailer->succ=NULL;
}
template<typename T>
void List<T>::copyNodes(Posi(T) p, int n){
    init();
    while (n--) {
        insertNode(p->data);
        p=p->succ;
    }
}
//析构函数,先删除所有结点,再删除两个哨兵
template<typename T>
 List<T>::~List(){
    clear();
    delete(header);
    delete(trailer);
}
//删除结点
template<typename T>
T List<T>::remove(Posi(T) p){
    T e = p->data;
    p->pred->succ = p->succ;
    p->succ->pred = p->pred;
    delete(p);_size--;
    return e;
}
//遍历
template<typename T>
void List<T>::traverse(){
    Posi(T) p= header->succ;
    while(p!=trailer){
        cout << p->data <<endl;
        p = p->succ;
    }
}
//在结点前插入
template<typename T>
Posi(T) List<T>::insertAsBefore(const T &e, Posi(T) p){
    _size++;
    return p->insertAsPred(e);
}
//在列表末尾新增结点
template<typename T>
Posi(T) List<T>::insertNode(const T &e){
    _size++;
    Posi(T) p = new ListNode<T>(e,trailer->pred,trailer);
    trailer->pred->succ = p;
    trailer ->pred = p;
    return p;
    /*
      _size++;
      ListNode<T>node(e);
      node.pred = trailer->pred;
      node.succ = trailer;
      trailer->pred = &node;
      node.pred->succ = &node;
    */
}

//清空结点
template<typename T>
int List<T>::clear(){
    int oldSize = _size;
    while(_size>0)
        remove(header->succ);
    return oldSize;
}
//无序列表唯一化,思想:前缀无重复元素,后缀加入前缀
template <typename T>
int List<T>::deduplicate(){
    if(_size<2)return 0;
    int oldSize = _size;
    Posi(T) p = header->succ;Rank r = 1;
    while(trailer!=(p=p->succ)){
        Posi(T) q = find(p->data, p, r);
        q?remove(q):r++;
    }
    return oldSize - _size;
}
//有序列表唯一化,思想:前缀无重复元素,后缀加入前缀
template<typename T>
int List<T>::uniquify(){
    if(_size<2)return 0;
    int oldSize = _size;
    Posi(T) p = header->succ;
    Posi(T) q  ;
    while(trailer!=(q=p->succ)){
        if(p->data!=q->data)p=q;
        else remove(q);
    }
    return oldSize - _size;
}
//无序列表查找,n在唯一化时起作用
template<typename T>
Posi(T) List<T>::find(T const&e,Posi(T)p,int n){
    while(n-->0){
        if(e==(p=p->pred)->data)return p;
    }
    return NULL;
}
//有序列表查找
template<typename T>
Posi(T) List<T>::search(T const&e,Posi(T)p,int n){
    while(n-->0){
         if(((p=p->pred)->data) <=e)break;
        return p;
    }
   
    return p;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

列表结构接口实现 的相关文章

随机推荐

  • 李彦宏传

    以下内容摘自 李彦宏传 李彦宏 1968年出生山西省阳泉市的一个工人家庭 上面有三个姐姐 学霸类型 喜欢下棋 曲艺 文科功底深厚 理科也强 高二参加山西省计算机编程大赛 获取第二名 李彦宏父亲从小受过私塾教育 熟读四书五经 大姐考上大学 三
  • 【3D卡片切换】基于jquery实现3D堆叠卡片切换效果(附完整源码)

    文章目录 写在前面 涉及知识点 实现效果 1 搭建页面 1 1 创建ul li节点 1 2 丰富元素 Html代码所示 CSS代码所示 2 JS实现堆叠切换 3 源码分享 3 1 百度网盘 3 2 123云盘 3 3 邮箱留言 总结 写在前
  • 关于SoftMax函数的一些介绍

    前言 SoftMax函数是在机器学习中经常出现的 时常出现在输出层中 对于这个函数 大部分blog作者对于它介绍已经很完善了 包括如何玄学设计 如何使用等等 这里只是从数学来源上讨论下这个函数名字的来历 或者说数学的来源 为什么叫做Soft
  • Qt多个timer在一个线程里面

    ifndef MAINWINDOW H define MAINWINDOW H include
  • keras分类猫狗数据(番外篇)深度学习CNN连接SVM分类

    承接上文 keras分类猫狗数据 上 数据预处理 keras分类猫狗数据 中 使用CNN分类模型 keras分类猫狗数据 下 迁移学习 keras分类猫狗数据 番外篇 深度学习CNN连接SVM分类 2019年2月23日补充 引用回复biya
  • 2023最新网络安全学习路线(完整版)

    如何成为一名黑客 很多朋友在学习安全方面都会半路转行 因为不知如何去学 今天在知乎看到个不错的 果断收藏学习下路线 此篇博客讲的非常细 有兴趣的同学可以参考 片尾有整理好的学习路线图哦 在这里 我将这个整份答案分为 黑客 网络安全 入门必备
  • 单射、满射和双射图解

    单射 one to one 如果当 u v U u v U u v U f
  • logback日志分开纪录

    LogBack 日志 文件分开纪录 在处理Log中 我们一般讲Log分为一下几类 Debug类型 Error类型 Info类型 等等 那么使用LogBack如何分开日志处理 代码如下 当然也可以作为一个标准xml来使用
  • k8s笔记7.4--helm构建无端口类型chart

    k8s笔记7 4 helm构建无端口类型chart 介绍 无端口chart 注意事项 说明 介绍 helm create chartName 后 默认创建了一个web类型的应用 而且配置了service 和 端口探测 如果直接更换为无端口的
  • 单链表实现快排

    单链表实现快排 思想 快排的思想 以一个点为分割点 将数组分割成前半部分比这个点小 后半部分比这个点大的两部分 然后再递归对这两半段进行上述同样的操作 然后合起来 此处一般直接在原数组中进行操作 交换元素 是一种分治的思想 转移到链表上 以
  • 亲密关系沟通-【归属感】提升归属感的沟通方法

    先生事业心很重 总是在工作 跟他在一块 经常觉得自己被忽视 时间久了 两个人感情越来越淡 为什么丈夫对这个家付出很多 为什么太太还是觉得归属感不够 我都这样了 你还想要我怎么样 我到底哪里不好 你为什么出轨 跟我没话说 跟外面的人有话说是吧
  • confluence数据备份与还原

    1 背景 最近公司要拓展到新的办公基地 之前的项目资料和文档都是在confluence上统一管理的 为了不影响两边的项 目开发 我们需要复制一份数据到新的confluence服务器上 因此涉及到了confluence数据的备份和还原 其实
  • 探索 SOCKS5 代理在跨境电商中的网络安全应用

    随着全球化的发展 跨境电商成为了商业界的一颗新星 为企业提供了无限的发展机遇 然而 随之而来的是网络安全的挑战 特别是在处理国际网络流量时 在这篇文章中 我们将探讨如何利用 SOCKS5 代理和代理 IP 技术来加强跨境电商的网络安全 保障
  • javaScript的for循环语句练习之解决鸡兔同笼问题(基础版)

    鸡兔同笼 一共50只 脚160 求鸡多少只 兔子多少只 目录 首先第一步 框架 第二步 分析 第三步 循环 第四步 添加条件 第五步 添加判断 第六步 完善 第七步 完整代码 今天我们来说一下for循环的有关练习 来加强一下对for循环的使
  • 《数据库系统概论》第四版课后习题答案

    第1章 绪论 1 试述数据 数据库 数据库系统 数据库管理系统的概念 答 l 数据 Data 描述事物的符号记录称为数据 数据的种类有数字 文字 图形 图像 声音 正文等 数据与其语义是不可分的 解析在现代计算机系统中数据的概念是广义的 早
  • C++ 多态虚函数常见问题

    哪些函数不能为虚函数 非类成员的普通函数 静态 static 函数 构造函数不能是虚函数 存储角度 虚函数的vtable 是存储在对象的内存空间的 对象没有实例化 意味着内存空间还没有 所以无法找到对应的vtable 调用角度 虚函数的作用
  • 常见四种虚拟化技术优劣势对比

    虚拟化技术 Virtualiz ation 和分区 Partition 技术是紧密结合在一起 从60年代Unix诞生起 虚拟化技术和分区技术就开始了发展 并且经历了从 硬件分区 gt 虚拟机 gt 准虚拟机 gt 虚拟操作系统 的发展历程
  • 松下伺服调试方法

    松下伺服电机的基本调试 1 初始化参数 在接线之前 先初始化参数 在控制卡上 选好控制方式 将PID参数清零 让控制卡上电时默认使能信号关闭 将此状态保存 确保控制卡再次上电时即为此状态 在伺服电机上 设置控制方式 设置使能由外部控制 编码
  • 【Linux基础】在Linux云服务器中添加一个具有管理员权限的用户

    现在我们购买了一台云服务器 一台云服务器会有一个IP地址和一个初始密码 我们使用用户名root 以及初始密码就可以登陆到云服务器 但是在云服务器上操作不能一直用root 所以我们打算新建一个用户 新建一个用户的Linux指令是 userad
  • 列表结构接口实现

    main cpp List Created by 杨涛睿 on 2020 8 9 Copyright 2020 杨涛睿 All rights reserved include