鍊錶,通過指標來實現。
鍊錶是一種資料結構,而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 程式要新...