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

2021-09-22 22:50:07 字數 4694 閱讀 3811

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

開始程式之前,先簡單了解一下單鏈表中的一些基本概念

typedef

struct node //定義乙個結構體

node;

typedef

struct node *linklist;

int

initlist

(linklist *l)

//帶有頭節點的單鏈表的初始化

(*l)

->next =

null

;//使頭節點next為null,即表示空鍊錶

return0;

}

void

createlisthead

(linklist *l)

//頭插法建立乙個單鏈表

}

頭插法演算法思路

宣告一指標p和計數器變數i及要輸入元素的個數n

初始化一空鍊錶l

讓l的頭節點的指標指向null,即建立乙個帶頭節點的單鏈表

輸入要插入元素的個數及各元素值

迴圈

void

createlisttail

(linklist *l)

//尾插法建立乙個單鏈表

r->next =

null

;//表示單鏈表結束

}

尾插法和頭插法大同小異,只是頭插法使倒序排列,尾插法是正序排列,尾插法也符合我們正常的先來後到的思維

int

lengthlist

(linklist *l)

//計算鍊錶長度

return length;

//返回鍊錶長度

}

int

getelem

(linklist l,

int i, elemtype *e)

//用e返回l中第i個元素值if(

!p || j > i)

*e = p->data;

//將查到的資料用e返回

return0;

}

獲得鍊錶第i個資料的演算法思路:

宣告乙個指標p指向鍊錶中第乙個節點,初始化j從1開始

當 j < i 時,就遍歷鍊錶,讓p的指標向後移動,不斷指向下一節點,j累加1

當到鍊錶尾p為空,則說明第i個節點不存在

否則查詢成功,返回節點p的資料

int

insertlist

(linklist *l,

int i, elemtype e)

//在l中第i個位置插入元素eif(

!p || j > i)

s =(linklist)

malloc

(sizeof

(node));

s->data = e;

s->next = p->next;

//將p的後繼節點賦值給s的後繼

p->next = s;

//將s賦值給p的後繼

return0;

}

單鏈表第i個資料插入節點的演算法思路

宣告一指標p指向煉表頭節點,初始化j從1開始

當 j < i 時,就遍歷鍊錶,讓p的指標向後移動,不斷指向下一節點,j 累加1

若到鍊錶末尾p為空,則說明第i個節點不存在

否則查詢成功,在系統中生成乙個空節點s

將資料元素e賦值給s->data

單鏈表的插入標準語句s->next=p->next;p->next = s返回0

int

deletelist

(linklist *l,

int i, elemtype *e)

//刪除l中第i個元素,並用e返回其值if(

!(p->next)

|| j > i)

q = p->next;

p->next = q->next;

//將q的後繼賦值給p的後繼

*e = q->data;

//將q節點中的資料給e*

free

(q);

//釋放q節點

return0;

}

單鏈表第i個資料刪除節點的演算法思路:

宣告一指標p指向煉表頭節點,初始化j從1開始

當 j < 1 時,就遍歷鍊錶,讓p的指標向後移動,不斷指向下乙個節點,j 累加1

若到鍊錶末尾p為空,則說明第i個節點不存在

否則查詢成功,將要刪除的節點p->next賦值給q

單鏈表的刪除標準語句p->next = q->next;

將q節點中的資料賦值給e,作為返回

釋放q節點

返回0

int

clearlist

(linklist *l)

//單鏈表的整表刪除

(*l)

->next =

null

;//將頭節點的next置空

return0;

}

void

showlist

(linklist *l)

//列印整個鍊錶

printf

("單鏈表");

while

(p)printf

("\n");

}

到此,單鏈表的基本操作已經完成,下面附上原始碼

原始碼:

#include

#include

typedef

int elemtype;

typedef

struct node //定義乙個結構體

node;

typedef

struct node *linklist;

intinitlist

(linklist *l)

//帶有頭節點的單鏈表的初始化

(*l)

->next =

null

;return0;

}void

createlisthead

(linklist *l)

//頭插法建立乙個單鏈表,n為要插入的元素個數

}void

createlisttail

(linklist *l)

//尾插法建立乙個單鏈表,n為要插入的元素個數

r->next =

null;}

intlengthlist

(linklist *l)

//計算鍊錶長度

return length;

}int

getelem

(linklist l,

int i, elemtype *e)

//用e返回l中第i個元素值if(

!p || j > i)

*e = p->data;

return0;

}int

insertlist

(linklist *l,

int i, elemtype e)

//在l中第i個位置插入元素eif(

!p || j > i)

s =(linklist)

malloc

(sizeof

(node));

s->data = e;

s->next = p->next;

p->next = s;

return0;

}int

deletelist

(linklist *l,

int i, elemtype *e)

//刪除l中第i個元素,並用e返回其值if(

!(p->next)

|| j > i)

q = p->next;

p->next = q->next;

*e = q->data;

free

(q);

return0;

}int

clearlist

(linklist *l)

//單鏈表的整表刪除

(*l)

->next =

null

;return0;

}void

showlist

(linklist *l)

//列印整個鍊錶

printf

("單鏈表");

while

(p)printf

("\n");

}int

main()

資料結構 單鏈表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語言實現)

資料結構之單鏈表 c語言實現 本次介紹三種單鏈表 普通單鏈表 迴圈鍊錶和雙向鍊錶,後面的部落格會繼續介紹後兩種鍊錶 首先介紹單鏈表的特點 1.鍊錶是由乙個個記憶體位址不連續的節點組成 2.每個節點最多只有乙個前驅,乙個後記 第乙個節點只有後繼沒有前驅,最後乙個節點只有前驅沒有後繼 3.鍊錶不支援隨機...