1. 程式人生 > >演算法-迴圈連結串列[約瑟夫問題]

演算法-迴圈連結串列[約瑟夫問題]

  1. 連結串列屬於線性表的一種,資料邏輯記憶體相鄰,實體記憶體不相鄰。
  2. 常見連結串列有:單向連結串列,雙向連結串列,迴圈連結串列。
  3. 約瑟夫問題:有n個人圍在一起,初始化時編號相鄰,例如:1~41;從任何一個人開始報數為1,當有人報數為3時,該人死亡,從下一個人開始報數為1,一直迴圈,直到最後剩下不足3個人時遊戲結束。需要求出死亡順序和可能存在有人不死亡的情況。
  4. 程式碼:
/**
* 約瑟夫問題
* 迴圈連結串列
*/
#include "stdafx.h"
#include "stdlib.h"

#define LEN 41

using namespace std;
typedef int TYPE
; typedef struct Node { TYPE data; Node* next; Node* prev; }LNode,*PNode; PNode head; void create_list() { PNode node = (PNode)malloc(sizeof(LNode)); if (NULL != node) { node->data = 1; node->next = NULL; node->prev = NULL; head = node; } PNode newhead =
head; for (int i = 2; i <= LEN;i++) { PNode newnode = (PNode)malloc(sizeof(LNode)); newnode->data = i; if (i == LEN) { newnode->next = head; head->prev = newnode; } else { newnode->next = NULL; } newhead->
next = newnode; newnode->prev = newhead; newhead = newnode; } } // index == 3 void joseph(int index) { int i = 1, j = LEN; PNode newhead = head; printf("dead people:\0"); while (i++ <= LEN) { newhead = newhead->next; if (j==2) { printf("remainder:%d \0",newhead->data); printf("%d",newhead->prev->data); return; } if (i == index) { PNode nextTemp = newhead->next; PNode prevTemp = newhead->prev; prevTemp->next = nextTemp; nextTemp->prev = prevTemp; printf("%d \0",(newhead->data)); //newhead = NULL; //free(newhead); // 釋放記憶體 j--; i = 0; } } } int main() { create_list(); joseph(3); return 0; }