1.在头接点插入指定的值
template<class T>
void InsertD(dnode<T>* &front,const T& value)
{
dnode<T>* prev = front->prev, *curr = front;
dnode<T>* newNode = new dnode<T>(value);
newNode->prev = prev;
newNode->next = curr;
prev->next = newNode;
curr->prev = newNode;
}
2.显示所有接点数值
template<class T>
void ShowD(dnode<T>* &front)
{
dnode<T>*p = front->next;
while(p != front)
{
cout<<p->value <<"/n";
p = p->next;
}
}
3. 删除接点
template<class T>
void DeleteD(dnode<T>* &lhs)
{
dnode<T>*p = lhs->next;
while(p != lhs)
{
dnode<T>* front = p;
p = p->next;
delete front;
}
}
4。删除指定数据
//delete special element
template<class T>
void DeleteSpeValue(dnode<T>* &lhs,const T& value)
{
dnode<T>*p =lhs->next;
dnode<T>*front =lhs;
bool bfind = false;
while(p != lhs && !bfind)
{
if(p->value == value)
{
front->next = p->next;
bfind = true;
delete p;
}
else
{
front = p;
p = p->next;
}
}
}
5.删除指定接点
template<class T>
void DeleteNode(dnode<T>* &lhs)
{
if (lhs == lhs->prev)
throw;
dnode<T>*prev = lhs->prev;
dnode<T>*pNext = lhs->next;
prev->next = pNext->next;
delete lhs;
}
约瑟夫算法
void jose(int n,int m)
{
int i = 0,j = 0;
dnode<int>*front = new dnode<int>(),*curr;
//insert value to front
for ( ; i < n; ++i)
{
InsertD<int>(front,i);
}
//point to first element
curr = front->next;
for (i = 0; i < n; ++i)
{
for (j = 0; j <m -1; ++j)
{
curr = curr->next;
if (front == curr)
curr = curr->next;
}
curr = curr->next;
cout<<"delete value is "<<front->value <<"/n";
DeleteNode(curr->prev);
if (curr == front)
curr = curr->next;
}
cout<<"last win value is"<<front->value;
delete front;
delete curr;
}