1 /* array_iterate.cpp
2 * 输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。
3 * 从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,
4 * 并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。
5 * 如果计数到达数列尾段,则返回数列首位置继续计数。
6 */
7
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11
12 void array_iterate(int len, int input_array[], int m, int output_array[])
13 {
14 int i = 0, j = 0;
15 int *flag_array = (int *)malloc(len * sizeof(int));
16
17 //判断数组中的数是否已经被取出,初始化全置零,表示未被取出
18 //最开始写的为:memset(flag_array, 0x00, sizeof(flag_array));
19 //结果出错了,原因是函数传参过程中的指针降级
20 //导致sizeof(flag_array)返回的是一个指针类型大小的的字节数
21 memset(flag_array, 0x00, len * sizeof(int));
22
23 for (i = 0, j = 0; i < len; i++)
24 {
25 while (m)
26 {
27 if (!flag_array[j])
28 {
29 m--;
30 }
31 if (j != len - 1)
32 {
33 j++;
34 }
35 else
36 {
37 j = 0;
38 }
39 }
40
41 if (j)
42 {
43 output_array[i] = input_array[j - 1];
44 flag_array[j - 1] = 1;
45 }
46 else
47 {
48 output_array[i] = input_array[len - 1];
49 flag_array[len - 1] = 1;
50 }
51
52 m = output_array[i];
53 }
54 }
55
56 int main()
57 {
58 int len = 0, m = 0;
59 int i = 0, input_flag = 0;
60
61 //为了提高程序的鲁棒性,写了下面一段循环
62 //此处关键是flushall()的使用,如果不使用
63 //由于键盘输入缓存的存在使得程序陷入死循环
64 //关于flush()参见我的下一篇博客
65 while (!input_flag)
66 {
67 printf("请输入数列的长度:");
68 input_flag = scanf("%d", &len);
69 if (!input_flag)
70 {
71 printf("输入有误,仅可输入数字!\n");
72 flushall();
73 }
74 }
75
76 int *input_array = (int *)malloc(len * sizeof(int));
77 int *output_array = (int *)malloc(len * sizeof(int));
78
79 //input_flag使用后要重置
80 input_flag = 0;
81 while (!input_flag)
82 {
83 printf("请输入初始数列:");
84 for (i = 0; i < len; i++)
85 {
86 input_flag = scanf("%d", &input_array[i]);
87 if (!input_flag)
88 {
89 printf("输入有误,仅可输入数字!\n");
90 flushall();
91 break;
92 }
93 }
94 }
95
96 //printf("请输入初始数列:");
97 //for (i = 0; i < len; i++)
98 //{
99 // scanf("%d", &input_array[i]);
100 //}
101
102 //printf("请输入初始计数值:");
103 //scanf("%d", &m);
104
105 input_flag = 0;
106 while (!input_flag)
107 {
108 printf("请输入初始计数值:");
109 input_flag = scanf("%d", &m);
110 if (!input_flag)
111 {
112 printf("输入有误,仅可输入数字!\n");
113 flushall();
114 }
115 }
116
117 array_iterate(len, input_array, m, output_array);
118 printf("数值出列的顺序为:");
119 for (i = 0; i < len; i++)
120 {
121 printf("%d ", output_array[i]);
122 }
123 printf("\n");
124
125 return 0;
126 }
127
128
129
130 //以下是网上找到的代码,空间复杂度比我的小
131 //使用到了循环链表,但是鲁棒性不好
132
133 //#include <stdio.h>
134 //#include <stdlib.h>
135 //#include <string.h>
136 //
137 //typedef struct Node
138 //{
139 // int num;
140 // struct Node *next;
141 //}node;
142 //
143 //node *creat(int len, int input_array[])
144 //{
145 // node *h, *s, *p;
146 // int i;
147 // h = (node *)malloc(sizeof(node));
148 // h->num = input_array[0];
149 // p = h;
150 // for (i = 1; i < len; i++)
151 // {
152 // s = (node *)malloc(sizeof(node));
153 // s->num = input_array[i];
154 // p->next = s;
155 // p = s;
156 // }
157 // p->next = h;
158 //
159 // return (h);
160 //}
161 //
162 //void array_iterate(int len, int input_array[], int m)
163 //{
164 // node *q, *p, *s;
165 // int i = 0, j = 0, k;
166 // int output_array[4];
167 // p = creat(len, input_array);
168 // while (p->next != p)
169 // {
170 // for (i = 1; i < m; i++)
171 // {
172 // q = p;
173 // p = p->next;
174 // }
175 // m = p->num;
176 // //printf("%5d", m);
177 //
178 // output_array[j++] = m;
179 //
180 // s = p;
181 // q->next = p->next;
182 // p = p->next;
183 // free(s);
184 // s = NULL;
185 // }
186 //
187 // m = p->num;
188 // //printf("%5d\n", m);
189 // output_array[j] = p->num;
190 // k = j;
191 // for (j = 0; j <= k; j++)
192 // {
193 // printf("%5d", output_array[j]);
194 // }
195 //}
196 //
197 //int main()
198 //{
199 // int input_array[] = {3, 1, 2, 4};
200 // int len = 4;
201 // int m = 7;
202 // int output_array[4];
203 // array_iterate(len, input_array, m);
204 //}