C語言實現單鏈表的基本操作及其部分面試題

2021-07-15 23:04:28 字數 3027 閱讀 5637

//單鏈表的基本資料型別及其結構

typedef int datatype;

typedef struct linknode

linknode,*plinknode,*plinklist;

//單鏈表的初始化

void initlinklist(plinklist* phead)//初始化

//當尾插,頭插,插入時都需要建立乙個新的結點,為方便建立乙個建立結點的函式

plinknode buynode(datatype d)//建立乙個結點

//單鏈表的銷毀,即把單鏈表中所有的結點都釋放掉

void destory(plinklist* phead)//銷毀

//在當前單鏈表的末尾插入乙個結點

void pushback(plinklist* phead,datatype d)//尾插

//把當前單鏈表的最後乙個結點刪除掉

void popback(plinklist* phead)//尾刪

//在當前單鏈表的頭部插入乙個結點

void pushfront(plinklist* phead,datatype d)//頭插

//將單鏈表的第乙個結點刪除掉

void popfront(plinknode* phead)//頭刪

//獲取單鏈表的長度,增加乙個計數器,將單鏈表遍歷一遍

int getlistlength(plinklist* phead)//求單鏈表的長度

//給定單鏈表的乙個結點,在該結點的位置插入乙個新的節點,遍歷單鏈表,只要(cur->next==pos),使新結點的next指向pos,再將新結點賦給cur->next。

void insertlist(plinklist* phead,plinknode pos,datatype d)//插入

//遍歷單鏈表,只要某結點的值與要找的值相等,則返回該結點,否則返回null

plinknode find(plinklist* phead,datatype d)//查詢

//方法1 利用find函式找到需要刪除的結點pos,遍歷單鏈表,只要(cur->next == pos),將pos->next賦給cur->next,再將pos釋放掉。

void remove(plinklist* phead,datatype d)//刪除結點

//方法2 不需要已有函式find,原理與方法1一樣

void remove(plinklist* phead,datatype d)//刪除結點

//刪除單鏈表中所有相同的結點,首先,遍歷單鏈表,找到第乙個要刪除的結點,刪除並釋放掉,同時增加乙個指向該結點下乙個結點的指標,以此位置向後遍歷單鏈表,刪除相同結點,以此類推。

void removeall(plinklist* phead,datatype d)//刪除所有相同結點

//刪除指定位置的結點,需找到要刪除結點的上乙個結點,將該結點的下乙個結點賦給該結點的next,刪除並釋放該結點。

void erase(plinknode* phead,plinknode pos)//刪除指定位置的結點

//刪除無頭單鏈表的非尾結點,首先給出乙個指標del記錄pos->next,將pos->data賦給pos->data,再將del->next賦給pos->next,最後只需把del釋放即可

void erasenottail(plinknode pos)//刪除無頭單鏈表的非尾結點

//單鏈表的逆序,把第乙個結點取出來,他的next恆等於null,然後再把其他結點依次取出來利用頭插的方法插入,完成逆序。

void reverselist(plinklist* phead)//反轉(逆序)

//氣泡排序

void bubblesort(plinklist* phead)//排序鍊錶(冒泡)

//在當前結點前插入乙個結點,首先在pos位置後插入乙個結點,然後再交換pos->data和newnode->data即可

void insertfrontnode(plinknode pos,datatype d)//在當前結點前插入乙個資料

//合併兩個有序鍊錶(非遞迴)

plinknode merge(plinklist l1,plinklist l2)

//利用遞迴實現鍊錶的合併

plinknode _merge(plinklist plist1,plinklist plist2)

//利用快慢指標,快指標走兩步,慢指標走一步,返回慢指標,即為中間結點

plinknode findmidnode(plinklist* phead)//查詢鍊錶的中間結點

//利用快慢指標,快指標先走k-1步後,兩指標同時走,慢指標即為倒數第k個結點,然後再利用刪除無頭單鏈表的非尾結點中的方法刪除慢指標的下乙個結點。

void delknode(plinklist *phead,int k)//刪除單鏈表的倒數第k(k>1)個結點

//約瑟夫環,n個人圍成一圈,從某個人開始報數,報到m的那個人退出,然後m的下乙個人繼續從1開始報數,報到m的那個人退出,以此類推,最後剩下的那個人勝出。

//設定乙個指標變數指向第乙個結點,從第乙個結點先走(num-1)步,利用刪除單鏈表的無頭非尾結點的方法,刪除num結點的下乙個結點,依次類推。

plinknode josephcycle(plinklist *phead,int num)

//利用快慢指標,快指fast針走兩步,慢指標slow走一步,只要(fast == slow),返回slow,則單鏈表帶環,否則不帶環。

plinknode checkcycle(plinklist plist)//判斷鍊錶是否帶環

//增加乙個計數器,從相遇結點在遍歷一遍環即可求的環的長度

int getcirclelength(plinknode meet)//若帶環則根據相遇結點求環的長度

//增設兩個指標,乙個指向單鏈表的第乙個結點,乙個指向相遇結點,只要兩者不等,同時各走一步,終有一次兩者相等,則返回環的入口結點

plinknode getcycleentrynode(plinklist plist,plinknode meetnode)//獲取環的入口結點

本文出自 「緣去即成幻」 部落格,請務必保留此出處

單鏈表的基本操作(C語言實現)

單鏈表的初始化,建立,插入,查詢,刪除。include include typedef int elemtype 定義結點型別 typedef struct node node,linkedlist 單鏈表的初始化 linkedlist linkedlistinit 單鏈表的建立1,頭插法建立單鏈表...

C語言實現單鏈表的基本操作

listnode.h ifndef listnode h define listnode h include stdio.h include assert.h include stdlib.h typedef int datatype typedef unsigned int size t type...

單鏈表 的基本操作 c語言實現

鍊錶的基本操作 c語言實現 執行環境 dev c 5.11 以下為原始碼,如有不正確的地方歡迎指正!include include define false 0 define true 1 typedef int datatype typedef struct nodelinklist linkli...