據說著名猶太歷史學家josephus有過以下的故事:在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有人都自殺身亡為止。然而josephus 和他的朋友並不想遵從。首先從乙個人開始,越過k-2個人(因為第乙個人已經被越過),並殺掉第3個人。接著,殺掉第3個人。這個過程沿著圓圈一直進行,直到最終只剩下乙個人留下,這個人就可以繼續活著。問題是,給定了和,一開始要站在什麼地方才能避免被處決。josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。
約瑟夫問題和迴圈鍊錶相同。
問題:用迴圈鍊錶模擬約瑟夫問題,把41個人自殺的順序編號輸出。
#include
#include
typedef
struct node
node;
node *
create
(int n)
s->next = head->next;
//不指向頭節點,而是第乙個結點,構成乙個環,釋放頭結點
}free
(head)
return s->next;
}int
main()
printf
("%d -> "
,p->next->data);
temp = p->next;
p->next = temp->next;
free
(temp);
p = p->next;
}printf
("%d\n"
,p->data)
;return0;
}
去掉頭指標,將尾指標指向頭結點
判斷空鍊錶的條件:rear是否等於rear->next。
例題1:實現將兩個鍊錶連線成乙個線性表(a1, a2, a3…b1, b2…)的運算
普通思路:用頭指標表示的單迴圈表上,遍歷第乙個鍊錶,找到an,然後將b1放在an的後面,bn的next指向a的頭結點。執行時間為o(n)
優化思路:只需要修改二者的尾指標
例題2:判斷單鏈表中是否有環(鍊錶的尾結點指向了鍊錶中的某個結點)
方法一:使用p,q兩個節點,p總是向前走,q是每次從頭開始走,對於每個結點,看p的步數和q是否一樣。例如,p從1-2-3-4-5-6-3,用了6步,此時q從head出發,只需要兩步,因此步數不等,存在環。
方法二:快慢指標,p向前走一步,q走兩步,某個時候p==q,則存在環。
一位魔術師掏出一疊撲克牌,魔術師取出其中13張黑桃,洗好後,把牌面朝下。說:「我不看牌,只數一數就能知道每張牌是什麼?」魔術師口中念一,將第一張牌翻過來看正好是a;魔術師將黑桃a放到桌上,繼續數手裡的餘牌,第二次數1,2,將第一張牌放到這疊牌的下面,將第二張牌翻開,正好是黑桃2,也把它放在桌子上。第三次數1,2,3,前面二張牌放到這疊牌的下面,取出第三張牌,正好是黑桃3,這樣依次將13張牌翻出,全部都準確無誤。求解:魔術師手中牌的原始順序是什麼樣子的?
**如下:
#include
#include
#define cardnumber 13
typedef
struct node
sqlist,
*linklist;
linklist createlinklist()
r->next = head;
return head;
}//發牌順序計算
要求實現使用者輸入乙個數使得26個字母的排列發生變化,例如使用者輸入3,輸出結果:defghijklmnopqrstuvwxyzabc。也支援負數輸入,例如-3,xyzabcdefghijklmnopqrstuvw
**實現如下:
#include
#include
#define ok 1
#define error 0
typedef
char elemtype;
typedef
int status;
typedef
struct dualnode
dualnode,
*dulinklist;
status initlist
(dulinklist *l)
p->next =
(*l)
->next;
(*l)
->next->prior = p;
return ok;
}void
caesar
(dulinklist *l,
int i)
while
(--i);}
if( i <0)
while
(++i);}
}int
main()
return0;
}
資料結構(六)線性表(一)
線性表 線性表的定義 零個或多個資料元素的有限序列 若線性表記為 a1,ai 1,ai,an 則表中ai 1領先於ai,ai領先於ai 1,稱ai 1是ai的直接前驅元素,ai 1是ai的直接後繼元素。當i 1,2,3,n 1時,ai有且僅有乙個直接後繼,當i 2,3,n,ai有且僅有乙個直接前驅。...
筆記 資料結構 線性表 順序表
左側為順序表,右側為鍊錶,區別在於有無在記憶體中順序存放資料。順序表結構 typedef struct tabletable 順序表初始化 table inittable t.length 0 t.size 5 return t 順序表遍歷 void displaytable table t pri...
資料結構(六) 線性表之迴圈鍊錶與雙向鍊錶
我們之前說過了單鏈表,大家應該都有印象吧,那麼迴圈鍊錶是什麼呢?迴圈鍊錶就是將單鏈表中終端結點的指標端自空指標改為指向頭結點,就使整個單鏈表形成乙個環,這種頭尾相接的單鏈表稱為單迴圈鍊錶,簡稱迴圈鍊錶 circular linked list 那麼迴圈鍊錶出現的目的是為什麼呢?迴圈鍊錶解決如何從當中...