当前位置: 首页 > news >正文

顺序表(c++类模板实现)

功能包含数据的插入,删除,定位,查找前驱元素,查找后驱元素,显示功能;主要包含两个文件;.h文件对类1定义和对模板类的功能实现   .cpp主要用于功能测试;(可以忽略下我的注释哈,都是些碎碎念555~)

list.h文件

#include <iostream>
#include <iomanip>//格式化
using namespace std;

#ifndef INCLUDE_LIST_H_
#define INCLUDE_LIST_H_

template<class elem,int size> //类模板声明   这为什么要加size 
//template <class elem>
class List{//类声明
 private:
     int *m_list;//内存 
     int m_size; //内存大小
     int m_length;//数组长度 
  public: List() ;//构造函数
   ~List() ;//析构函数
   void clearlist() ;//初始化长度 
   bool listempty() ;//判断是否为空
   int listlength() ;//获取数组长度
   bool get(int i,elem*e) ;//查找指定下标函数,位置和数据的双重判断
   int locate(elem*e) ;//查找指定函数
   bool piror(elem*current,elem*preelem) ;//查找前驱元素
   bool next(elem*current,elem*nextelem) ;//查找后驱元素                                                    这里就tm离谱
   void  alllist() ;//遍历输出
   bool insert(int i,elem*e) ;//指定插入
   bool  del(int i,elem*e)  ;//指定删除                                                            为什么要用指针,好奇怪     
}; 
template<class elem,int size>//怎么还来一次
List<elem,size>::List()//构造函数类模板 
{
    m_size=size;//获得数据内存大小 
    m_list=new int[m_size] ;    //开辟空间                                         //有点意思这里 
    m_length=0;
}
 template<class elem,int size>
 List<elem,size>::~List() 
 {
     delete[]m_list;//释放数据
     m_list=NULL;                                                         //释放了咋还弄成空的嘞 
 }
template<class elem,int size>//再来一次 
void List<elem,size>::clearlist()//设置长度为0函数 
{  
      m_length=0;//内存为0 
    
}
template<class elem,int size>//不要忘记呀~
bool List<elem,size>::listempty ()
{
    if(m_length==0)
    return true;
    else
    return false;                                // 为什么从长度开始判断 
}
template<class elem,int size>//还来还来55 
int List<elem,size>::listlength() 
{
    return m_length;
}
template<class elem,int size>//。。。
bool List<elem,size>::get(int i,elem*e) 
{
    if(i<0||i>m_size||i==m_size)
    {
        cout<<"输入不合法" <<endl;
        return false;
    }
    *e=m_list[i];
    return true;                                              //原谅我这里也有点疑惑 
}
template<class elem,int size>
int List<elem,size>::locate(elem*e)
{
    //定位
     for(int i=0;i<m_length;i++)
     {
         if(m_list[i]==*e)//内存数据判断 
         {
             return i;
         }
     }
     return -1; 
}
template<class elem,int size>
bool List<elem,size>::piror(elem*current,elem*preelem)
{
    int temp=locate(current);//查找目前数值的位置
    if(temp==-1) 
    {
    
        return false;
    }
    else if(temp==0)
    {
        cout<<"首元素没有前驱元素" <<endl;
        return false;
    }
    else
    {
        *preelem=m_list[temp-1];
        return true; 
    }
}
template<class elem,int size>
bool List<elem,size>::next(elem*current,elem*nextelem)
{
       int temp=locate(current);
       if(temp==-1)
       {
           return false;
       }
       else if(temp==m_length-1)
       {
           cout<<"该元素没有后驱元素" <<endl;
           return false;
       }
       else
       {
           *nextelem=m_list[temp+1];
           return true;
       }
}
template<class elem,int size>
void List<elem,size>::alllist()
{
    for(int i=0;i<m_length;i++)
    {
        cout<<fixed << setprecision(2) << m_list[i] << endl;//格式化输出 
    }
}
template<class elem,int size>
bool List<elem,size>::insert(int i,elem*e) 
{
    if(i<0||i>m_length)//合法判断 
    {
        return false;
    }
    for(int k=m_length-1;k>=i;k--) 
    {
        m_list[k+1]=m_list[k];//依法次后移动 
    }
    m_list[i]=*e;
    m_length++;
    return true;
}
//删除元素
template<class elemtype,int size>
bool List<elemtype,size>::del(int i, elemtype *e)
{
    if (i<0 || i>m_length)
        return false;
    *e = m_list[i];
    for (int k = i + 1; k < m_length; k++)
    {
        m_list[k - 1] = m_list[k];
    }
    m_length--;
    return true;}


#endif    /* INCLUDE_LIST_H_ */               //这是个什么注释表达方法

main.cpp文件

#include <iostream> 
#include "list.h"
#include <iomanip>
using namespace std;
typedef double elem;//重命名 
int main()
{
    elem temp;
    elem a[100];
    List<double,10>list1;
    cout<<"数值导入前顺序表长度"<<list1.listlength()<<endl;
    cout<<"请输入元素个数"<<endl;
    int n;
    cin>>n;
    cout<<"请输入各个元素数值"<<endl; 
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
     for(int i=0;i<n;i++)
     {
         list1.insert(i,&a[i]);//插入元素 
     }
     cout<<"数值导入后顺序表长度"<<list1.listlength()<<endl;
     cout<<"请输入要进行的操作"<<endl;
     cout<<"1: 查找前驱元素" <<endl;
     cout<<"2: 查找后驱元素"<<endl;
     cout<<"3:删除顺序表中某元素" <<endl;
     cout<<"4:某位置插入元素"<<endl; 
     cout<<"5:查找某元素的位置"<<endl;
    int d;
    cin>>d; 
    switch(d)
    {
        case 1:
            cout<<"请输入查找前驱元素的序号";
       int b;
       cin>>b; 
     list1.piror(&a[b-1],&temp);
      cout<<"查找元素的前驱元素为"<<temp<<endl;
     break;
     case 2:
          cout<<"请输入查找后驱元素的序号";
         int h;
         cin>>h; 
        list1.next(&a[h-1],&temp) ;
         cout<<"查找元素的后驱元素为"<<temp<<endl;
      break;
     case 3:
         int u;
         cout<<"请输入要删除的元素位置"<<endl;
         cin>>u;
          list1.del(d-1,&temp);
         cout<<"被删除的元素"<<temp<<endl;
          cout<<"删除后的顺序表为"<<endl;
         list1.alllist();
    break;
    case 4:
        cout<<"请输入插入元素的位置" <<endl;
        int o;
        cin>>o;
        cout<<"请输入插入的元素"<<endl;
        double m;
        cin>>m;
        temp=m;
        list1.insert(o-1,&temp) ;
        cout<<"插入后的顺序表为"<<endl;
        list1.alllist();
        break;
    case 5:
        cout<<"请输入查找元素的数值"<<endl;
        int num;
        cin>>num;
        temp=num;
        cout<<"查找元素的位置为"<<list1.locate(&temp)+1 ;
        break;
        
    }
    
     
     return 0; 
}

先发吧,后续的知识点我今天晚上回去总结下顺序表实现的思路)

相关文章:

  • Leetcode 698. 划分为k个相等的子集
  • 开发工具安装
  • 图解字符串匹配算法:从Brute-Force到KMP,一下子就整明白了
  • Python语言:散修笔记
  • 为什么要学习Linux内核,如何学习?
  • 块级作用域绑定
  • 8.7 迁移学习域适应
  • 高企认定评分标准有哪些?
  • halcon提取数据集中指定图片并进行裁剪
  • 使用PdfSharp从模板生成Pdf文件
  • HTML篇三——(2)
  • 【012】基于JavaWeb酒店客房管理系统(附源码、数据库、数据库文档、运行教程)
  • Gitee账号注册以及Git下载安装
  • 边学边记——Java中有关接口的知识
  • ant-design-vue 库 Loading 组件封装
  • Angular 4.x 动态创建组件
  • AngularJS指令开发(1)——参数详解
  • bootstrap创建登录注册页面
  • JavaScript类型识别
  • JS题目及答案整理
  • Magento 1.x 中文订单打印乱码
  • MySQL的数据类型
  • python_bomb----数据类型总结
  • session共享问题解决方案
  • SpringBoot几种定时任务的实现方式
  • Vue.js 移动端适配之 vw 解决方案
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 开源SQL-on-Hadoop系统一览
  • 前端性能优化——回流与重绘
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 实战|智能家居行业移动应用性能分析
  • 使用 QuickBI 搭建酷炫可视化分析
  • 数据可视化之 Sankey 桑基图的实现
  • 一些css基础学习笔记
  • 应用生命周期终极 DevOps 工具包
  • ionic入门之数据绑定显示-1
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • # C++之functional库用法整理
  • # Maven错误Error executing Maven
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (附源码)计算机毕业设计高校学生选课系统
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (三)uboot源码分析
  • (算法)求1到1亿间的质数或素数
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET CORE Aws S3 使用
  • .NET Core 中插件式开发实现
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net 生成二级域名