在之前了解完什么是数据结构之后
我们再来看看数据结构中一种常用的数据结构
线性结构
——————————————下面是正文————————————————
一.线性表定义
作为数据结构中最为简单也很常用的一种结构,线性表不出意外应该是入门级的一种存储结构了,线性表由相同的数据类型按照顺序进行存储的一种线性结构,线性表是实现形式主要分为顺序表(数组)和链表。其中顺序表顾名思义就是地址是连续储存的,而链表的地址则不是连续的,是通过指针将各个地址连接起来。
顺序表的连续储存方式
链表的连续储存方式
二.顺序表
对于抽象数据类型来说,每一种数据结构都有自己的数据集以及操作集,而顺序表的数据集当然是数组的储存方式啦,而操作集因各人对于数据集的操作不一致,下面提供一些最基本的操作集:
数据集:
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}