这个循环链表我注释了蛮多了,这些代码也是参照别人的写的,并且加了注释,希望能对正在研究链表的同学有所帮助
//其实是一道水题,但是可以用它来学习双向循环链表的构建和基本使用方法
#include<iostream>
#include<cstring>
using namespace std;
struct List//双向链表结构体
{
char name[20];
struct List *front;//前指针
struct List *rear;//后指针
};
List* create(int n)//构造函数
{
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连接指针
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;
}