本週第一次講座,學長給我們簡單的概述了資料結構和演算法,然後對鍊錶的一些操作進行了講解,下來之後,我把原來書上的一些
鍊錶的基本操作與鍊錶的逆置,排序等操作結合起來,整理出來
鍊錶是由結點構成的,關鍵是定義結點
c語言程式設計上兩大特例:①鍊錶節點的定義②遞迴函式的定義。這兩個違反了先定義再使用。
3.靜態鍊錶:各結點在程式中定義,不是臨時開闢的(不是用malloc函式或者calloc函式動態開闢的空間),始終佔著記憶體不放。
struct student4.動態鍊錶的建立; //定義結構體型別
int main()
while(p!null);
(1)建立鍊錶:從無到有建立起乙個鍊錶,即往空煉表中一次插入若干結點,並保持結點之間的前驅和後繼關係。顧名思義,鍊錶就像一條鐵環串成的鍊子,每個鐵環是結點,連線下乙個鐵環,也可以理解為老師帶領手拉手小朋友排隊,頭指標是老師,小朋友與小朋友之間拉著手。
第一次看的時候沒有看懂,應該在紙上把鍊錶的圖畫一畫就可以明白。
struct num5.單鏈表的遍歷輸出; int icount; //全域性變數標記結點的順序
struct *create()
else
pnew=(struct*)malloc(sizeof(struct num));//再次分配結點的記憶體空間,為下乙個結點插入做準備
scanf("%d",&pnew->number);
} free(pnew);
return phead;
}
(2)檢索操作:按給定的結點引導或檢索條件,查詢某個結點。如果找到指定的結點則稱為檢索成功;否則檢索失敗。自己理解是從鍊錶的開頭按照順序乙個乙個檢查,然後找到自己想要找到的結點,如果找到則檢索成功,如果沒找到就是檢索失敗。
void print(struct num *phead)6.單鏈表的插入}
(3)插入操作:在結點n(i)和n(i+1)之間插入乙個新的結點n,使線性表的長度增加1,且n(i)和n(i+1)的邏輯關係發生變化:
插入前n(i)是n(i+1)的前驅,n(i+1)是n(i)的後繼;插入後新的結點n成為n(i)的後繼,n(i+1)的前驅。
插入原則:
①插入操作不應破壞原鏈結關係
②插入的結點應該在它該在的位置(按照順序排好,如果不要求順序,則可以任意插入)
實現方法:
應該有乙個插入位置的查詢子過程
共有3中插入情況:
①插入結點在鍊錶最前端
struct num *insert(struct num *phead)②插入節點在鍊錶中間
struct num *insert(struct num *phead,int n)③插入節點在鍊錶尾端
struct num *insert(struct num *phead)
7.單鏈表的刪除
(4)刪除操作:刪除結點n(i)後,使線性表的長度減1,且n(i-1)n(i)n(i+1)的邏輯關係發生變化:
刪除前,n(i)是n(i+1)的前驅,n(i-1)的後繼;刪除後,n(i-1)成為n(i+1)的前驅,n(i+1)成為n(i-1)的後繼。
刪除的原則:
不改變原來排列的順序,只是從鍊錶中分離開來,撤銷原來的鏈結關係。
兩種情況:
①要刪的結點是頭指標所指的結點則直接操作;
②不是頭結點,要依次往下找。另外考慮:空表和找不到要刪除的結點
需要兩個臨時指標:
p1:判斷指向的結點是不是要刪除的結點(用於尋找);
p2:始終指向p1前面的乙個結點;
void delete(struct num *phead,int n)單鏈表最後乙個結點的指標指向null,迴圈鍊錶的最後乙個結點的指標指向煉表頭結點,首尾相連,形成資料鏈。ppre->next=ptemp->next; // 將要刪除的結點兩邊的結點鏈結
free(ptemp);
icount--; //減少鍊錶中結點的個數
}
與單鏈表的不同點:
(1)鍊錶的建立:單鏈表需要建立乙個頭結點,專門存放第乙個結點的位址,單鏈表的尾指標的指標域指向null,;而迴圈鍊錶的建立,不需要專門的頭結點,讓最後乙個結點的指標域指向鍊錶的頭結點即可。
(2)煉表表尾的判斷:單鏈表判斷結點是否為表尾結點,只需判斷結點的指標域是否為null,如果是,則為尾結點,否則不是。而迴圈鍊錶判斷是否尾結點,則是判斷該節點的指標域是否指向煉表頭結點。
雙向兩鍊錶也是基於單鏈表,單鏈表有乙個頭結點,乙個尾結點,雙鏈表有兩個指標域,乙個指向左邊乙個指向右邊,
乙個儲存直接後繼結點位址,一般稱為右鏈域,乙個儲存直接前驅結點位址,一般成為左鏈域。
13.雙向迴圈鍊錶建立
struct num14.雙向鍊錶查詢;struct num *creat(int n)
h->llink=s; //頭結點向左指向最後乙個結點
p->rlink=h; //最後乙個結點向右指向頭結點,連線完成
return(h);
}
從表頭結點往後依次比較各結點資料域的值,若是該特定值。則返回結點的指標,否則繼續往後查,直到表尾
struct num *search(struct num *phead,int n)15.雙向列表插入}
雙向鍊錶插入結點和單鏈表插入結點方法基本相同,只是指標域要分左右,比如要在p,q之間插入結點s,只需把p右鏈域指向s,s的左鏈域指向p,s的右鏈域指向q,q的左鏈域指向s即可
void intset(struct num *p)16.雙鏈表的刪除
雙鏈表的刪除和單鏈表的刪除也類似,將要刪除的鍊錶跳過即可,需要注意的是在刪除的時候分清左右鏈域
比如:s、p、q三個連續結點,要刪除p,只需將s的右鏈域指向q,q的左鏈域指向s,並釋放p結點就可以了
void del(struct num *p)
單鏈表以及雙向鍊錶的操作
include include define max 30 typedef struct s 單向鍊錶的儲存結構 s,linklist typedef struct dulist 雙向鍊錶的儲存結構 dulnode,dulinklist int initlist s s 建立空的單鏈表 void s...
單鏈表 迴圈鍊錶 雙向鍊錶的比較
查詢表頭結點 首元結點 查詢表尾結點 查詢結點 p的前趨節點 帶頭結點的單鏈表l l next 時間複雜度o 1 從 l next 依次向後遍歷 時間複雜度o n 通過 p next 無法找到其前驅 帶頭結點僅設頭指標l的迴圈單鏈表 l next 時間複雜度o 1 從 l next 依次向後遍歷 時...
雙向鍊錶 基本操作
test.c define crt secure no warnings 1 include doubleslishtnode.h void test1 initdslist pushback printfdslist popback void test2 pushfront popfront vo...