學習動機:在大一時c語言課程設計時老師介紹了許多像鍊錶之類的知識,由於課程設計時間短任務重,感覺十分有用卻沒有深入學習,一直覺得是心頭重擔。大二上半學期作業系統實驗的演算法本來是想用c語言進行實現,但鍊錶知識不充足,最後選擇封裝方法多的、更為簡單的python進行實現。正巧趕上春節假期和肺炎病毒橫行,閒著沒事做,所以打算每兩天補習一項之前因為時間倉促而丟下的知識,希望能堅持下來嘻嘻 :)鍊錶是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點(鍊錶中每乙個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。 相比於線性表順序結構,操作複雜。
我的理解:
鍊錶不同於指標,指標必須要線性的進行連線,連續的指向下乙個儲存單位。鍊錶的組成成分有兩個,乙個是儲存資料的區域,另乙個就是指向下一儲存區域的指標。
1.陣列靜態分配記憶體,鍊錶動態分配記憶體。
2.陣列在記憶體中是連續的,鍊錶是不連續的。
3.陣列利用下標定位,查詢的時間複雜度是o(1),鍊錶通過遍歷定位元素,查詢的時間複雜度是o(n)。
4.陣列插入和刪除需要移動其他元素,時間複雜度是o(n),鍊錶的插入或刪除不需要移動其他元素,時間複雜度是o(1)。
————————————————
**:csdn博主「哆啦a熊」的原創文章
主要體現在插入和刪除的效率和記憶體的占用上。鍊錶的定向插入刪除效率會更高一些。記憶體使用在於陣列在宣告時便需要宣告空間大小且直接開闢空間,而鍊錶只有在連線到時才需要給它分配空間,也無法進行動態分配。
但鍊錶的查詢(刪除)的效率低,而陣列可以進行快速定位,效率較高。
1.單鏈表的每乙個節點中只有指向下乙個結點的指標,不能進行回溯,適用於節點的增加和刪除。
2.雙鏈表的每乙個節點給中既有指向下乙個結點的指標,也有指向上乙個結點的指標,可以快速的找到當前節點的前乙個節點,適用於需要雙向查詢節點值的情況。
單鏈表的建立:
typedef
struct node
node,
*linkedlist;
單鏈表的初始化:linkedlist linkedlistinit()
單鏈表的建立:1.頭插法:
linkedlist linkedlistcreath()
return l;
}
2.尾插法:linkedlist linkedlistcreatt()
r->next =
null
;return l;
}
3.單鏈表的插入,在鍊錶的第i個位置插入x的元素linkedlist linkedlistinsert
(linkedlist l,
int i,elemtype x)
pre->next = p->next;
//刪除操作,將其前驅next指向其後繼。
free
(p);
return l;
}
main函式int
main()
雙鏈表的建立typedef
struct dulnode
dulnode,
*dullinklist;
雙鏈表的初始化status initlist_dul
(dullinklist &l)
//初始化乙個帶頭結點的雙向迴圈鍊錶
正序建立乙個帶頭結點的雙向迴圈鍊錶void
createlist_dul
(dullinklist &l)表,ok
p->next=l;
l->prior=p;
}
定位值為e的結點的位置dullinklist locateelem_dul
(dullinklist l,elemtype x)
printf
("the element is not exists\n");
return
null
;}
在帶頭結點的雙向迴圈鍊錶中的x值後插入y值status insertafter_dul
(dullinklist &l,elemtype y)
dullinklist p,s;
elemtype x;
printf
("value you want to find is :");
scanf
("%d"
,&x)
; p=
locateelem_dul
(l,x);if
(!p)
s=(dullinklist)
malloc
(sizeof
(dulnode));
s->data=y;
s->next=p->next;
p->next->prior=s;
p->next=s;
s->prior=p;
return ok;
}
刪除dulnode*
deletethenode
(dulnode* head,
int num)
if(num==p1->data)
else
if(p1->next)
//不是頭結點,也不是尾節點
else
}else
return head;
}
main函式void
main()
隨著這篇部落格的完成,我也大致了解了鍊錶的概念和基本的實現方法。**部分大多借鑑優秀的csdn部落格博主:@mr.gzj ,表示感謝。
因為還沒有學習資料結構,發現很多知識都是和資料結構相關的,所以還是有許多存疑的地方,希望這個假期有時間提前學習一下資料結構然後解決掉它~加油加油!
雙鏈表與單鏈表的比較
雙鏈表在一定程度上就是單鏈表的的基礎上加上了乙個指標域,在一些情況下能夠使程式更加健壯和速率更加高效。雙鏈表的結點定義 typedef struct node int data struct node next struct node prior node 雙鏈表的定義 typedef struct...
資料結構之單鏈表 雙鏈表的基本操作
單鏈表雙鏈表中經常糾結的概念 1 鍊錶是否有含有頭結點 1 帶頭結點的煉表頭指標head指向頭結點,資料域不含任何資訊,只是指向鍊錶的第乙個儲存資訊的結點,head next等於null則表示鍊錶為空 2 不帶頭結點的煉表頭指標head直接指向儲存資訊的第乙個結點,head null,表示鍊錶為空。...
鍊錶的實現 單鏈表 雙鏈表
鍊錶知識的引入 對於之前我們接觸到的陣列知識,要想儲存多個物件,首先想到的一定是物件陣列。但是陣列是乙個長度固定的線性結構,一旦內容不足或者過多,都會在成記憶體資源的浪費,由此引入鍊錶充分解決資源浪費問題。class node private屬性需要設定getter setter方法 public ...