STL之鍊錶

2021-07-27 15:20:16 字數 4559 閱讀 6901

鍊錶,通過指標來實現。

鍊錶是一種資料結構,而list只是stl對於鍊錶的一種實現,一萬個人有可能寫出一萬種不同的鍊錶來。

文字內容**很長很詳細的鍊錶所有操作

理解**這篇寫的棧佇列都很好理解

鍊錶是一種常見的重要的資料結構。它是動態地進行儲存分配的一種結構。它可以根據需要開闢記憶體單元。鍊錶有乙個「頭指標」變數,以head表示,它存放乙個位址。該位址指向乙個元素。鍊錶中每乙個元素稱為「結點」,每個結點都應包括兩個部分:一為使用者需要用的實際資料,二為下乙個結點的位址。因此,head指向第乙個元素:第乙個元素又指向第二個元素;……,直到最後乙個元素,該元素不再指向其它元素,它稱為「表尾」,它的位址部分放乙個「null」(表示「空位址」),鍊錶到此結束。

鍊錶的各類操作包括:學習單向鍊錶的建立、刪除、 插入(無序、有序)、輸出、 排序(選擇、插入、冒泡)、反序等等。

(排序反序沒寫到這篇裡xd)

建立n個節點的鍊錶的函式為:

#include "cstdlib"  

#include "cstdio"

#define null 0

#define len sizeof(struct student)

struct student

; int n; //節點總數

/* *************************=

功能:建立n個節點的鍊錶

返回:指向煉表表頭的指標

*************************=

*/

struct student *create()

else //節點開闢成功

while(p1->num != 0) //只要學號不為0,就繼續錄入下乙個節點

else

p2 = p1; //把p1的位址給p2保留,然後p1產生新的節點

p1 = (struct student *) malloc (len);

printf ("please input %d node -- num,score: ", n + 1);

scanf ("%d %f", &(p1->num), &(p1->score));

} p2->next = null; //此句就是根據單向鍊錶的最後乙個節點要指向null

free(p1); //p1->num為0的時候跳出了while迴圈,並且釋放p1

p1 = null; //特別不要忘記把釋放的變數清空置為null,否則就變成"野指標",即位址不確定的指標

return head; //返回建立鍊錶的頭指標

}

輸出鍊錶中節點的函式為:

/* 

*************************==

功能:輸出節點

返回: void

*************************==

*/

void print(struct student *head)

while (p != null);

} }

刪除乙個資料:

刪除第乙個節點,操作方法如下:

1、你要明白head就是第1個節點,head->next就是第2個節點;

2、刪除後head指向第2個節點,就是讓head=head->next,ok這樣就行了。

---->[1]---->[2]---->[3]...---->[n]---->[null](原鍊錶)

head   1->next  2->next  3->next   n->next

---->[1]---->[3]...---->[n]---->[null](刪除後鍊錶)

head   1->next  3->next   n->next

刪除中間某個節點,這裡刪除第二個,操作方法如下:

1、你要明白head就是第1個節點,1->next就是第2個節點,2->next就是第3個節點;

2、刪除後2,1指向第3個節點,就是讓1->next=2->next。

刪除指定學號的節點的函式為:

/* 

*************************=

功能:刪除指定節點

(此例中是刪除指定學號的節點)

返回:指向煉表表頭的指標

*************************=

*/

struct student *del (struct student *head, int num)

//定位要刪除的節點

p1 = head;

while (p1->num != num && p1->next != null) //p1指向的節點不是所要查詢的,並且它不是最後乙個節點,就繼續往下找

if(p1->num==num) //找到了。(結合圖4、5理解)

else //如果是其它節點,則讓原來指向當前節點的指標,指向它的下乙個節點,完成刪除

free (p1); //釋放當前節點

p1 = null;

printf ("\ndelete %ld success!\n", num);

n -= 1; //節點總數減1個

} else //沒有找到

return head;

}

插入乙個資料:

單向鍊錶的插入圖示:

---->[null](原鍊錶)

head

---->[1]---->[null](插入後的鍊錶)

head   1->next

圖7 空鍊錶插入乙個節點

結合原鍊錶和插入後的鍊錶,就很容易寫出相應的**。操作方法如下:

1、你要明白空鍊錶head指向null就是head=null;

2、插入後head指向第1個節點,就是讓head=1,1->next=null,ok這樣就行了。

---->[1]---->[2]---->[3]...---->[n]---->[null](原鍊錶)

head   1->next  2->next  3->next   n->next

---->[1]---->[2]---->[x]---->[3]...---->[n]---->[null](插入後的鍊錶)

head   1->next  2->next  x->next  3->next   n->next

圖8:有n個節點的鍊錶,插入乙個節點(這裡圖示插入第2個後面)

結合原鍊錶和插入後的鍊錶,就很容易寫出相應的**。操作方法如下:

1、你要明白原1->next就是節點2,2->next就是節點3;

2、插入後x指向第3個節點,2指向x,就是讓x->next=2->next,1->next=x。

插入指定節點的後面的函式為:

/* 

*************************=

功能:插入指定節點的後面

(此例中是指定學號的節點)

返回:指向煉表表頭的指標

*************************=

*/

struct student *insert (struct student *head, int num, struct student *node)

p1 = head;

while(p1->num != num && p1->next != null) //p1指向的節點不是所要查詢的,並且它不是最後乙個節點,繼續往下找

if (p1->num==num) //找到了(結合圖示8理解)

else

return head;

}

例題:

hdu 1276 士兵報數

#include#includeusing namespace std;

int main()

else

}f=1;

if(flag<=3) break;

for(it=s.begin(); it!=s.end();)

else

}f=1;

if(flag<=3) break;

}int w=0;

for(it=s.begin(); it!=s.end(); it++)

cout<

STL之鍊錶list(C )

2 鍊錶 list 的常用方法 鍊錶 list 是乙個雙向鍊錶,可高效地進行插入刪除元素。如圖,list的結構 運用 list,必須宣告請標頭檔案 include。list 型別定義於 namespace std 中,是個 class template namespace std第乙個 templa...

STL順序容器之鍊錶

list雙向鍊錶 forward list向前鍊錶 單向 操作都在煉表頭 2011年新標準 略 include list 結構體 變數名 for each ls2.begin ls2.end fun list iterator ite ls2.begin ite 只能 不能 2 3 無容量概念 si...

STL之佇列 鍊錶實現

1 實驗專案三 佇列的基本操作應用 實驗結果 輸入 8人資訊 a,b,c,d,e,f,g,h 輸出 the dancepartners a bc d e fg is waiting for a partner.實驗分析 1.佇列的操作特點 2.列舉除錯執行過程 現的錯誤並分析原因。要求 1 程式要新...