C 資料結構迴圈鍊錶(帶環鍊錶)基本操作

2021-08-31 01:32:48 字數 2006 閱讀 5344

經典迴圈鍊錶之約瑟夫問題:標號從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...