經典迴圈鍊錶之約瑟夫問題:標號從1到n的n個人圍成乙個圈,從1開始計數到m的人退出圈子,然後從退出的下乙個人開始接著從1計數,數到m的人後繼續退出,最後只剩下乙個人,求剩下人的編號。這便是約瑟夫問題的模型。
經典迴圈鍊錶之魔術師發牌問題:魔術師手中有a、2、3……j、q、k十三張黑桃撲克牌。在表演魔術前,魔術師已經將他們按照一定的順序疊放好(有花色的一面朝下)。魔術表演過程為:一開始,魔術師數1,然後把最上面的那張牌翻過來,是黑桃a;然後將其放到桌面上;第二次,魔術師數1、2;將第一張牌放到這些牌的最下面,將第二張牌翻轉過來,正好是黑桃2;第三次,魔術師數1、2、3;將第1、2張牌依次放到這些牌的最下面,將第三張牌翻過來正好是黑桃3;……直到將所有的牌都翻出來為止。問原來牌的順序是如何的。
鍊錶相交:
#include#include#include//定義單向迴圈鍊錶結點
typedef struct cnodecnode;
cnode* create_cnode(const int length)
p->next = head->next;
return head;}
//列印所有結點
void print_cnode(cnode* cnode)
printf("%d\n",p->data);}
//判斷乙個鍊錶是否帶環
//思路:設定乙個快指標一次走2步,乙個慢指標一次走1步,如果快指標與慢指標相遇則帶環
int with_loop_or_not(cnode* cnode)
cnode* fast = cnode->next;
cnode* slow = cnode;
while(fast!=slow && fast->next!=null&&fast->next->next!=null)
if(fast==slow)
else}
//尋找帶環鍊錶的入口
//思路: 對於帶環鍊錶,從求出的相遇點挨個向下走,
//另乙個指標從頭結點挨個向下走,兩個指標相遇的地方就是環入口
cnode* loop_enter(cnode* cnode)
cnode* fast = cnode->next;
cnode* slow = cnode;
while(fast!=slow && fast->next!=null&&fast->next->next!=null)
//求入口
cnode* step = cnode;
cnode* loop_step = fast;
while(step!=loop_step)
return step; //入口點}
//判斷鍊錶是否相交
//相交的意思是兩個鍊錶的尾部若干個結點是重合的。
//方法一:分別求兩個鍊錶的尾指標, 若兩個尾指標相等則相交。
//方法二:把其中乙個鍊錶的首尾相連,在此基礎上,若第二個鍊錶存在環,則兩個鍊錶相交
//約瑟夫問題
void ysf(cnode* cnode,int n, int m)
cnode* s = p->next;
p->next = s->next;
free(s);
}printf("%d\n",p->data); }
//魔術師發牌問題
cnode* mss(int length)
p->next = head->next;
p = head->next;
p->data = 1;
for(int num = 2;num<=13;num++)
}p->data = num;
}return head;}
void main()
資料結構 鍊錶 帶頭結點的單向迴圈鍊錶
帶頭結點的單向迴圈鍊錶 include include include headlist.h 功能 建立乙個空鍊錶 引數 無 返回值 失敗返回null 成功返回頭結點的位址 list createlklist list first null list last null list n 0 現在還是空...
資料結構C 迴圈鍊錶
我曾經去一家遊戲公司面試時遇到乙個筆試題,大意就是說有一群人出去旅遊,在河中遇到了大風,然後用轉盤決定誰在留在船上,誰自己跳下去自行解決生存問題。大家圍成乙個圈,啟動轉盤,轉盤指向誰就從睡開始數數,當有人數到13時,誰就跳下去,然後從下乙個人開始從頭數,當再有人數到13時,繼續上乙個迴圈。當時題意沒...
資料結構 雙向鍊錶,迴圈鍊錶
也許是自己太小看資料結構,練習了幾天還在第二章徘徊,可自己覺得基礎還是要打牢的好 總結一下 第乙個是雙向鍊錶,include include typedef struct node node,linklist void creat linklist l else int insert linklis...