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

一、实验目的

 

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

 

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

 

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

 

二、实验内容

 

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

 

入,删除,查找等功能。编写完整程序实现,程序语言不限定,使用技术形式不定。2、实际问题的解决(*)

使用顺序表来实现约瑟夫环问题。

 

三、实验步骤

 

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

 

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

 

3、完整程序;

 

4、总结、运行结果和分析。

 

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

 

四、实验要求

 

1、按照数据结构实验任务书,提前做好实验预习与准备工作。

 

2、加“*”为选做题。做好可加分。

 

3、严格按照数据结构实验报告模板和规范,及时完成实验报告。

 

4、在个人主页上发文章


五、实验算法实现

1,定义模板类SeqLIst

class SeqList
{
public:
SeqList(){length=0;}//无参构造函数,建立一个空表 
SeqList(int a[],int n);//有参构造函数 
~SeqList(){}//析构函数 
void Insert(int i,int x);//在线性表第i个位置插入值为x的元素 
int Delete(int i);//删除线性表的第i个元素 
int Locate(int x);//求线性表中值为x的元素序号 
void PrintList();//按照序号依次输出各元素 
private:
int data[MaxSize];//存放数组元素的数组 
int length;//线性表的长度 
};


(2)构造函数:无参构造函数建立一个空表,并给length赋值0;有参构造函数建立一个长度为n的顺序表,给length赋值

n;并把给定的数组元素作为顺序表的元素传入顺序表中。


(3)获取线性表的长度:成员函数返回length的值。


(4)按序号查找元素:查找顺序表的第i个元素只需返回类中数组下标为(i-1)的元素,注意查找位置要在顺序表序号范

围内,否则抛出异常。


(5)插入元素:若表满了或元素插入位置不在范围之内则抛出异常。插入时,将最后一个元素到第i个元素依次往后移一个

位置,再把x插入第i个位置;最后顺序表的长度加1。


(6)删除元素:若表是空表或删除元素位置不在范围之内则抛出异常。删除时把第i+1个元素到最后一个元素依次往前移一

个位置,最后线性表的长度-1。


(7)遍历顺序表:依次打印线性表的数据元素。



六、实验代码

  snippet_file_0.txt  116行  C++
Raw
   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  31
  32
  33
  34
  35
  36
  37
  38
  39
  40
  41
  42
  43
  44
  45
  46
  47
  48
  49
  50
  51
  52
  53
  54
  55
  56
  57
  58
  59
  60
  61
  62
  63
  64
  65
  66
  67
  68
  69
  70
  71
  72
  73
  74
  75
  76
  77
  78
  79
  80
  81
  82
  83
  84
  85
  86
  87
  88
  89
  90
  91
  92
  93
  94
  95
  96
  97
  98
  99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
         
         
#include<iostream>
using namespace std ;
const int MaxSize = 10 ;
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 ; //线性表的长度
};
//#include <iostream>
//using namespace std;
//#include"SeqList.h"
//顺序表有参构造函数SeqList SeqList
template < class DataType >
SeqList < DataType >:: SeqList ( DataType a [], int n )
{
if ( n > MaxSize ) throw "error" ;
for ( int i = 0 ; i < n ; i ++ )
data [ i ] = a [ i ];
length = n ;
}

//顺序表按值查找算法Get
template < class DataType >
DataType SeqList < DataType >:: Get ( int i )
{
if ( i < 1 && i > length ) throw "查找位置非法" ;
else return data [ i - 1 ];
}
//顺序表按位查找算法Locate//记得删除掉这些算法
template < class DataType >
int SeqList < DataType >:: Locate ( DataType x )
{
for ( int i = 0 ; i < length ; i ++ )
if ( data [ i ] == x ) return i + 1 ; //下表为1的元素等于i,返回其序号i+1;
return 0 ; //退出循环,说明查找失败
}
//顺序表插入算法Insert
template < class DataType >
void SeqList < DataType >:: Insert ( int i , DataType 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 ++ ;
}
//顺序表删除算法Delete
template < class DataType >
DataType SeqList < DataType >:: Delete ( int i )
{
if ( length == 0 ) throw "下溢" ;
if ( i < 1 || i > length ) throw "查找位置非法" ;
DataType x = data [ i - 1 ]; //取出位置i的元素
for ( int j = i ; j < length ; j ++ )
data [ j - 1 ] = data [ j ]; //此处j已经是元素所在的数组下标
length -- ;
return x ;
}
//顺序表遍历算法PrintLIst
template < class DataType >
void SeqList < DataType >:: PrintList ()
{
for ( int i = 0 ; i < length ; i ++ )
cout << data [ i ]; //依次输出线性表的元素值
}


/* run this program using the console pauser or add your own getch, system("pause") or input loop */
#include<iostream>
using namespace std ;

int main ()
{
int score [ 5 ] = { 1 , 2 , 3 , 4 , 5 };
SeqList < int > ScoreList ( score , 5 );
cout << "执行插入操作前的数据为:" << endl ;
ScoreList . PrintList ();
try
{
ScoreList . Insert ( 2 , 63 );
}
catch ( char * s )
{
cout << s << endl ;
}
cout << '\n' << "执行插入操作后的数据为:" << endl ;
ScoreList . PrintList ();
cout << '\n' << "值为3 的元素位置为:" << endl ;
cout << '\n' << ScoreList . Locate ( 63 ) << endl ;
cout << '\n' << "执行删除第1个元素操作,删除前数据为:" << endl ;
ScoreList . PrintList ();
try
{
ScoreList . Delete ( 1 );
}
catch ( char * s )
{
cout << '\n' << s << endl ;
}
cout << '\n' << "删除后的数据为:" << endl ;
ScoreList . PrintList ();
}


七、程序运行结果





八、实验总结与心得

通过这次的实验,我逐渐了解并熟悉了线性表的顺序存储结构的基本操作。同时,在数据结构实验中用到了C++的模板,让我明白了“温故而知新“。实验中遇到的困难,通过查找书本和询问同学从而解决了,在调试代码的过程中也变得越来越有耐心了。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值