约瑟夫问题:
1、用单循环链表来实现,这样比较简单
#include "stdafx.h"
#include <string>
#include <iostream>
#include <cassert>
using namespace std;
struct Node
{
int pos;
Node *pNext;
Node(int position = -1, Node *next = NULL)
:pos(position), pNext(next){}
};
int num = 0;
//创建循环链表
Node* create(int n)
{
Node *head = new Node(0);
Node *temp = head;
Node *node = NULL;
for (int i = 1; i <= n; ++i)
{
node = new Node(i);
temp->pNext = node;
temp = node;
num += 1;
}
head = head->pNext;
temp->pNext = head;
return head;
}
//显示循环链表
void Print(Node *head)
{
Node *temp = head;
do
{
cout<<temp->pos<<" ";
temp = temp->pNext;
} while (temp != head);
cout<<endl;
}
//删除节点
int Remove(Node* head)
{
do
{
Node *delNode = head->pNext->pNext; //要删除的节点
cout<<"删除节点:"<<delNode->pos<<endl;
head->pNext->pNext = delNode->pNext; //改变指针的指向
head = delNode->pNext;//改变head指向下一个节点
delNode->pNext = NULL;
num -= 1;
} while (1 != num);
return head->pos;
}
int main()
{
Node *head = create(5);
Print(head);
int pos = Remove(head);
cout<<"剩下的节点为:"<<pos<<endl;
cout<<StrCmp("wang", "zhang")<<endl;
}