在之前瞭解完什麼是數據結構之後
我們再來看看數據結構中一種常用的數據結構
線性結構
——————————————下面是正文————————————————
一.線性表定義
作爲數據結構中最爲簡單也很常用的一種結構,線性表不出意外應該是入門級的一種存儲結構了,線性表由相同的數據類型按照順序進行存儲的一種線性結構,線性表是實現形式主要分爲順序表(數組)和鏈表。其中順序表顧名思義就是地址是連續儲存的,而鏈表的地址則不是連續的,是通過指針將各個地址連接起來。
順序表的連續儲存方式
鏈表的連續儲存方式
二.順序表
對於抽象數據類型來說,每一種數據結構都有自己的數據集以及操作集,而順序表的數據集當然是數組的儲存方式啦,而操作集因各人對於數據集的操作不一致,下面提供一些最基本的操作集:
數據集:
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}