鍊錶的基本操作 單鏈表 雙向鍊錶 迴圈鍊錶

2021-07-16 02:16:09 字數 3199 閱讀 6967

本週第一次講座,學長給我們簡單的概述了資料結構和演算法,然後對鍊錶的一些操作進行了講解,下來之後,我把原來書上的一些

鍊錶的基本操作與鍊錶的逆置,排序等操作結合起來,整理出來

鍊錶是由結點構成的,關鍵是定義結點

c語言程式設計上兩大特例:①鍊錶節點的定義②遞迴函式的定義。這兩個違反了先定義再使用。

3.靜態鍊錶:各結點在程式中定義,不是臨時開闢的(不是用malloc函式或者calloc函式動態開闢的空間),始終佔著記憶體不放。

struct student

; //定義結構體型別

int main()

while(p!null);

4.動態鍊錶的建立

(1)建立鍊錶:從無到有建立起乙個鍊錶,即往空煉表中一次插入若干結點,並保持結點之間的前驅和後繼關係。顧名思義,鍊錶就像一條鐵環串成的鍊子,每個鐵環是結點,連線下乙個鐵環,也可以理解為老師帶領手拉手小朋友排隊,頭指標是老師,小朋友與小朋友之間拉著手。

第一次看的時候沒有看懂,應該在紙上把鍊錶的圖畫一畫就可以明白。

struct num

; int icount; //全域性變數標記結點的順序

struct *create()

else

pnew=(struct*)malloc(sizeof(struct num));//再次分配結點的記憶體空間,為下乙個結點插入做準備

scanf("%d",&pnew->number);

} free(pnew);

return phead;

}

5.單鏈表的遍歷輸出

(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)

ppre->next=ptemp->next; // 將要刪除的結點兩邊的結點鏈結

free(ptemp);

icount--; //減少鍊錶中結點的個數

}

單鏈表最後乙個結點的指標指向null,迴圈鍊錶的最後乙個結點的指標指向煉表頭結點,首尾相連,形成資料鏈。

與單鏈表的不同點:

(1)鍊錶的建立:單鏈表需要建立乙個頭結點,專門存放第乙個結點的位址,單鏈表的尾指標的指標域指向null,;而迴圈鍊錶的建立,不需要專門的頭結點,讓最後乙個結點的指標域指向鍊錶的頭結點即可。

(2)煉表表尾的判斷:單鏈表判斷結點是否為表尾結點,只需判斷結點的指標域是否為null,如果是,則為尾結點,否則不是。而迴圈鍊錶判斷是否尾結點,則是判斷該節點的指標域是否指向煉表頭結點。

雙向兩鍊錶也是基於單鏈表,單鏈表有乙個頭結點,乙個尾結點,雙鏈表有兩個指標域,乙個指向左邊乙個指向右邊,

乙個儲存直接後繼結點位址,一般稱為右鏈域,乙個儲存直接前驅結點位址,一般成為左鏈域。

13.雙向迴圈鍊錶建立

struct num

;struct num *creat(int n)

h->llink=s; //頭結點向左指向最後乙個結點

p->rlink=h; //最後乙個結點向右指向頭結點,連線完成

return(h);

}

14.雙向鍊錶查詢

從表頭結點往後依次比較各結點資料域的值,若是該特定值。則返回結點的指標,否則繼續往後查,直到表尾

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...