1. 程式人生 > 實用技巧 >約瑟夫環

約瑟夫環

#include <iostream>
#include <easyx.h>            // 引用圖形庫標頭檔案
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
using namespace std;
const double PI = acos(-1);
typedef struct NodeType
{
    int num;//編號
    char name[20
]; int x;//圓心的x座標 int y;//圓心的y座標 int r;//當前圓的半徑大小 NodeType* next; }; int n, m; int radius = 50; class Jose { private: NodeType* p_head; public: Jose() { p_head = new NodeType; //帶空頭的連結串列 p_head->next = p_head; //空的迴圈連結串列 } ~Jose() {} void creat();
void print(); }; void Jose::creat() { int i = 0, n; NodeType *newp, *tempNode; tempNode = p_head; cout << "\n enter total nums of people: "; cin >> n; for (i = 0; i < n; ++i) { newp = new NodeType; newp->num = i + 1; cout << "
\n enter name: "; cin >> newp->name; newp->x = cos((float)i / n * 2 * PI)*radius; newp->y = -sin((float)i / n * 2 * PI)*radius; newp->next = p_head; //此處p_head為尾部哨兵 tempNode->next = newp; //不斷地往尾部(尾部哨兵之前)插入節點 tempNode = newp; } tempNode->next = p_head->next; //斷開空頭哨兵 delete p_head; //釋放哨兵節點 p_head = tempNode->next; //頭結點指向第一個節點 } void Jose::print() { int m, i; NodeType *del = p_head, *tempNode; cout << "\n enter value m(m>=2):"; cin >> m; cout << "\n start:" << endl; while (del->next != del) //連結串列節點個數不為1 { NodeType *tempNode; for (i = 1; i < m; ++i) //del往後移動m位 { tempNode = del; del = del->next; } cout << del->num << " " << del->name << endl; tempNode->next = del->next; //斷開del節點 delete del; //釋放del節點 del = tempNode->next; } cout << del->num << " " << del->name << endl; delete del; //連結串列只剩一個節點直接刪除 } int main() { Jose gameList; gameList.creat(); gameList.print(); initgraph(640, 640); // 建立繪圖視窗,大小為 640x480 畫素 setorigin(320,320); int frame = 1000; while (radius) { setfillcolor(BLUE); fillcircle(0, 0, radius); // 畫圓,圓心(200, 200),半徑 100 Sleep(100); radius-= 5; cleardevice(); } _getch(); // 按任意鍵繼續 closegraph(); // 關閉繪圖視窗 return 0; }