【數據結構】線性表——順序表(數組)

在之前瞭解完什麼是數據結構之後

【數據結構】如何高貴優雅地理解什麼是數據結構?

我們再來看看數據結構中一種常用的數據結構

線性結構

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

一.線性表定義

       作爲數據結構中最爲簡單也很常用的一種結構,線性表不出意外應該是入門級的一種存儲結構了,線性表由相同的數據類型按照順序進行存儲的一種線性結構,線性表是實現形式主要分爲順序表(數組)鏈表。其中順序表顧名思義就是地址是連續儲存的,而鏈表的地址則不是連續的,是通過指針將各個地址連接起來。 

                           

                                                                      順序表的連續儲存方式

                         

                                                                          鏈表的連續儲存方式

二.順序表

       對於抽象數據類型來說,每一種數據結構都有自己的數據集以及操作集,而順序表的數據集當然是數組的儲存方式啦,而操作集因各人對於數據集的操作不一致,下面提供一些最基本的操作集:

數據集:

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} 

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