循环报数 | |
描述: | 输入1个数字和多个字符,中间均以空格隔开。假设数字取值为m(范围1~9),后面字符个数为n。假设n个字符围成一圈,从第一个字母开始循环报数,当数到m以后,第m个字母就出列,直到这n个字母全部出列。最后,按照出列的顺序输出这些字母,中间仍以空格隔开。取值范围:m为1到9, 字符个数n大于1小于20。 |
运行时间限制: | 无限制 |
内存限制: | 无限制 |
输入: | 第一个为数字,后面为多个字符,均以空格隔开 |
输出: | 输出重新排列后的字符,以空格隔开 |
样例输入: | 3 a b c d e f g h i |
样例输出: | c f i d h e b g a |
答案提示: |
|
我的代码:
#include<iostream>
using namespace std;
struct Node
{
char data;
Node* next;
};
int main()
{
char ch;int num;
Node * head,*p,*s;
head=new Node;//创建头结点
p=head;//使指针指向头结点
while(cin.get(ch)&&ch!='\n')
{
if(ch>=48&&ch<=57)
num=ch-48;
else if(ch!=' ')
{
s=new Node;//创建一个节点
s->data=ch;//为节点元素赋值
p->next=s;//将节点加入链表
p=s;//将p指针指向新加入的节点。
}
}
head=head->next;//使头指针指向链表第一个元素
p->next=head;//使链表尾部指向链表的头部
Node *p1=head;Node *p2=head;
int ss=0;
if(num>1)
{
do
{
p2=p1;//前一个node
p1=p1->next;
ss++;
if(ss==num-1)
{
ss=0;
cout<<p1->data<<" ";
p2->next=p1->next;//
delete p1;//delete操作释放p1指针指向的内存块,但是并不修改p1中的地址值。
p1=p2->next;//更新p1的值。
}
}while(p1!=p2);//当p1,p2相同时,跳出循环
cout<<p1->data;//输出链表中唯一的一个元素
}
else//当num=1时,直接按顺序输出链表
{
p1=head;
cout<<p1->data<<" ";//输出链表第一个元素
p1=p1->next;
for(;p1!=head;p1=p1->next)//当p1等于头指针时,跳出循环
cout<<p1->data<<" ";
}
return 0;
}