數據結構與算法學習筆記02_3(線性表)
單鏈表的整表創建
單鏈表整表創建的算法思路如下:
創建單鏈表的過程是一個動態生成鏈表的過程,從“空表”的初始狀態起,依次建立各元素結點並逐個插入鏈表。
所以單鏈表整表創建的算法思路如下:
聲明一結點p和計數器變量i;
初始化一空鏈表L;
讓L的頭結點的指針指向NULL,即建立一個帶頭結點的單鏈表;
循環實現後繼結點的賦值和插入。
頭插法建立單鏈表
頭插法從一個空表開始,生成新結點,讀取數據存放到新結點的數據域中,然後將新結點插入到當前鏈表的表頭上,直到結束爲止。
簡單來說,就是把新加進的元素放在表頭後的第一個位置:
先讓新節點的next指向頭節點之後
然後讓表頭的next指向新節點
void createListHead(LinkList *L, int n){
LinkList p;
int i;
srand(time(0));//初始化隨機種子
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
for (i = 0; i < n;i++)
{
p = (LinkList)malloc(sizeof(Node));
p->data = rand() % 100 + 1;
p->next = (*L)->next;
(*L)->next = p;
}
}
尾插法建立單鏈表
void createListTail(LinkList *L, int n){
LinkList p ,r;
int i;
srand(time(0));//初始化隨機種子
*L = (LinkList)malloc(sizeof(Node));
r = *L;
for (i = 0; i < n;i++)
{
p = (LinkList)malloc(sizeof(Node));
p->data = rand() % 100 + 1;
r->next = p;
r = p;
}
r->next = NULL;
}
單鏈表的整表刪除
單鏈表整表刪除的算法思路如下:
聲明結點p和q;
將第一個結點賦值給p,下一結點賦值給q;
循環執行釋放p和將q賦值給p的操作;
Status ClearList(LinkList *L){
LinkList p, q;
p = (*L)->next;
while (p)
{
q = p->next;
free(p);
p = q;
}
(*L)->next = NULL;
return Ok;
}
結論:
若線性表需要頻繁查找,很少進行插入和刪除操作時,宜採用順序存儲結構。
若需要頻繁插入和刪除時,宜採用單鏈表結構。
比如說遊戲開發中,對於用戶註冊的個人信息,除了註冊時插入數據外,絕大多數情況都是讀取,所以應該考慮用順序存儲結構。
而遊戲中的玩家的武器或者裝備列表,隨着玩家的遊戲過程中,可能會隨時增加或刪除,此時再用順序存儲就不太合適了,單鏈表結構就可以大展拳腳了。
當線性表中的元素個數變化較大或者根本不知道有多大時,最好用單鏈表結構,這樣可以不需要考慮存儲空間的大小問題。
而如果事先知道線性表的大致長度,比如一年12個月,一週就是星期一至星期日共七天,這種用順序存儲結構效率會高很多。