原题:
输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置
开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始
计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程实现上述计
数过程,同时输出数值出列的顺序。
问题分解为:1.找到那个要删除的数的数组下标 即delIndex。
2.删除数组里的这个数。
删除数组里的这个数的函数
void deleteArrayElement(int a[],int len,int pos)
{
while(pos < (len - 1))
{
a[pos++] = a[pos + 1];
}
}
找那个要删除的数可以根据题目的要求,用上次的delIndex和计数器m计算得到。
链表实现:
题目:
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int i;
struct Node * next;
}LinkList;
LinkList * create(int n)
{
LinkList * head,* p,* q;
q = (LinkList *)malloc(sizeof(LinkList));
int i = 1;
q->i = i;
head = q; //create link header
for(i = 2;i <= n;i++)
{
p = (LinkList *)malloc(sizeof(LinkList));
p->i = i;
q->next = p;
q = p;
}
q->next = head;
return head;
}
void fun(LinkList * head,int m)
{
LinkList * p,* q,* s;
p = head;
while(p->next != p)
{
for(int i = 1;i < m;i++)
{
q = p;
p = p->next;
}
printf("%2d",p->i);
s = p;
q->next = p->next;
p = p->next;
free(s);
}
printf("%2d",p->i);
}
void main()
{
int n = 5;
LinkList * head = create(5);
int m = 4;
fun(head,4);
}