登 录
申明此代码是直接复制的别人的,因为写的比较清晰又是基于题目的所以就拿过来用一下,原创的注释不够清晰,我这里基本上每行都注释适合菜鸟看#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; //首先建一个node,这个node == head因为此时链表中只有一个节点 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; }
抱歉!评论已关闭.