- 链表属于线性表的一种,数据逻辑内存相邻,物理内存不相邻。
- 常见链表有:单向链表,双向链表,循环链表。
- 约瑟夫问题:有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;
}
}
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));
j--;
i = 0;
}
}
}
int main()
{
create_list();
joseph(3);
return 0;
}