循环链表理论
约瑟夫问题
代码实现
#include <iostream>
#include <string>
using namespace std;
//链表节点
struct LinkNode
{
LinkNode *next;
};
typedef bool (*CompareNode)(LinkNode *node1,LinkNode *node2);
typedef void (*PrintNode)(LinkNode *node);
//链表
struct LinkList
{
LinkNode *head;
int size;
LinkList();
~LinkList();
//插入节点
void insertNode(int index,LinkNode *node);
//删除节点
void deleteNode(LinkNode *node,CompareNode compareNode);
//查找节点
LinkNode* queryNode(int index);
//遍历节点
void printList(int frequency,PrintNode printNode);
//清空链表
void clearList();
};
//数据
struct Person
{
LinkNode node;
string name;
int age;
Person(string name,int age);
};
void printNode(LinkNode *node)
{
Person *p=(Person*)node;
cout<<p->name<<" "<<p->age<<endl;
}
bool compareNode(LinkNode *node1,LinkNode *node2)
{
Person *p1=(Person*)node1;
Person *p2=(Person*)node2;
if((p1->name).compare(p2->name)==0 && p1->age==p2->age)
{
return true;
}
return false;
}
//约瑟夫数据
struct Data
{
LinkNode node;
int number;
};
void printData(LinkNode *node)
{
Data *data=(Data*)node;
cout<<data->number<<" ";
}
bool compareData(LinkNode *node1,LinkNode *node2)
{
Data *data1=(Data*)node1;
Data *data2=(Data*)node2;
if(data1->number == data2->number)
{
return true;
}
return false;
}
LinkList::LinkList()
{
head=new LinkNode;
head->next=head;
size=0;
}
LinkList::~LinkList()
{
delete head;
}
void LinkList::insertNode(int index, LinkNode *node)
{
if(index<0 || index>size)
{
index=size;
}
//辅助指针
LinkNode *pCurrent=head;
for(int i=0;i<index;i++)
{
pCurrent=pCurrent->next;
}
//插入节点
node->next=pCurrent->next;
pCurrent->next=node;
//更新链表大小
size++;
}
void LinkList::deleteNode(LinkNode *node,CompareNode compareNode)
{
//辅助指针
LinkNode *pCurrent=head;
for(int i=0;i<size;i++)
{
if(compareNode(pCurrent->next,node))
{
pCurrent->next=pCurrent->next->next;
break;
}
pCurrent=pCurrent->next;
}
//更新链表大小
size--;
}
LinkNode* LinkList::queryNode(int index)
{
if(index<0 || index>size)
{
index=size;
}
//辅助指针
LinkNode *pCurrent=head->next;
for(int i=0;i<index;i++)
{
pCurrent=pCurrent->next;
}
return pCurrent;
}
void LinkList::printList(int frequency, PrintNode printNode)
{
//frequency 表示输出的次数
//辅助指针
LinkNode *pCurrent=head->next;
for(int i=0;i<size*frequency;i++)
{
if(pCurrent == head)
{
pCurrent=pCurrent->next;
}
printNode(pCurrent);
pCurrent=pCurrent->next;
}
}
void LinkList::clearList()
{
size=0;
head->next=head;
}
Person::Person(string name, int age)
{
this->name=name;
this->age=age;
}
int main()
{
//初始化数据
Person p1("A",10);
Person p2("B",20);
Person p3("C",30);
Person p4("D",40);
Person p5("E",50);
Person p6("D",40);
//初始化链表
LinkList list;
list.insertNode(100,(LinkNode*)&p1);
list.insertNode(100,(LinkNode*)&p2);
list.insertNode(100,(LinkNode*)&p3);
list.insertNode(100,(LinkNode*)&p4);
list.insertNode(100,(LinkNode*)&p5);
//遍历链表
list.printList(1,printNode);
cout<<"----------------------------------"<<endl;
//删除节点
list.deleteNode((LinkNode*)&p6,compareNode);
//遍历链表
list.printList(1,printNode);
cout<<"----------------------------------"<<endl;
//查询节点
printNode(list.queryNode(3));
cout<<"----------------------------------"<<endl;
//清空链表
list.clearList();
//遍历链表
list.printList(1,printNode);
cout<<"----------------------------------"<<endl;
//初始化链表
list.insertNode(100,(LinkNode*)&p1);
list.insertNode(100,(LinkNode*)&p2);
list.insertNode(100,(LinkNode*)&p3);
list.insertNode(100,(LinkNode*)&p5);
//遍历链表
list.printList(1,printNode);
//清空链表
list.clearList();
//以下为约瑟夫问题求解
cout<<"------------------------------------Joseph question--------------------------------"<<endl;
Data data[8];
for(int i=0;i<8;i++)
{
data[i].number=i+1;
list.insertNode(i,(LinkNode*)&data[i]);
}
//辅助指针
LinkNode *pCurrent=list.head;
while (list.size!=0) {
for(int i=0;i<3;i++)
{
pCurrent=pCurrent->next;
if(pCurrent == list.head)
{
i--;
}
}
printData(pCurrent);
list.deleteNode(pCurrent,compareData);
}
cout<<endl;
return 0;
}
运行结果