資料結構學習實錄一 靜態鍊錶

2021-08-02 08:00:45 字數 4159 閱讀 5403

首先我們來了解下靜態鍊錶,什麼是靜態鍊錶?我們知道,鍊錶是動態結構,通過指標將資料串聯起來,只要記憶體有空間就可以繼續分配鍊錶,沒有固定的長度限制,是一種非常好用儲存結構,而且從作業系統原理上來說,他可以利用記憶體的碎片化空間,並且更容易找到合適空間分配,減少作業系統對記憶體空閒區域的檢索時間,在一定程度上提高了程式的速度,但是浪費了一定的空間用來存放指標,相對來說,犧牲空間,提公升時間,對於較大記憶體調入來說,這個犧牲還是比較划算的。

那麼什麼是靜態鍊錶?我們指導,跟鍊錶對應的是陣列,在記憶體劃分一段連續空間,用來存放資料。優點是操作簡單,定址快,但缺點同樣要命。首先陣列要求在記憶體劃分連續區域,只能使用較大的連續區域,這樣在一定程度上增加了作業系統的負擔,而且,連續區域不好找啊,劃分連續區域一定程度上就會造成記憶體碎片化,造成資源浪費。再考慮陣列大小固定,擴容很麻煩,所以一般程式設計師會設定乙個較大的空間,以防止記憶體溢位。但是如果使用者使用的資料量較小,就會造成浪費,同時也可能會造成記憶體溢位,導致程式崩潰,也給計算機安全造成危害。不過對於小資料,使用陣列的確是方便快捷。

而我們所討論的靜態鍊錶,簡直就是逆天的存在,將陣列與鍊錶結合起來,各取其缺點……,或許你內心一萬隻草泥馬在呼倫貝爾大草原上狂野奔騰,why ?猴子請來的逗比嗎?事實上,為了使用鍊錶,在一些語言中是不能使用指標或者鍊錶的,而為了使用鍊錶,我們不得不把陣列當鍊錶用。

靜態鍊錶:

1.定義結構體:slinklist

typedef struct slinklist

slinklist;

我們知道,一般鍊錶指向下乙個節點的是指標,這個為什麼是數字?原因是他要記錄下乙個節點在陣列中的位置。並且我們約定,指標位為-2時,代表此位為空,指標位為-1時,代表他是鍊錶末節點。

2.為靜態鍊錶劃分空間

//為靜態鍊錶劃分空間

slinklist *newsl(int n)

return a;

}

3.功能函式 返回靜態鍊錶中的乙個空位位址(以整形數字儲存)

//對靜態鍊錶空位置進行檢索  return n,n為陣列長度,-1為無空位

int nothing_num(slinklist *a, int n)

return -1;

}

4.功能函式 返回靜態鍊錶的末結點

//對靜態鍊錶末節點進行檢索,返回值為-1為檢索失敗

int end_num(slinklist* a, int n)

if (a[0].next == -2) return 0;

return -1;

}

返回值為『-1』時,代表檢索失敗或是鍊錶損壞。

5.功能函式 對靜態鍊錶進行初始或續寫入

//對靜態鍊錶進行寫入或補充寫入

bool write(slinklist* a, int *b, int ns,int nint)

return true;

}

返回值為確定寫入是否成功

6.功能函式 查詢數值為num的節點位置

//查詢數值為num的節點

int ifind(slinklist* a, int n, int num)

return -1;

}

返回值為-1代表查詢失敗

7.功能函式 插入結點 poineer為其前結點位置,num為插入值

//插入結點

bool interposition(slinklist* a, int n, int poineer,int num)

8.功能函式 找到指向結點為no的結點

//找到指向節點no的結點

int jfind(slinklist* a, int n, int no)

return -1;

}

9.功能函式 刪除某一結點

//刪除節點

bool idelete(slinklist* a, int n,int no)

10.測試用主函式

int main()

; bool pd = write(a, b, 20, 10);

int ii = 0;

if (pd == false)

cout << "寫入失敗" << endl;

else

cout << endl;

cout << "測試查詢結點,正確答案為:4 測試結果為" << ifind(a, 20, 5);

cout << endl;

cout << "測試插入函式" << endl;

if (!interposition(a, 20, 2, 11))

cout << "插入失敗" << endl;

else

}cout << endl;

cout << "測試刪除函式" << endl;

if (idelete(a, 20, 10))

}else

cout << "刪除失敗" << endl;

cout << endl;

} system("pause");

return 0;

}

// slinklist.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include"iostream"

using namespace std;

typedef struct slinklist

slinklist;

//生成新的靜態鍊錶

slinklist *newsl(int n)

return a;

}//對靜態鍊錶空位置進行檢索 return n,n為位置,-1為無空位

int nothing_num(slinklist *a, int n)

return -1;

}//對靜態鍊錶末節點進行檢索,返回值為-1為檢索失敗

int end_num(slinklist* a, int n)

for (int i = 0; i < n; i++)

return 0;

}//對靜態鍊錶進行寫入或補充寫入

bool write(slinklist* a, int *b, int ns,int nint)

return true;

}//查詢數值為num的節點

int ifind(slinklist* a, int n, int num)

return -1;

}//插入結點

bool interposition(slinklist* a, int n, int poineer,int num)

//找到指向節點no的結點

int jfind(slinklist* a, int n, int no)

return -1;

}//刪除節點

bool idelete(slinklist* a, int n,int no)

int main()

; bool pd = write(a, b, 20, 10);

int ii = 0;

if (pd == false)

cout << "寫入失敗" << endl;

else

cout << endl;

cout << "測試查詢結點,正確答案為:4 測試結果為" << ifind(a, 20, 5);

cout << endl;

cout << "測試插入函式" << endl;

if (!interposition(a, 20, 2, 11))

cout << "插入失敗" << endl;

else

}cout << endl;

cout << "測試刪除函式" << endl;

if (idelete(a, 20, 10))

}else

cout << "刪除失敗" << endl;

cout << endl;

} system("pause");

return 0;

}

資料結構學習 鍊錶

將從下面4部分進行介紹 首先介紹鍊錶是什麼,然後介紹為什麼定義鍊錶,接著是鍊錶的分類,最後簡單介紹一下鍊錶結點的插入與刪除方法。首先,在介紹鍊錶之前,我們先介紹一下什麼是順序儲存結構。我們知道資料在計算機中的儲存就像貨物在倉庫中的儲存一樣,不但占用一定的空間,還要有乙個標示儲存位置的位址。計算機通過...

資料結構學習 鍊錶

由於不必須按順序儲存,鍊錶在插入的時候可以達到o 1 的複雜度,比另一種線性表順序表快得多,但是查詢乙個節點或者訪問特定編號的節點則需要o n 的時間,而線性表和順序表相應的時間複雜度分別是o logn 和o 1 使用鍊錶結構可以克服陣列鍊錶需要預先知道資料大小的缺點,鍊錶結構可以充分利用計算機記憶...

資料結構學習 鍊錶結構

儲存結構定義 struct node typedef struct node ptrtonode typedef ptrtonode list typedef ptrtonode position struct node 書寫 package thedatastructureaboutlinked ...