链表的处女作,RE了6遍。原因是没分析全面,最后两个节点一起删除的情况没考虑到。
致使指针变野!!!
#include <iostream>
#include <iomanip>
using namespace std;
struct peo
{
int data;
peo *pre, *next;
};
int main ()
{
int n, k, m;
while(cin>>n>>k>>m && !(!n&&!m&&!k))
{
peo *p, *q , *r, *s, *head, *head1, *head2;
head = p = new(peo);
for(int i = 1; i <= n; i++)
{
p->pre = q;
p->data = i;
if(i<n)
{
p->next = new(peo);
q = p;
p = p->next;
}
}
p->next = head;
head->pre = q->next;
head1 = head;
head2 = head->pre;
for(;;)
{
if(n==0)break;
if(n==1)
{
cout<<" "<<head1->data;
delete head1;
break;
}
int a, b;
p = head1;
for(int i = 0; i < k-1; i++)
{
p = p->next;
}
a = p->data;
r = head2;
for(int i = 0; i < m-1; i++)
{
r= r->pre;
}
b = r->data;
q = p->pre;
q->next = p->next;
p->next->pre = p ->pre;
head1 = p->next;
cout<<setw(3)<<a;
n--;
if(a!=b)
{
n--;
cout<<setw(3)<<b;
s = r->pre;
s->next = r->next;
r->next->pre = r->pre;
if(head1->data == r->data)
{
head1 = r->next;
p = r;
}
head2 = r->pre;
}
else
{
head2 = p->pre;
head1 = p->next;
}
if(p!=r)
{delete p;}
delete r;
if(n)cout<<",";
}
cout<<endl;
}
return 0;
}