寒假補習1 單鏈表雙鏈表的基本概念及簡單使用

2021-10-02 10:37:37 字數 3513 閱讀 7934

學習動機:在大一時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 ...