【数据结构】线性表——顺序表(数组)

在之前了解完什么是数据结构之后

【数据结构】如何高贵优雅地理解什么是数据结构?

我们再来看看数据结构中一种常用的数据结构

线性结构

——————————————下面是正文————————————————

一.线性表定义

       作为数据结构中最为简单也很常用的一种结构,线性表不出意外应该是入门级的一种存储结构了,线性表由相同的数据类型按照顺序进行存储的一种线性结构,线性表是实现形式主要分为顺序表(数组)链表。其中顺序表顾名思义就是地址是连续储存的,而链表的地址则不是连续的,是通过指针将各个地址连接起来。 

                           

                                                                      顺序表的连续储存方式

                         

                                                                          链表的连续储存方式

二.顺序表

       对于抽象数据类型来说,每一种数据结构都有自己的数据集以及操作集,而顺序表的数据集当然是数组的储存方式啦,而操作集因各人对于数据集的操作不一致,下面提供一些最基本的操作集:

数据集:

template <class Array_List>
class Array
{
public:
	Array();//没有指定内存长度,预设为(Array_List*100)字节
	Array(Array_List List_Length);//指定内存长度
	~Array();

操作集:

public:
        void Add_Array(Array_List array[], int n);//添加数组到申请的内存中
	void FindPosition(Array_List value);//寻找数组中某个元素的位置
	void FindValue(Array_List temp);//寻找指定数组中某个位置的值 
	void Insert_Position(Array_List value,Array_List position);//插入一个值,判断是否超过了申请的内存
	void Insert_Array(Array_List value[], int length, Array_List position);//插入一堆值
	void Delete_Position(Array_List position);//删除某个位置的值
	void Delete_Value(Array_List value);//删除某个指定的值:记录位置,调用上面进行删除
	int Length();//返回数组长度
};

三.代码分析

3.1.数据集:

this->list = new Array_List[SIZE];

      数据集没有什么需要解析的,就是简单的申请一块内存,当然,申请了内存用完之后记得要释放~

3.2.操作集:

3.2.1.往内存里放入数组:

template <class Array_List>
void Array<Array_List>::Add_Array(Array_List array[], int length)
{
	PtrIsNull();
	for (int i = 0; i < length; i++)   *(list+i) = *(array+i);
	this->length = length;
}

     这里需要注意的是当前长度和顺序表长度的区别:在数据集中申请了一块内存,那么这块内存的大小就是顺序表的总长度

                       

     当往这块内存中插入数组数据时,数组的大小就成为了当前长度

                

      在插入数组前还需检查是否已经申请了内存,即查看内存是否为空(PtrIsNull),具体怎么实现就交给你们了~

3.2.2.返回当前长度:

template <class Array_List>
int Array<Array_List>::Length()
{
	return this->length;
}

3.2.3.通过数组中的某个值来查找该值所在位置:

template <class Array_List>
void Array<Array_List>::FindPosition(Array_List value)
{
	int position = 0;

	PtrIsNull();

	while (*list != value && position <= length)
	{
		position++;
		list++;
	}

}

       当然,在查询时需要注意两件事情:1.内存是否为空。 2.查询的值是否存在,这两个检查项均可在开头PtrIsNull函数实现检查,具体实现就靠你啦~

3.2.4.通过数组的位置来查询该位置所储存的值:

template <class Array_List>
void Array<Array_List>::FindValue(Array_List temp)
{
	int position = 0;

	PtrIsNull();
	while (position != temp)
	{
		position++;
		list++;
	}
}

          当然,在查询时需要注意两件事情:1.内存是否为空。 2.查询的位置是否在数组的长度之内

3.2.5.插入值(单个值):

template<class Array_List>
void Array<Array_List>::Insert_Position(Array_List value, Array_List position)
{
	PtrIsNull();
	SizeIsMax();

	for (int i = length; i > position; i--)
		*(list + i) = *(list + i - 1);

	*(list+position)=value;

	length +=1;
}

       插入值需要检查的东西略多,首先要考虑的是插入这些数据之后是否会导致内存溢出等,这些均需要后期慢慢优化,插入值的方法是先把值往后指定的位置进行存储,再将数据插入指定位置:      

                             

3.2.6.插入值(一组数据):

template<class Array_List>
void Array<Array_List>::Insert_Array(Array_List value[],int length,Array_List position)
{
	int size = length;
	PtrIsNull();
	SizeIsMax();

	for (int j = 0; j < size; j++)
		Insert_Position(*(value + j), position+j);
}

3.2.7.根据数组位置删除指定位置的数据:

template <class Array_List>
void Array<Array_List>::Delete_Position(Array_List position)
{
	PtrIsNull();

	for (int i = position; i < length; i++)
		*(list+i) = *(list + i+1);

	length -= 1;
}

        如插入值相反的是,删除值是将后面的值往前移动:

                              

3.2.8.删除某些指定的值:

template <class Array_List>
void Array<Array_List>::Delete_Value(Array_List value)
{
	PtrIsNull();

	for (int i = 0; i < length; i++)
	{
		while (*(list + i) == value)
			Delete_Position(i);
	}

}

         例子:如在内存中传入一个数组a[ ]= {1,2,3,3,4,5,6,3},那么删除数字 “3”之后,将会输出 a[] = {1,2,3,4,6} 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章