算法-循环链表[约瑟夫问题]

来源:互联网 发布:ubuntu虚拟机nat联网 编辑:程序博客网 时间:2024/06/05 05:51
  1. 链表属于线性表的一种,数据逻辑内存相邻,物理内存不相邻。
  2. 常见链表有:单向链表,双向链表,循环链表。
  3. 约瑟夫问题:有n个人围在一起,初始化时编号相邻,例如:1~41;从任何一个人开始报数为1,当有人报数为3时,该人死亡,从下一个人开始报数为1,一直循环,直到最后剩下不足3个人时游戏结束。需要求出死亡顺序和可能存在有人不死亡的情况。
  4. 代码:
/*** 约瑟夫问题* 循环链表*/#include "stdafx.h"#include "stdlib.h"#define LEN 41using 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 == 3void 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;}
原创粉丝点击