資料結構 單鏈表實現

2021-09-05 11:34:31 字數 3659 閱讀 9413

在鏈式儲存中,節點之間的儲存單元位址可能是不連續的。鏈式儲存中每個結點都包含兩部分:儲存元素本身的資料域和儲存結點位址的指標域。結點中的指標指向的是下乙個結點,也就是儲存的下乙個結點的位址。

1.建立鍊錶

在建立鍊錶時,頭結點不儲存資料,但可以儲存鍊錶的資訊。

struct header

;

儲存資料的結點包含兩部分內容:資料域和指標域。

struct node

;

為了方便定義,將兩個struct 用typedef重新定義:

typedef

struct node list;

//節點

typedef

struct header phead;

//頭節點

phead*

creatlist()

2.獲取鍊錶大小
//獲取鍊錶的大小

intsize

(phead* ph)

return ph->length;

}

3.插入元素

在鍊錶中插入元素時要比在順序表中快。比如在pos位置插入,則先斷開pos-1與pos的鏈結,然後將pos-1結點的指標指向val結點,將val結點的指標指向pos。

//插入元素,在pos位置插入元素val

void

insert

(phead* ph,

int pos,

int val)

//首先將值val儲存在乙個結點中

list *pval=

(list *

)malloc

(sizeof

(list));

pval->data=val;

list *pcur=ph->next;

if(pos==0)

//插在首節點

else

pval->next=pcur->next;

pcur->next=pval;

} ph->length++

;//長度加1

return

;}

4.查詢某個元素

查詢鍊錶中的某個元素,其效率沒有順序表高,因為不管查詢的元素在哪個位置,都需要將它前面的元素都全部遍歷才能找到它。

//查詢某個元素,並返回它的結點

list*

find

(phead* ph,

int val)

//遍歷鍊錶來查詢元素

list* ptmp=ph->next;

do ptmp=ptmp->next;

}while

(ptmp->next!=

null);

printf

("沒有值為%d的元素\n"

,val)

;return

null

;}

5.刪除元素

在刪除元素時,首先將被刪除元素與上下結點之間的鏈結斷開,然後將這兩個上下結點重新鏈結。

//刪除節點,刪除值為val的元素,刪除成功,返回刪除的元素

void

delete

(phead * ph,

int val)

list* pval=

find

(ph,val);if

(pval==

null

) list* pre=ph->next;

list* pcur=

null;if

(pre->data==val)

//如果刪除的是第乙個節點

else

pre=pre->next;

}free

(pcur)

;//釋放結點

}return

;}

6.銷毀鍊錶

銷毀鍊錶時,將鍊錶中每個元素結點釋放,頭結點可以釋放,也可以保留,將其置為初始化狀態。

//銷毀鍊錶

void

destroy

(phead *ph)

while

(pcur->next!=

null

) ph->length=0;

//初始化頭結點

ph->next=

null

;printf

("鍊錶已銷毀!\n");

}

7.遍歷列印鍊錶
//遍歷列印鍊錶

void

print

(phead * ph)

while

(ptmp!=

null

)printf

("\n");

}

8.樣例測試
#include

#include

#include

//所有函式宣告

phead*

creatlist()

;//建立鍊錶

intsize

(phead*);

//獲取鍊錶的大小

void

insert

(phead*

,int

,int);

//插入元素

list*

find

(phead*

,int);

//查詢某個元素

void

delete

(phead*

,int);

//刪除節點

void

destroy

(phead*);

//銷毀鍊錶

void

print

(phead*);

//遍歷列印鍊錶

intmain()

;for

(int i=

0;i<

10;i++

)printf

("鍊錶長度:%d\n"

,size

(ph));

print

(ph)

;printf

("刪除鍊錶中的節點\n");

int num;

scanf

("%d"

,&num)

;delete

(ph,num)

;printf

("元素刪除成功,刪除元素%d後,鍊錶中元素為:\n"

,num)

;print

(ph)

; ret=

find

(ph,3)

;if(ret)

else

destroy

(ph)

;return0;

}

結果:

鍊錶長度:100

9876

5432

1刪除鍊錶中的節點

2元素刪除成功,刪除元素2後,鍊錶中元素為:09

8765

431get!

鍊錶已銷毀!

資料結構 單鏈表實現

線性表的鏈式儲存結構的特點是用一組任意的儲存單元儲存線性表的資料元素 這組儲存單元可以是連續的,也可以是不連續的 因此,為了表示每個資料元素與其直接後繼資料元素之間的邏輯關係,對資料元素來說,除了儲存其本身的資訊之外,還需儲存乙個指示其直接後繼的資訊 即直接後繼的儲存位置 這兩部分資訊組成資料元素的...

資料結構 單鏈表實現

package list public class singlelinkedlist private class node public node object data 頭插法 public void headinsert object data 尾插法 public void tailinser...

資料結構 單鏈表實現

單鏈表的頭沒有儲存資訊,僅作為乙個記號 單鏈表有乙個next指標,指向下乙個節點 可以在除頭節點外的任何節點進行增刪改查,但是在鍊錶頭部操作和在尾部操作所消耗的資源是大不相同的。package com.base class singlelinkedlist 初始化乙個頭節點,不存放資料 privat...