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

来源:互联网 发布:windows redis集群搭建 编辑:程序博客网 时间:2024/05/01 16:26

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

一、实验目的

1、熟练掌握线性表的结构特点,掌握顺序表的基本操作。 
2、巩固 C++相关的程序设计方法与技术。 
3、学会使用顺序表解决实际问题。 

二、实验内容

1、顺序表的建立与操作实现 
      建立n个元素的顺序表(n 的大小和表里数据自己确定),实现相关的操作:输出,插入,删除,查找等功能。编写完整程序实现,程序语言不限定,使用技术形式不定。 
2、实际问题的解决(*) 使用顺序表来实现约瑟夫环问题。 

三、实验步骤

1、算法设计

(1)查找:
按位查找:
1.如果查找位置不合理,则抛出查找位置非法;
2.返回数组下标为i-1的数据元素值;
按值查找:
1.从第一位开始依次查找与x值相同的数据元素;
2.返回该下标为i的元素的序号i+1;
(2)插入:
1.如果表满了,则抛出上溢异常;
2.如果元素的插入位置不合理,则抛出位置异常;
3.将最后一个元素直至第i个元素分别向后移动一个位置;
4.将元素x填入位置i处;
5.表长加1;
(3)删除:
1.如果表空,则抛出下溢异常;
2.如果删除位置不合理,则抛出删除位置异常;
3.取出被删元素;
4.将下标为i,i+1,…,n-1处的元素分别移到下标i-1,i,…,n-2处;
5.表长减1,返回被删元素值;
(4)遍历:
按下标依次输出各元素。

2、源代码

采用C++的模版机制,以便适用于不同类型的数据。
#include <iostream>using namespace std;const int MaxSize=100;template <class DataType> class SeqList{public:SeqList(){length=0;}SeqList(DataType a[],int n);//建立一个长度为n的顺序表 ~SeqList(){}//int Length(){return length;}//求长度 DataType Get(int i); //按位查找 int Locate(DataType x);//按值查找 void Insert(int i,DataType x);//插入 DataType Delete(int i);//删除 void PrintList();//遍历 private:DataType data[MaxSize];//存放数据元素 int length;}; template <class DataType> SeqList<DataType>::SeqList(DataType a[],int n){if(n>MaxSize) throw"参数非法";for(int 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)//按值查找,返回位 {for(int 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)//在第i个位置插入元素x {if(length>=MaxSize) throw"上溢";if(i<1||i>length+1) throw"位置异常";for(int 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)//删除 {if(length==0) throw"下溢";if(i<1||i>length) throw"位置异常";DataType x=data[i-1];//先取后进 for(int j=i;j<length;j++) data[j-1]=data[j];length--;return x; } template <class DataType> void SeqList<DataType>::PrintList()//遍历 {for(int i=0;i<length;i++)cout<<data[i]<<" ";cout<<endl;}int main(){int a[]={1,2,3,4,5,6,7};SeqList<int> Seq(a,10);//创建对象  构造函数初始化 Seq.PrintList();//输出表中数据元素 Seq.Insert(5,0);cout<<"在位置5插入数据元素0  :";Seq.PrintList();cout<<"位置7的数据元素为:"<<Seq.Get(7)<<endl;Seq.Delete(7);cout<<"删除位置7的数据元素  :";Seq.PrintList();cout<<"数据元素7的位置为:"<<Seq.Locate(7)<<endl;/*char数据测试char a[]={'a','b','c','d','e','f','g'};SeqList<char> Seq(a,8); Seq.PrintList(); Seq.Insert(5,'0');cout<<"在位置5插入数据元素0  :";Seq.PrintList();cout<<"位置7的数据元素为:"<<Seq.Get(7)<<endl;Seq.Delete(7);cout<<"删除位置7的数据元素  :";Seq.PrintList();cout<<"数据元素d的位置为:"<<Seq.Locate('d')<<endl; */}

3、运行结果

(1)整型数据测试  
          整型图
(2)字符型数据测试
         字符图

四、总结

      在完成实验的过程中发现对于上学期所学的C++不够熟练,偶尔需要重新翻阅课本,通过这次实验重新巩固了一下C++的使用,尤其是类与模版的内容。实验重点在于顺序表的基本操作实现及其应用,通过实验对它的原理以及实现有了更加真切直观的体会,理解不再浮于表面。但是对于线性表的更多用途仍然需要亲自尝试与更多的实践。