資料結構與演算法 C 單鏈表

2021-10-08 08:19:03 字數 4718 閱讀 5428

全域性變數:g_

陣列:a

指標:p

結構體:st

unsigned int:ui

/* 單鏈表 */

typedef

struct s_list

s_list_s;

鍊錶插入可用於構建鍊錶。

/* 鍊錶插入 */

s_list_s *

slist_insert

(s_list_s *pstslist,

unsigned

int uivalue)

pstslist_iter = pstslist;

while

(pstslist_iter->pstnext)

pstslist_iter->pstnext = pstslist_new;

return pstslist;

}

根據key查詢鍊錶節點。

/* 查詢鍊錶 */

s_list_s *

slist_find

(s_list_s *pstslist,

unsigned

int uivalue)

return

null

;}

查詢倒數第k個節點。

定義兩個鍊錶節點,其中乙個先走k步,另乙個再走,快的走到尾節點,則慢點走到倒數第k個節點。

/* 找到鍊錶倒數第k個節點 */

s_list_s *

slist_find_k

(s_list_s *pstslist,

unsigned

int uik)

return pstslow;

}

依次執行後乙個節點指向前乙個節點。

/* 鍊錶反轉-非遞迴 */

s_list_s *

slist_reverse_norecursive

(s_list_s *pstslist)

return pstslist_rev;

}

定義兩個鍊錶節點,快的每次走2步,慢的走1步,如果兩個節點在遍歷中相等,說明鍊錶有環。

/* 鍊錶有沒有環 */

intslist_isring

(s_list_s *pstslist, s_list_s *

*ppstslist_ring)

}return0;

}

如果兩個單鏈表相交,則其尾結點一定相等。

/* 鍊錶是否相交 */

intslist_iscross

(s_list_s *pstslista, s_list_s *pstslistb)

鍊錶中key值出現時記錄到陣列做標記,如果再次出現則說明是重複元素。

/* 鍊錶刪除重複元素 */

s_list_s *

slist_delete_repect

(s_list_s *pstslist)

;unsigned

int uivalue;

s_list_s *pstprev;

s_list_s *pstiter;if(

!pstslist)

return

null

; pstiter = pstslist;

while

(pstiter->pstnext)

pstprev = pstiter;

pstiter = pstiter->pstnext;

auclist[uivalue]++;

}return pstslist;

}

列印鍊錶。

/* 列印鍊錶 */

void

slist_dump

(s_list_s *pstslist)

}

測試程式。

void

main

(void);

unsigned

int uilen =

sizeof

(auilist)

/sizeof

(unsigned

int)

; s_list_s *pstslist =

null

;int i;

for(i =

0; i < uilen; i++

) pstslist =

slist_insert

(pstslist, auilist[i]);

#ifdef list_reverse_test

slist_dump

(pstslist)

; pstslist =

slist_reverse_norecursive

(pstslist)

;slist_dump

(pstslist)

;#endif

#ifdef list_k_test

s_list_s * pstnodek =

slist_find_k

(pstslist,3)

;printf

("k %d\n"

, pstnodek->uivalue)

;#endif

#ifdef list_repect_test

slist_dump

(pstslist)

; pstslist =

slist_delete_repect

(pstslist)

;slist_dump

(pstslist)

;#endif

#ifdef list_ring_test

s_list_s *pstslist_ring;

int iisring =

slist_isring

(pstslist,

&pstslist_ring)

;printf

("isring %d %p\n"

,iisring,pstslist_ring)

; s_list_s * pstnode =

slist_find

(pstslist,3)

; s_list_s * pstiter = pstslist;

while

( pstiter->pstnext)

pstiter = pstiter->pstnext;

pstiter->pstnext = pstnode;

iisring =

slist_isring

(pstslist,

&pstslist_ring);if

(iisring)

#endif

#ifdef list_cross_test

unsigned

int auilistb=

;unsigned

int auilistc=

;unsigned

int uilenb =

sizeof

(auilistb)

/sizeof

(unsigned

int)

;unsigned

int uilenc =

sizeof

(auilistc)

/sizeof

(unsigned

int)

; s_list_s *pstslistb =

null

; s_list_s *pstslistc =

null

;int iiscross;

for(i =

0; i < uilenb; i++

) pstslistb =

slist_insert

(pstslistb, auilistb[i]);

for(i =

0; i < uilenc; i++

) pstslistc =

slist_insert

(pstslistc, auilistc[i]);

iiscross =

slist_iscross

(pstslistb, pstslistc)

;printf

("iscross %d\n"

,iiscross);

s_list_s * pstiter = pstslistb;

while

( pstiter->pstnext)

pstiter = pstiter->pstnext;

pstiter->pstnext = pstslist;

pstiter = pstslistc;

while

( pstiter->pstnext)

pstiter = pstiter->pstnext;

pstiter->pstnext = pstslist;

iiscross =

slist_iscross

(pstslistb, pstslistc)

;printf

("iscross %d\n"

,iiscross)

;#endif

return

;}

單鏈表(演算法與資料結構)

鍊錶 單鏈表 為每個結點新增1個指標域,每個結點包括兩個域 資料域 存放元素本身資訊 指標域 存放後繼結點的儲存位置 指向鍊錶中第乙個結點的指標,稱為這個鍊錶的頭指標。最後乙個元素的指標不指向任何結點,稱為空指標,圖示中用 表示,在演算法中用 null 表示 帶頭結點的單鏈表 頭結點 可以不存資訊,...

資料結構與演算法 單鏈表

鍊錶是有序的列表,但是它在記憶體中是儲存如下 鍊錶是以節點的方式來儲存的 鍊錶的各個節點不一定是連續儲存的 鍊錶分帶頭結點的鍊錶和不帶頭結點的鍊錶 新增先建立乙個 head 頭結點,作用就是表示單鏈表的頭 後面我們每新增乙個結點,就直接加入到鍊錶的最後 遍歷 通過乙個輔助變數,幫助來遍歷整個鍊錶 第...

資料結構與演算法 單鏈表

單鏈表的建立 1.建立乙個head頭節點,作用就是表示單鏈表的頭 2.後面我們每新增乙個節點,就直接加入鍊錶的最後 定義heronode,每個heronode物件就是乙個節點 class heronode 為了顯示方法,重新tostring public string tostring 定義sing...