问题描述:
输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程实现上述计数过程,同时输出数值出列的顺序比如:
输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置)
第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数
第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数
第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数
最后一轮计数出列数字为4,计数过程完成。
输出数值出列顺序为:2,3,1,4。
采用循环链表的方式实现:
1 #include <iostream> 2 using namespace std; 3 4 struct NODE{ 5 int num; 6 NODE *next; 7 }; 8 9 10 int main() 11 { 12 char s[50]; 13 int m; 14 NODE *pNew=NULL,*pHead=NULL,*pRear=NULL,*pTemp=NULL;; 15 int i; 16 while(cin>>s>>m) 17 { 18 for (i=0;s[i];i++) 19 { 20 pNew=new NODE; 21 pNew->num=s[i]-'0'; 22 if (i==0) 23 { 24 pHead=pRear=pNew; 25 } 26 else 27 { 28 pRear->next=pNew; 29 } 30 pNew->next=NULL; 31 pRear=pNew; 32 } 33 pRear->next=pHead; 34 for (i=0;i<s[i];i++) 35 { 36 pTemp=pHead; 37 for (int i=1;i<m;i++) 38 { 39 pTemp=pHead; 40 pHead=pHead->next; 41 } 42 pTemp->next=pHead->next; 43 m=pHead->num; 44 pHead=pTemp->next; 45 cout<<m; 46 } 47 cout<<endl; 48 } 49 return 0; 50 }
运行结果: