实验一报告

来源:互联网 发布:unity3d手机游戏大全 编辑:程序博客网 时间:2024/06/05 00:29

   实验一线性表的基本操作实现及其应用

 一、实验目的

       1、熟练掌握线性表的结构特点,掌握顺序表的基本操作。

       2、巩固 C++相关的程序设计方法与技术。

       3、学会使用顺序表解决实际问题。

 二、实验内容

      1、顺序表的建立与操作实现

       建立 n 个元素的顺序表(n 的大小和表里数据自己确定),实现相关的操作:输出,插

入,删除,查找等功能。编写完整程序实现,程序语言不限定,使用技术形式不定。

 三、实验步骤

     1、依据实验内容分别说明实验程序中用到的数据类型的定义;

     2、相关操作的算法表达;

查找操作:

(1)按位查找

    顺序表中第i个元素存储在数组中下标为i-1的位置上,所以返回数组下标为i-1 的元素即可

实现按位查找,按位查找的时间复杂度为O(1)。

(2)按值查找

   对顺序表的元素依次进行比较,如果成功,则返回元素的序号,若不成功,则返回查找失败的标志“0”,按值查找的时间复杂度为O(n)。

插入操作:

  在表中第i个位置插入一个新元素,将最后元素直至第i个元素分别向后移动一个位置,将要插入的元素x插入位置i处,并将表长+1。如果表满了,则抛出上溢异常;若插入位置不合理,则抛出位置异常。

删除操作:

   将表中的第i个元素,在移动前先将此元素取出,将下标为i,i+1...n-1处的元素分别移到下标为i-1,i...n-2处,表长减1,返回被删元素值。如果表空,则下溢异常,若元素被删元素不合理,则会引发删除位置异常。

     3、完整程序;

源程序代码:

   

#include <iostream>

using namespace std;

const int MaxSize=100;

template <class DataType>    // 定义模板类SeqList

class SeqList

{

 public:

  SeqList(){length=0;}           //无参构造函数,建立一个空的顺序表  

  SeqList(DataType a[],int n);   //有参构造函数,建立一个长度为n的顺序表

 ~SeqList(){}                  //析构函数

    int Length (){return length;}  //求线性表的长度

    DataType Get(int i);           //按位查找,在线性表中查找第i个元素

    int Locate(DataType x);        //按值查找,在线性表查找值为x的元素符号

    void Insert(int i,DataType x); //插入,在线性表中第i个位置插入值为x的元素

    DataType Delete(int i);        //删除,删除线性表的第i个元素

void PrintList();              //遍历操作,按序依次输出各元素

 private:

  DataType data[MaxSize];        //存放数据元素的数组

  int length;                    //线性表的长度

};

template <class DataType>

SeqList<DataType>::SeqList(DataType a[],int n)

   {

    DataType i;

   if(n>MaxSize)throw"参数非法";

   for(i=0;i<n;i++)

   data[i]=a[i];

   length=n;

   }

 

template <class DataType>

DataType SeqList<DataType>::Get(int i)

    {

if(i<1 && i>length)  throw"查找位置非法";

else return data[i-1];

    }

    

 template <class DataType>   

 int SeqList<DataType>::Locate(DataType x)

    {

     DataType i;

  for(i=0;i<length;i++)

  if(data[i]==x) return i+1;

  return 0;

    }   

 

template <class DataType>    

void SeqList<DataType>::Insert(int i,DataType x)

    {

     DataType j;

     if(length>=MaxSize)throw"上溢";

     if(i<1||i>length+1)throw"位置";

     for(j=length;j>=i;j--)

      data[j]=data[j-1];     //j个元素存在于数组下标为j-1

      data[i-1]=x;

      length++;

    }

 

template <class DataType>

DataType SeqList<DataType>::Delete(int i)

    {

     DataType x,j;

     if(length==0)throw"下溢";

     if(i<1||i>length)throw"位置";

     x=data[i-1];

     for(j=i;j<length;j++)

     data[j-1]=data[j];

     length--;

     return x;

    }

 

 

 

template <class DataType>

void SeqList<DataType>::PrintList()

    {

     DataType i;

     for(i=0;i<length;i++)

     cout<<data[i];

    }

    

    

int main()

{

 

cout<<endl<<"\t\t\t\t\t**********顺序表的实现(模板类)**********"<<endl<<endl;

cout<<"\t\t\t\t\t *             1——按位查找            *"<<endl;

cout<<"\t\t\t\t\t *             2——按值查找            *"<<endl;

cout<<"\t\t\t\t\t *             3——插入                *"<<endl;

cout<<"\t\t\t\t\t *             4——删除                *"<<endl;

cout<<"\t\t\t\t\t *             5——输出顺序表          *"<<endl;

cout<<"\t\t\t\t\t *             6——输出表长            *"<<endl;

cout<<"\t\t\t\t\t *             7——退出                *"<<endl;

 

   int arr[]={87,77,90,68,98,80};

   int flag,ins_loc,x,tab,len;

   flag=0;

   SeqList<int>List(arr,6);

   while(flag==0)

   {

  

   cout<<endl<<"输入编号:"<<endl;

   cin>>tab;

   switch(tab)

   {

   case 1:{cout<<endl<<"输入元素位置:"<<endl;

           cin>>ins_loc;

           x=List.Get(ins_loc);

           cout<<endl<<"查找的数是:"<<x<<endl;

             break;

          }

   case 2:

         {

 cout<<endl<<"输入你想要查找的数:"<<endl;

         cin>>x;

         ins_loc=List.Locate(x);

         cout<<endl<<"这个数所在的位置是:"<<ins_loc<<endl;

            break;

         }

   case 3:

         {

          cout<<endl<<"输入你要插入的数的位置:"<<endl;

          cin>>ins_loc;

          cout<<endl<<"输入你要的插入的数:"<<endl;

          cin>>x;

          List.Insert(ins_loc,x);

             break;

         }

   case 4:

         {

          cout<<endl<<"输入你要删除的位置 :"<<endl;

          cin>>ins_loc;

          cout<<List.Delete(ins_loc);

             break;

         }

   case 5:

         {

          List.PrintList();

          break;

      }

   case 6:

         {

          len=List.Length();

          cout<<endl<<"the length is:"<<len<<endl;

            break;

 }  

   

   case 7:

    {

       flag=1;

  break;

    }

   default:

    {

    cout<<"the command is not found!"<<endl;

    break;

    }

   }

}

return 0;

}


4、运行结果和分析。

(1)主界面:

(2)输出顺序表,输出表长,退出


(3)按位查找及按值查找


(4)插入,并输出插入成功的顺序表


(5)删除操作,并输出删除成功的顺序表



     5、总体收获和不足,疑问等。

     这个实验我使用了C++模板类来实现顺序表的基本操作,通过这个实验,我初步掌握了顺序表的建立及基本操作的知识,但在实验过程也发现了自己的许多不足之处,比如虽然使用模板类来进行实验,但由于模板类的知识是上学期学的,没有及时进行复习,导致在类模板的定义时使用类型参数出错,删除和插入操作无法运行。通过这个实验,我认识到在进行学习新知识时,也要及时进行旧知识的复习。