基於C 學資料結構

2021-10-08 23:10:12 字數 4499 閱讀 5540

資料結構是相互之間存在一種或多種特定關係的資料元素的集合。

資料元素:是組成資料的,有一定意義的基本單位,又叫做記錄。(坦克物件)

資料項:資料元素由多個資料項組成,是不可分割的最小單位。(坦克x,y,速度)

邏輯結構

資料元素之間的邏輯關係稱為資料的邏輯結構。

集合結構:資料元素除了同屬於乙個集合外,它們之間沒有其他關係;

線性結構:資料元素之間是一對一的關係;

樹形結構:資料元素之間存在一種一對多的層次關係;

圖形結構:資料是多對多的關係;

物理結構

資料結構在計算機中的表示(又稱映像)稱為資料的物理結構,或稱儲存結構。

順序儲存結構:把邏輯上相鄰的元素儲存在物理位置相鄰的儲存單元中;

鏈式儲存結構:把資料元素放到任意儲存單元裡,這組儲存單元可以是連續的,也可以是不連續的;

演算法具有五個基本特性:輸入、輸出、有窮性、確定性和可行性;

使用大寫o()來體現演算法時間複雜度的記法,稱之為大o記法。 隨著n的增大,t(n)增長最慢的演算法為最優演算法;

常見的時間複雜度

o(1) 常數階

o(n) 線性階

o(n^2) 平方階

o(logn) 對數階

o(nlogn)nlogn階

o(n^3) 立方階

o(2^n) 指數階

所耗費的時間從小到大分別是

o(1)< o(logn)< o(nlogn)< o(n^2) < o(n^3)< o(2^n)
推導大0階要遵循以下原則:

a.用常數1取代執行時間中的所有加法常數

b.在修改後的執行次數函式「f(n)」中,只保留最高端;

c.如果最高端先存在且不是1,則去除與這個專案相乘的常數

4、線性表(list)

概念:零個或多個資料元素的有限序列稱為線性表;例如乙個字串就是乙個線性表,乙個結構體陣列也是乙個線性表;

4.1 抽象資料型別

adt 線性表(list)

data

資料物件:線性表的資料物件集合為,每個元素型別均為datatype。

資料關係:除第乙個元素푎_1外,每乙個元素有且只有乙個直接前驅元素,

除了最後乙個元素푎_푛外,每個元素有且只有乙個直接後繼元素,資料元素之間的關係是一對一的關係。

operation

4.2 線性表 - 順序儲存**參考

三個檔案,main.cpp作用為主函式入口檔案,myarray.h作用為宣告類和物件,myarray.cpp作用為建立物件,呼叫myarray.h類的帶實參的建構函式。

main.cpp

#include "stdafx.h"

#include "myarray.h"

#include using std::cout;

using std::endl;

using namespace cmyarray_t_space;

using namespace cmyarray_space;

int main()

myarray.cpp

#include "stdafx.h"

#include "myarray.h"

using namespace cmyarray_space;

cmyarray::cmyarray()

cmyarray::~cmyarray()

/************************************

* access:public

* 函式功能: 構造乙個線性表

* * 引數列表:

* int size: [in] 線性表的初始大小

*

* 返回值:status

* *************************************/

status cmyarray::initarray(int size /*= 10*/)

//2.檢查是否傳入了正確引數

if (size<=0)

//3.實現本函式的功能

// 構造乙個空的線性表

m_parrhead = new elementtype[size];

m_ncurrnum = 0;

m_ncurrsize = size;

return result_true;

}/************************************

* access:public

* * 引數列表:

* elementtype e: [in] 被插入的新值

* int i: [in] 插入的位置(在此位置之前插入)

*

* 返回值:status

* *************************************/

status cmyarray::insertarray(elementtype e,int i)

//2.檢查是否傳入了正確引數

// 2.1 處理引數的特殊值

if (i==-1)

// 2.1 檢查引數是否有效

if (i<0||i>m_ncurrnum)

//3.實現本函式的功能

檢視容量是否已滿

if (m_ncurrnum == m_ncurrsize)

} 插入元素

.1 把i位置以及其後面的元素都往後面移動一下

for (int j = m_ncurrnum - 1; j>=i ;j--)

.2 把新元素插在i位置上

m_parrhead[i] = e;

m_ncurrnum++;

return result_true;

}/************************************

* access:public

* 函式功能: 刪除l的第i個資料元素,並用e返回其值,l的長度減1

* * 引數列表:

* int i:[in] 刪除元素的位置

* elementtype & e: [out]被刪除元素的值

*

* 返回值:status

* *************************************/

status cmyarray::deletearray(elementtype &e,int i)

//2.檢查是否傳入了正確引數

// 2.1 處理引數的特殊值

if (i==-1)

// 2.1 檢查引數是否有效

if (i<0 || i>= m_ncurrnum)

//3.實現本函式的功能

//刪除l的第i個資料元素,並用e返回其值,l的長度減1

獲取返回值

e = m_parrhead[i];

把第i個元素後面的所有元素都往前面移動一下

for (int j = i; j < m_ncurrnum-1; j++)

更新資料成員

m_ncurrnum--;

return result_true;

}/************************************

* access:public

* 函式功能: 將線性表重置為空表

* * 引數列表:

*

* 返回值:status

* *************************************/

status cmyarray::cleararray()

m_ncurrnum = 0;

m_ncurrsize = 0;

m_parrhead = nullptr;

return result_true;

}//擴大陣列的容量

status cmyarray::expandspace()

catch (...)

//2. 原來的賦值到新空間

memcpy_s(temp, m_ncurrsize*sizeof(elementtype),

m_parrhead, m_ncurrsize*sizeof(elementtype));

//3. 釋放原來的控制項

deletem_parrhead;

//4. 更新資料成員

m_parrhead = temp;

m_ncurrsize = 2 * m_ncurrsize;

return result_true;}  

myarray.h

#define elementtype int

namespace cmyarray_space ;

class cmyarray

;}

常用資料結構總結(基於C )

目錄 棧 stack 簡介 宣告基本操作 示例 佇列 queue 簡介 宣告基本操作 示例 優先佇列 priority queue 簡介 宣告基本操作 調整輸出次序 二叉搜尋樹 簡介 基本概念 c 的stl中基於二叉搜尋樹有資料結構set和map 1.set 常用操作 2.map 宣告 常用操作 示...

集合 基礎資料結構 基於C

include include intfun int a,int m 判斷元素是否在集合裡 在返回1 不在返回0 void get int m 輸入集合元素 while m i 1 0 void print int m 列印集合 printf n void clear int m 集合清零 whil...

學資料結構堆襸 學資料結構有多痛苦?

同為女生,感覺資料結構算還好,理由大概是因為堅信它有用吧 畢竟當自己排序不再只會冒泡 存資料不再只會陣列的時候還是蠻爽的。除了個人肉眼可見的提公升這一正向激勵外,上課老師也經常強調實用性 效率 走上崗位企業要的是什麼,應用性極強讓我數構課偶爾困得半死也不敢像高數一樣直接睡覺 反而有種想學好的使命感 ...