演算法-迴圈連結串列[約瑟夫問題]
阿新 • • 發佈:2018-11-30
- 連結串列屬於線性表的一種,資料邏輯記憶體相鄰,實體記憶體不相鄰。
- 常見連結串列有:單向連結串列,雙向連結串列,迴圈連結串列。
- 約瑟夫問題:有n個人圍在一起,初始化時編號相鄰,例如:1~41;從任何一個人開始報數為1,當有人報數為3時,該人死亡,從下一個人開始報數為1,一直迴圈,直到最後剩下不足3個人時遊戲結束。需要求出死亡順序和可能存在有人不死亡的情況。
- 程式碼:
/**
* 約瑟夫問題
* 迴圈連結串列
*/
#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;
}