### 鏈表的優缺點:
優點:
空間沒有限制
插入刪除元素很快
缺點:
存取速度很慢。
定義:
n個節點離散分配(在內存中不是連續存儲)
彼此通過指針相連
每個節點只有一個前驅節點,每個節點只有一個后續節點
首節點沒有前驅節點,尾節點沒有后續節點。
首節點:
第一個有效節點
尾節點:
最后一個有效節點
頭節點:
頭結點的數據類型和首節點的類型一樣
沒有存放有效數據,最最前面的,是在首節點之前的,主要是為了方便對鏈表的操作。
頭指針:(指向頭)
指向頭節點的指針變量
尾指針:
指向尾節點的指針
(頭結點有可能很大,占的內存可能大,假設我想造一個函數輸出所有鏈表的值,那你如果不用頭指針類型做形參,那由于不同鏈表的頭節點不一樣大小,這樣就沒辦法找出形參)
確定一個鏈表需要幾個參數:(或者說如果期望一個函數對鏈表進行操作我們至少需要接收鏈表的那些信息???)
只需要一個參數:頭指針,因為通過它我們可以推出 鏈表的所有信息。
(鏈表的程序最好一定要自己敲出來)
鏈表的分類:
單鏈表
雙鏈表:
每一個節點有兩個指針域
循環鏈表
能通過任何一個節點找到其他所有的節點
單鏈表偽算法:
1.插入節點:
在p指向的節點后面插入一個被q指向的節點:
?
P存放的是指向的節點的地址,q也是。next指針存放的是下一個元素的地址。
?
q->next=p->next;p->next=q;
**也可以**
**r=p->next; p->next=q;q->next=r;**
?
刪除p后面的節點
?
P->next=p->next->next 會造成內存泄露,無法找到要刪除的節點,無法釋放內存。
正確做法:臨時定義一個指針r 存放要刪除節點的地址
r=p->next;
p->next=p->next->next;
free(r);//釋放所指節點占用的內存