数据结构与算法分析(c++版) #3 顺序表的实现

顺序表
       顺序表是在计算机内存中以 数组 形式保存的线性表,是指用一组地址连续的 存储单元 依次存储 数据元素 的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
       下面是顺序表的实现:

template <class Elem>
class AList : public List<Elem>
{
private:
	Elem* listArray;	//容纳元素的数组
	int maxSize;	//顺序表允许存放元素的最大值
	int fence;	//栅栏的位置
	int listSize;	//顺序表当前元素的个数
	enum { DefaultListSize = 500 };	//顺序表默认最大值
public:	
//  构造函数:初始化成员变量 
	AList(int size=DefaultListSize)		
	{
		maxSize = size;		 
		listSize = fence = 0;
		listArray = new Elem[maxSize];
	}
//  折构函数:释放堆内存 	
	~AList() { delete [] listArray; }	

	void clear()	//清空顺序表 
	{
		delete [] listArray; 	 
		listSize = fence = 0;
		listArray = new Elem[maxSize];
	}
//  向右表表头插入元素 	
	bool insert(const Elem&);	
//  向右表表尾拼接元素
	bool append(const Elem&);	 
//  删除右表表头的元素,并返回 
	bool remove(Elem&);		
//  设置栅栏位置为顺序表的第一个元素之前 	
	void setStart() { fence = 0; } 	
//  设置栅栏位置为顺序表的最后一个元素之后	
	void setEnd() { fence = listSize; }	
//  栅栏向左移动一个单位	
	void prev() { if(fence != 0) --fence; }	
//  栅栏向右移动一个单位	
	void next() { if(fence < maxSize) ++fence; }	
//  返回左表长度	
	int leftLength() const { return fence; }
//  返回右表长度	
	int rightLength() const { return listSize - fence; }	
//  设置栅栏的位置 	
	bool setPos(int pos) 	
	{
		if(pos>=0 && pos<=listSize) 
		{
			fence = pos;
			return true;
		}
		return false;
	} 
//  获取右表表头元素的值,若右表为空返回false	
	bool getValue(Elem & it) const	 
	{
		if(rightLength() == 0)
			return false;
		it = listArray[fence];
		return true;
	}
//  输出顺序表	
	void print() const
	{
		int temp = 0;
		cout << "< ";
		while(temp < fence)		// 输出左表 
			cout << listArray[temp++] << " ";
		cout << "| ";
		while(temp < listSize)	//输出右表 
			cout << listArray[temp++] << " ";
		cout << ">\n"; 
	} 
};

//  向右表表头插入元素 	
template <class Elem> 
bool AList<Elem>::insert(const Elem& item) 
{
	if(listSize == maxSize)
		return false;
	// 向后移动右表 
	for(int i=listSize; i>fence; --i)
		listArray[i] = listArray[i-1];
	listArray[fence] = item;
	++listSize;
	return true; 
	
}
//  向右表表尾拼接元素
template <class Elem> 
bool AList<Elem>::append(const Elem& item)	 
{
	if(listSize == maxSize)
		return false;
	listArray[listSize++] = item;
	return false;
}
//  删除右表表头的元素,并返回值 
template <class Elem> 
bool AList<Elem>::remove(Elem& item)
{
	// 右表为空 
	if(rightLength() == 0)
		return false;
	item = listArray[fence];
	// 向前移动右表 
	for(int i=fence; i<listSize-1; ++i)
		listArray[i] = listArray[i+1];
	--listSize;
	return true; 
}
        顺序表继承了抽象类List,因此它实现List的所有成员函数。
      
       类AList把表中的元素储存在数组中的相邻位置上。数组的位置与元素的位置相对应。换句话说,就是表中的第 i 个元素存储在数组第 i 的个单元中。表头总是在第0个位置,这使得很容易便可对表中任意一个元素进行随机访问。个提出表中的某个位置,该位置对应袁术的值就可以直接获取。因此setPos函数和getValue函数访问任意元素只需花费θ(1)时间。
       此外,append函数也只需花费θ(1)时间,但是,insert函数和remove函数,这样在表中添加或者删除一个元素,必须将该元素后面的元素移动一个位置。如果表中已有n个元素,那么这个过程需要花费θ(n)时间。而如果在n个元素的表中的第i个位置插入元素,那么n-i个元素需要往后移动;删除则要n-i-1个元素往前移动。平均来说,插入和删除要移动一半元素,即需要花费θ(n)时间。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《数据结构算法与应用C语言描述PDF》是一本关于数据结构和算法在C语言中的实现和应用的电子书。这本书主要介绍了各种数据结构和算法在C语言中的实现方式以及它们在实际应用中的使用。 首先,这本书详细介绍了常见的数据结构,如数组、链表、栈、队列、树和图等。对于每种数据结构,书中提供了相应的C语言实现代码,帮助读者理解数据结构的基本原理和操作。同时,书中还介绍了每种数据结构的优缺点以及适用的场景,使读者能够更好地选择合适的数据结构来解决实际问题。 其次,这本书还介绍了常用的算法,如排序、查找、图算法等。为了方便读者理解和学习,每个算法都给出了C语言实现代码,并对算法的原理和复杂度进行了详细解释。此外,书中还介绍了一些基本的算法设计思想,如贪心算法、分治算法和动态规划等,帮助读者更好地理解和应用算法。 最后,这本书还通过一些实际应用案例展示了数据结构和算法在实际开发中的应用。这些案例包括文本编辑器、文件系统和数据库等,通过应用这些案例可以帮助读者更好地理解和应用数据结构和算法。 总之,《数据结构算法与应用C语言描述PDF》是一本很好的学习资源,它通过给出C语言的实现代码和实际应用案例,帮助读者学习和理解数据结构和算法的核心概念和应用方法,对于提高编程能力和解决实际问题有很大帮助。 ### 回答2: 《数据结构算法与应用C语言描述PDF》是一本介绍数据结构与算法在C语言中应用的书籍。这本书主要内容包括数据结构的基本概念、算法的设计与分析以及在C语言中的具体实现。 首先,书中详细介绍了数据结构的基本概念,包括线性表、栈、队列、链表、树、图等常见的数据结构。对于每种数据结构,书中给出了其定义、特征以及常用操作的实现方法,并且通过示例代码加以说明,使读者能够更好地理解和掌握这些数据结构的特点和使用方法。 其次,书中介绍了算法的基本概念和常用的算法设计方法,如分治法、贪心法、动态规划等。对于每种算法设计方法,书中给出了其基本思想、步骤和实现过程,并通过一些经典算法问题的解决实例,将理论知识与实际问题结合起来,帮助读者更好地理解和运用这些算法。 此外,书中还涉及了一些常用的排序算法、查找算法以及图算法等内容。对于排序算法,书中给出了冒泡排序、插入排序、选择排序、快速排序等常见的算法及其实现代码;对于查找算法,书中介绍了顺序查找、二分查找等常用的算法及其实现方法;对于图算法,书中介绍了深度优先搜索、广度优先搜索以及最短路径算法等重要的图算法,并给出了相应的代码实现。 总之,《数据结构算法与应用C语言描述PDF》一书全面介绍了数据结构与算法在C语言中的应用,通过具体的实例和代码实现,帮助读者深入理解和掌握这些知识,并能够将其应用于实际问题的解决中。这本书对于计算机科学与技术专业的学生以及从事相关工作的人员都是一本很好的参考书籍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值