首先我們來了解下靜態鍊錶,什麼是靜態鍊錶?我們知道,鍊錶是動態結構,通過指標將資料串聯起來,只要記憶體有空間就可以繼續分配鍊錶,沒有固定的長度限制,是一種非常好用儲存結構,而且從作業系統原理上來說,他可以利用記憶體的碎片化空間,並且更容易找到合適空間分配,減少作業系統對記憶體空閒區域的檢索時間,在一定程度上提高了程式的速度,但是浪費了一定的空間用來存放指標,相對來說,犧牲空間,提公升時間,對於較大記憶體調入來說,這個犧牲還是比較划算的。
那麼什麼是靜態鍊錶?我們指導,跟鍊錶對應的是陣列,在記憶體劃分一段連續空間,用來存放資料。優點是操作簡單,定址快,但缺點同樣要命。首先陣列要求在記憶體劃分連續區域,只能使用較大的連續區域,這樣在一定程度上增加了作業系統的負擔,而且,連續區域不好找啊,劃分連續區域一定程度上就會造成記憶體碎片化,造成資源浪費。再考慮陣列大小固定,擴容很麻煩,所以一般程式設計師會設定乙個較大的空間,以防止記憶體溢位。但是如果使用者使用的資料量較小,就會造成浪費,同時也可能會造成記憶體溢位,導致程式崩潰,也給計算機安全造成危害。不過對於小資料,使用陣列的確是方便快捷。
而我們所討論的靜態鍊錶,簡直就是逆天的存在,將陣列與鍊錶結合起來,各取其缺點……,或許你內心一萬隻草泥馬在呼倫貝爾大草原上狂野奔騰,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 ...