資料結構之單鏈表(C語言實現)

2021-07-24 21:52:45 字數 3510 閱讀 7872

資料結構之單鏈表(c語言實現)

本次介紹三種單鏈表:普通單鏈表、迴圈鍊錶和雙向鍊錶,後面的部落格會繼續介紹後兩種鍊錶

首先介紹單鏈表的特點:

1.鍊錶是由乙個個記憶體位址不連續的節點組成

2.每個節點最多只有乙個前驅,乙個後記(第乙個節點只有後繼沒有前驅,最後乙個節點只有前驅沒有後繼)

3.鍊錶不支援隨機訪問(意思就是不能通過下標來進行找某個節點,只能從頭到尾進行遍歷)

4.鍊錶的查詢只能從頭到尾對鍊錶進行遍歷,時間複雜度為o(n);而順序表查詢元素只要給乙個下標即可,時間複雜度為o(1)

5.刪除鍊錶的某個節點時只需改變節點的指標,不需要移動大量元素

然後從三個方面來介紹三種鍊錶的通用操作:

1.鍊錶的初始化

2.申請乙個鍊錶節點

3.鍊錶的頭插法

4.鍊錶的尾插法

5.獲取鍊錶長度

6.刪除鍊錶節點

7.查詢指定值的節點

8.銷毀鍊錶(釋放鍊錶所有節點的記憶體空間)

9.輸出單鏈表(輸出單鏈表所有節點的資料域)

說明:以下單鏈表的實現,是資料域以整型為例,而且帶有頭結點。

一、普通單鏈表

1.單鏈表的結構

typedef struct _node

node, *list;

2.鍊錶的操作

(1)鍊錶的初始化(帶頭結點)

這裡的初始化只要是指初始化頭結點的指標域

void initlist(list plist)

(2).申請乙個鍊錶節點

從堆中申請乙個節點,注意這裡是從堆中申請的記憶體,只能通過free(p)顯式釋放記憶體。即使是區域性變數,該記憶體也不會隨著函式呼叫完成而釋放該記憶體。

static node* buynode(int val)

(3).煉表頭插法

這裡的鍊錶是帶有頭結點的,所以每次新插入的節點應插入頭結點後面。

void inserthead(list plist, int val)

(4).鍊錶尾接法

每次將新插入的節點插入到最後乙個節點後面,所以採用尾接法插入節點時首先要找到尾節點

void inserttail(list plist, int val)

pcur->next = ptmp; //將新節點插入到尾節點之後

}

(5).獲取鍊錶長度

對鍊錶進行遍歷,每遍歷乙個節點,計數器加一。

int getlistlen(list plist)

return icount;

}

(6).刪除鍊錶節點

刪除指定值的鍊錶節點時,需要遍歷該鍊錶,找到對應節點後想要刪除該節點必須要知道該節點的前驅節點,這樣才能正確刪除該節點。

bool delete(list plist, int val)

else

}return false;

}

(7).查詢指定值的節點

查詢指定值的節點也需要從頭到尾遍歷鍊錶,若找到則返回該節點,沒找到則返回null。

node* search(list plist, int val)

pcur = pcur->next;

} return null;

}

(8).銷毀鍊錶

銷毀鍊錶就是釋放鍊錶中所有節點的記憶體。

void destroy(list plist)

}

(9).輸出單鏈表

輸出單鏈表的操作也比較簡單,從頭到尾遍歷單鏈表,每遍歷乙個節點就輸出該節點的指標域

void show(list plist)

printf("\n");

}

最後附上完整**和執行結果:

#include#includetypedef struct _node

node, *list;

void initlist(list plist);

void inserthead(list plist, int val);

void inserttail(list plist, int val);

bool delete(list plist, int val);

node* search(list plist, int val);

int getlistlen(list plist);

void destroy(list plist);

static node* buynode(int val);

void show(list plist);

#include "test.h"

int main()

showlist(&head);

printf("鍊錶長度:%d\n", getlistlen(&head));

for (int i = 0; i < 12; ++i)

showlist(&head);

printf("鍊錶長度:%d\n", getlistlen(&head));

printf("search 12:\n");

node *p = search(&head, 12); //查詢節點

if (p != null)

else

printf("刪除節點12:\n"); //刪除節點

if (delete(&head, 12))

else

destroy(&head); //銷毀鍊錶

return 0;

}void initlist(list plist)

void inserthead(list plist, int val)

void inserttail(list plist, int val)

pcur->next = ptmp;

}bool delete(list plist, int val)

else

}return false;

}node* search(list plist, int val)

pcur = pcur->next;

} return null;

}int getlistlen(list plist)

return icount;

}void destroy(list plist)

}static node* buynode(int val)

void showlist(list plist)

printf("\n");

}

執行結果:

資料結構 單鏈表c語言實現

list.h如下 ifndef list h define list h typedef struct node node,list void initlist list list bool insert head list list,int val bool insert tail list li...

資料結構 單鏈表 c語言實現

建立結構體 node typedef struct node node,pnode 在堆記憶體上 動態建立結構體p指標 頭指標 指向頭節點的指標變數 頭節點 沒有有效資料,但是指向首節點的,結構體 首節點 第乙個含有有效資料,並儲存下個有效節點的指標 尾結點 最後乙個含有效資料,不指向下個節點位址,...

資料結構 單鏈表的c語言實現

鍊錶是通過一組任意的儲存單元來儲存線性表中的資料元素,這些儲存單元可以是連續的也可以是不連續的。為了建立起資料元素之間的關係,對於每個資料元素除了存放資料元素自身的資訊外,還必須有包含的指示該元素直接後繼元素儲存位置的資訊,這兩部分資訊組成乙個結點,即每個結點都有至少包括兩個域,乙個域儲存資料元素資...