zoukankan      html  css  js  c++  java
  • 编程菜鸟的日记-初学尝试编程-顺序表的类定义及其基本操作算法(创建表、元素插入、元素删除、顺序查找、测表空、求表长、输出等)

    //顺序表类定义如下:

    //顺序表包含的内容:表首地址(elem)+表长(length)+表容量(listsize)

    template<class T>
    class SqList
    {
     private:
      T *elem;      //表首址
      int length;   //表长
      int listsize; //表容量
     public:
      SqList(int m);  //构造函数,创建容量为m的空表
      ~SqList();      //析构函数,删除表空间
      void CreateList(int n); //创建具有n个元素的线性表
      void Insert(int i,T e); //在表中第i个位置插入元素e
      T Delete(int i); //删除T表中第i个元素
      T GetElem(int i);//获得第i个元素的值
      int Locate(T e);//定位值为e的元素在表中的位置
      void Clear();   //清空表
      int Empty();    //测表空
      int Full();     //测表满
      int Length();   //测表长
      void ListDisp(); //输出表元素
    };

    //源程序

    //创建头文件SqList.h

    template<class T>
    SqList<T>::SqList(int m)
    {                   //构建函数,创建一表容量为m的空表
     elem=new T[m]; //申请表空间
     length=0;    //空表,长度为0
     listsize=m;  //表容量为m
    }

    template<class T>
    SqList<T>::~SqList()
    {
     delete [] elem;
     length=0;
     listsize=0;
    }
    //void CreateList(int n); 创建具有n个元素的线性表
    template<class T>
    void SqList<T>::CreateList(int n) //创建表,表长度为n
    {
     if(n>listsize)
      throw"参数非法";
     cout<<"请依次输入"<<n<<"个元素值:"<<endl;
     for(int i=0;i<n;i++)
     {
      cin>>elem[i];
     }
     length=n;
    }

    template<class T>
    void SqList<T>::Insert(int i,T e)
    {//在第i个位置插入元素e,如若不能插入显示异常信息
     if(length>=listsize)
      throw"上溢";
     if(i<1||i>length+1)   //加i是否合理的判断,超出表头和表尾
      throw"插入位置异常";
     for(int j=length-1;j>=i-1;j--)
      elem[j+1]=elem[j];//将i-1到length-1的元素全部向后移动一个位置,移到i~length
     elem[i-1]=e;//注意第i个位置是表中第i-1个元素
     length++;//表长度加1
    }

    //T Delete(int i);获得第i个元素的值
    template<class T>
    T SqList<T>::Delete(int i)
    {//删除表中第i个位置元素,如若不能删除,显示异常信息
     T x;
     if(length==0)
      throw"下溢";
     if(i<1||i>=length+1)
      throw"删除位置异常";
     x=elem[i-1];//获取第i个位置的元素
     for(int j=i;j<=length-1;j++)//将i到length-1上的元素全部向前移动一个位置
      elem[j-1]=elem[j];
     length--;
     return x;
    }
    //int Locate(T e);定位值为e的元素在表中的位置
    template<class T>
    int SqList<T>::Locate(T e)
    {//找到表中等于e的值,返回e在表中位置;若没找到则返回0
     for(int i=0;i<length-1;i++)
     {
      if(elem[i]==e)
       return i+1;//找到,返回位置为i+1
     }
     return 0;     //未找到,返回0
    }
    //void Clear();   清空表
    template<class T>
    void SqList<T>::Clear()
    {
     length=0;//清空表
    }

    // int Empty();   测表空
    template<class T>
    int SqList<T>::Empty()
    {//表空返回0,否则返回0
     if(length==0)
      return 1;
     else
      return 0;
    }
    //T GetElem(int i);获得第i个元素的值
    template<class T>
    T SqList<T>::GetElem(int i)
    {//判断i是否合理,若合理则返回第i个元素值,否则返回异常信息
     if(i<1||i>=length-1)
      throw"位置不合法";
     else
     {
      T x;
      x=elem[i-1];
      return x;
     }
    }
    //int Full(); 测表满
    template<class T>
    int SqList<T>::Full()
    {//满则返回1;否则返回0
     if(length==listsize)
      return 1;//表满
     else
      return 0;
    }
    //int Length(); 测表长
    template<class T>
    int SqList<T>::Length()
    {
     return length;//返回表长
    }

    //void ListDisp(); 输出表元素
    template<class T>
    void SqList<T>::ListDisp()
    {
     for(int i=0;i<=length-1;i++)
     cout<<i+1<<":"<<elem[i]<<endl;
    }

    //主函数调用

    //SqList_main().cpp

    #include <iostream>//cout,cin
    #include "process.h"//exit()
    using namespace std;
    #include "SqList.h"//顺序表类定义,顺序类的实现
    typedef int T;//自定义 T为int,在程序中所有T为int
    //顺序表的基本操作算法,包括创建表、元素插入、元素删除、元素顺序查找、测表空、求表长等。
    int main()
    {
     int i;
     T e;
     SqList<T> L(20);//建立容量为20,元素类型为整型的空顺序表
     system("cls");//执行系统命令cls,清屏
     int choice;
     do
     {//显示主要功能菜单
      cout<<"1-创建顺序表 ";
      cout<<"2-在链表第i个位置插入元素 ";
      cout<<"3-删除顺序表中第i个位置的元素 ";
      cout<<"4-返回第i个位置上的元素值 ";
      cout<<"5-定位表中元素值为e的位置 ";
      cout<<"6-清空表 ";
      cout<<"7-测表空 ";
      cout<<"8-测表满 ";
      cout<<"9-测表长 ";
      cout<<"10-输出表元素 ";
      cout<<"11-退出 ";
      cout<<"Enter choice:";
      cin>>choice;
      switch(choice)
      {
      case 1://创建表
       cout<<"请输入要创建的顺序表中元素的个数:";
       cin>>i;
       cout<<endl;
       L.CreateList(i);//创建表元素为i个的顺序表
       break;
      case 2://插入元素
       cout<<"请输入要插入的位置:";
       cin>>i;
       cout<<endl;
                cout<<"请输入要插入的值:";
       cin>>e;
       cout<<endl;
       L.Insert(i,e);//将e插入i位置
       break;
      case 3://删除位置i的元素
       cout<<"请输入要删除元素的位置:";
       cin>>i;
       cout<<endl;
       e=L.Delete(i);
       cout<<"被删除的元素为:"<<e<<endl;
       system("pasue");
       break;
      case 4://返回位置i上的元素值
       cout<<"请输入要查询的元素位置:";
       cin>>i;
       cout<<endl;
       e=L.GetElem(i);
       cout<<"第i个元素值为:"<<e<<endl;
       system("pasue");
       break;
      case 5://定位表中元素值为e的位置
       cout<<"请输入查询的元素值:";
       cin>>e;
       cout<<endl;
       i=L.Locate(e);
       cout<<"要查询的元素"<<e<<"位于表中位置为:"<<i<<endl;
       system("pause");
       break;
      case 6://清空表
       cout<<"清空表"<<endl;
       L.Clear();
       cout<<"表已清空"<<endl;
       system("pause");
       break;
      case 7://测表空
       i=L.Empty();
       if(i)
        cout<<"表空"<<endl;
       else
        cout<<"表不为空"<<endl;
       system("pause");
       break;
      case 8://测表满
       i=L.Full();
       if(i)
        cout<<"表满"<<endl;
       else
        cout<<"表不满"<<endl;
       system("pause");
       break;
      case 9://测表长
       i=L.Length();
       cout<<"表长为:"<<i<<endl;
       system("pause");
       break;
      case 10://输出表元素
       L.ListDisp();
       system("pause");
       cout<<endl;
       break;
      case 11://退出
       break;
      default://非法选择
       cout<<"非法选择 ";
       break;
      }
     }while(choice!=11);
      return 0;
    }//end of main

  • 相关阅读:
    python 中多个装饰器的执行顺序:
    Python基础思维导图
    怎样写出靠谱的RESUTful API接口?
    python中yield()的用法详解
    Flask思维导图
    Django的设计模式
    MySQL
    MySQL
    Linux
    zsh oh-my-zsh 插件推荐
  • 原文地址:https://www.cnblogs.com/lynnycy/p/3405559.html
Copyright © 2011-2022 走看看