回顾数据结构---------------顺序表的实现

    学完数据结构一个学期了,很久没写几乎全都忘了。最近抽点时间把学过的东西都给回顾一下。

    首先是顺序表。即用数组实现的线性结构。这里用的是C++实现,感觉要比C好点,封装成了一个类。使用了类模板,所以只需要在创建类对象的时候将模板的类型写出来就行,不用做过多的修改。我只是简单地在main函数里测试了一下,数值都是给定的,其实这些可以通过控制台手动输入,实现也不会很难。

     没有任何问题。直接贴上代码

/*
 * 顺序表的实现 
*/

#include<iostream>

using namespace std;

const int MaxSize = 100;   //定义数组长度100

template <class DataType>  // 定义模板类SeqList
class SeqList
{
	public:
		
		SeqList()   //无参的构造函数,构造一个空的顺序表 
		{
			length = 0;
		} 
	
		SeqList(DataType a[],int n);  //有参构造函数,建立一个长度为n的顺序表
	
		~SeqList(){}; //析构函数为空。因为没有使用到指针,不需要释放资源 
	
		int Getlength()     //求线性表的长度 
		{
			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)
{
	if(n > MaxSize)     //判断是不是溢出 
		throw "参数非法";
	else
		length = n;
	for(int i = 0;i < n;i++)
	{
		data[i] = a[i]; 
	}
} 

template <class DataType> 
DataType SeqList<DataType>::Get(int i )
{
	if(i < 1 || i > length)
		throw "查找位置非法";
		
	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)
{
	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位置  循环将所有数据往后移动一位,空出一个位置给x 
	}
	data[i-1] = x;  //插入x 
	length++;  //长度+1 
}

template <class DataType> 
DataType SeqList<DataType>::Delete(int i )
{
	DataType x;
	if(length == 0) throw "下溢";
	if(i <1 || i > length) throw "位置不正确";
	
	x = data[i-1];
	for(int j = i; j < length;j++)
		data[j-1] = data[j];   //循环将数据左移一位,覆盖掉第i个值
	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 n = 10;
	char a[10] = {'a','b','c','d','e','f','g','h','i','j'};

    //创建对象--这里把DataType实例为char类型 
	SeqList<char> sq(a,n);
	//输出长度 
	cout<<sq.Getlength()<<endl;
	
	cout<<"第5个值为:"<<sq.Get(5)<<endl;
	
	cout<<"插入之前的顺序表"<<endl;
	sq.PrintList();
	
	//插入 
	sq.Insert(7,'t');
	//删除第三个数据 
	cout<<"删除了的值是:"<<sq.Delete(3)<<endl;
	
	cout<<"插入和删除之后的顺序表:"<<endl;
	sq.PrintList();
	
	cout<<"值为g的数据所在的下标是:"<<sq.Locate('g')<<endl; 
}

亲测结果如下


在写的过程中我突然想到,线性表类还能再添加另外一些功能,比如将线性表反转一下?

还有一个问题是:当按值查找的时候按上边给出的代码只会返回第一次出现x值的下标,那如果是有多个呢?怎么解决?这个就看具体的需求来修改代码了。

猜你喜欢

转载自blog.csdn.net/wanmingJKing/article/details/80681340