鍊錶:
上圖為單鏈表結構,每個節點均有資料域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...