單鏈表的基本操作的相關題目

2021-08-29 12:15:43 字數 4633 閱讀 7673

鍊錶:

上圖為單鏈表結構,每個節點均有資料域data和指向下乙個節點的指標域pnext。

鍊錶結構c語言描述

typedef int datatype;

typedef struct slist

slist;

函式宣告:

void init(slist **pphead);//初始化

slist* buynewnode(datatype data);//申請新節點

void pushback(slist **pphead, datatype data);//頭插

void myprintf(slist *pphead);//列印函式

void destroylinklist(slist **pphead);//銷毀

void slistpopback(slist** phead);//尾刪

void slistpushfront(slist** phead, datatype data);//頭插

void slistpopfront(slist** phead);//頭刪

//面試題

void printlistfromtail2front(slist* phead);// 從尾到頭列印單鏈表 

void deletelistnottail(slist* pos);// 刪除單鏈表的非尾結點,不能遍歷鍊錶 

void insertposfront(slist* pos, datatype data);// 在單鏈表非頭結點前插入新節點,要求不能遍歷鍊錶 

slist* josephcircle(slist* phead, int m);// 用單鏈表模擬實現約瑟夫環 

void bubblesort(slist* phead);// 用氣泡排序對單鏈表進行排序 

slist* findmiddlenode(slist* phead);// 查詢單鏈表的中間結點,要求只能遍歷一次鍊錶

slist* findlastknode(slist* phead, int k);// 查詢單鏈表的倒數第k個結點,要求只能遍歷一次鍊錶 

void reverselist(slist** phead);// 單鏈表的逆置尾插

slist* reverselistop(slist* phead);//頭插

slist* mergelist(slist* phead1, slist* phead2);// 合併兩個有序鍊錶,合併成功後依然有序 

slist* haslistcircle(slist* phead);// 檢測單鏈表是否帶環 

int getcirclelen(slist* phead);// 求環的長度

slist* getenternode(slist* phead, slist* pmeetnode);// 求環的入口點 

int islistcross(slist* phead1, slist* phead2);// 判斷兩個單鏈表是否相交(鍊錶不帶環) 

slist* getcrossnode(slist* phead1, slist* phead2);// 若相交,求交點

int islistcrosswithcircle(slist* phead1, slist* phead2);// 檢測兩個鍊錶是否相交,鍊錶可能帶環

函式的實現:

#include"slist.h"

#include

#include

void init(slist **pphead)//初始化

slist* buynewnode(datatype data)//申請新節點

assert(pnewnode);

pnewnode->data = data;

pnewnode->pnext = null;

return pnewnode;

}void pushback(slist **pphead, datatype data)//尾插

else

pcur->pnext = pnewnode;

pnewnode->pnext = null;}}

void destroylinklist(slist **pphead)//銷毀

pphead = null;

}void slistpopback(slist** pphead)//尾刪

slist* cur = *pphead;

slist* pre = null;

while (cur->pnext!=null)

free(cur);

cur=null;

pre->pnext = null;

}void slistpushfront(slist** pphead, datatype data)//頭插

else

}void slistpopfront(slist** pphead)//頭刪

slist* slistfind(slist* phead, datatype data)//查詢某個節點

return null;

}slist* slistback(slist* phead)//獲取最後乙個節點

return pprecur;

}void printlistfromtail2front(slist* pphead)// 從尾到頭列印單鏈表 

}void deletelistnottail(slist* pos)// 刪除單鏈表的非尾結點,不能遍歷鍊錶

slist*cur = null;

cur = pos->pnext;

pos->data = cur->data;

pos->pnext = cur->pnext;

free(cur);

}void insertposfront(slist* pos, datatype data)// 在單鏈表非頭結點前插入新節點,要求不能遍歷鍊錶 

slist* josephcircle(slist* phead, int m)// 用單鏈表模擬實現約瑟夫環 

tail->pnext =phead;

cur = phead;

while (cur->pnext != cur)

return cur;

}void bubblesort(slist* phead)// 用氣泡排序對單鏈表進行排序 

ppre = pcur;

pcur = pcur->pnext;

}if (!ischange)//如果次序正常則不進行這次排序

return;

ptailnode = ppre;//當一遍排序結束後最後乙個節點不同在排序將為指標向前移動}}

slist* findmiddlenode(slist* phead)// 查詢單鏈表的中間結點,要求只能遍歷一次鍊錶

return slow;

}slist* findlastknode(slist* pphead, int k)// 查詢單鏈表的倒數第k個結點,要求只能遍歷一次鍊錶 

while (pfast->pnext!=null)

return pslow;

}void reverselist(slist** pphead)// 單鏈表的逆置

*pphead = ppre;

}slist* mergelist(slist* phead1, slist* phead2)// 合併兩個有序鍊錶,合併成功後依然有序

else

while (pl1&&pl2)

else

ptail = ptail->pnext;

}if (pl1)

ptail->pnext = pl1;

else

ptail->pnext = pl2;

return pnewnode;

}slist* haslistcircle(slist* pphead)// 檢測單鏈表是否帶環 

return null;

}int getcirclelen(slist* pmeetnode)// 求環的長度

return count;

}slist* getenternode(slist* pphead, slist* pmeetnode)// 求環的入口點 

return pm;

}int islistcross(slist* phead1, slist* phead2)// 判斷兩個單鏈表是否相交(鍊錶不帶環) 

slist* getcrossnode(slist* phead1, slist* phead2)// 若相交,求交點

while (ph2 != null)

count = size1 - size2;

if (count > 0)

else

while (ph1 != ph2)

return ph1;

}int islistcrosswithcircle(slist* phead1, slist* phead2)

else if (pmeetnode1 && pmeetnode2)//帶還相交

if (pcur == pmeetnode2)

return 2;

}return 0;

}void myprintf(slist *pphead)

}

考研相關的單鏈表題目

結構 typedef int elemtype typedef struct lnode linkedlist 將乙個沒有頭結點的結點資料為字元的單鏈表,分解成還有字母字元 數字字元和其他字元的三個帶頭節點的迴圈鍊錶 void onetothree linkedlist l,linkedlist l...

單鏈表的相關操作

1.單鏈表的反轉 在這裡實現一種最簡單的鍊錶反轉的方法,遞迴反轉,在反轉當前借點之前先反轉後續的節點,這樣層層深入直到最後乙個子節點。package com.weibo.linkedlist public class reversenode public listnodes reverse list...

單鏈表的相關操作

最近複習資料結構的時候,複習到了鍊錶,把王道上的關於鍊錶的基本操作敲了一遍,當是複習鞏固,記錄在此,沒準以後能用得到。結點型別 typedef struct lnode lnode,linklist 前插法建立單鏈表 linklist createlist1 linklist l while val...