//其实是一道水题,但是可以用它来学习双向循环链表的构建和基本使用方法 #include<iostream> #include<cstring> using namespace std; struct List//双向链表结构体 { char name[20]; struct List *front;//前指针 struct List *rear;//后指针 }; List* create(int n)//构造函数,再过几天尝试将这些函数整合成C++的类模板,应该会更简洁 { List *node,*head; head = node = new List; for(int i = 2;i <= n;++i) { node->rear = new List; node->rear->front = node; node = node->rear; } node->rear = head; head->front = node; return head; } List* move(List* p,int step)//链表计数移动 { for(int i = 1;i < step;++i) { p = p->rear; } return p; } List* remove(List *p)//删除节点操作,双向链表的关键所在 { p->front->rear = p->rear; p->rear->front = p->front; p = p->rear; return p; } int main() { int n,w,s; //freopen("in.txt","r",stdin); scanf("%d",&n); List *node,*head; head = node = create(n); for(int i = 1;i <= n;++i) { scanf("%s",node->name);//读入结点名字 node = node->rear; } scanf("%d,%d",&w,&s); node = move(head,w); while(node->rear != node)//循环链表的遍历终止条件 { node = move(node,s); printf("%s/n",node->name); node = remove(node); } printf("%s/n",node->name);//剩下最后一个结点时要输出 return 0; }