约瑟夫环c语言代码指针函数,JavaScript使用指针操作实现约瑟夫问题实例

本文实例讲述了JavaScript使用指针操作实现约瑟夫问题的方法。分享给大家供大家参考。具体分析如下:

实现之前当然要自己来编写一些 JS 数组内部指针的操作函数,就像:reset(), current(), next(), prev(), search(), end() 这些函数,我们都要来自己实现,因为 JS 没有内置这些神奇的操作函数

Array.prototype.pointer = 0;//模拟数组内部指针

//Reset 函数,将数组内部指针归位(指向第一个元素)

var reset = function(arrayObj){

if(!(arrayObj instanceof Array)){

alert("Reset() 函数参数类型错误!请检查输入!");

return;

}

arrayObj.pointer = 0;

}

//Current 函数,返回数组内部指针指向的当前元素

var current = function(arrayObj){

if(!(arrayObj instanceof Array)){

alert("Current() 函数参数类型错误!请检查输入!");

return;

}

return arrayObj[arrayObj.pointer];

}

//End 函数,将数组内部指针指向最后一个元素

var end = function(arrayObj){

if(!(arrayObj instanceof Array)){

alert("End() 函数参数类型错误!请检查输入!");

return;

}

arrayObj.pointer = arrayObj.length - 1;

return arrayObj[arrayObj.pointer];

}

//Next 函数,将数组内部指针下移一位

//如果已经指向最后一个元素则返回 FALSE

var next = function(arrayObj){

if(!(arrayObj instanceof Array)){

alert("Next() 函数参数类型错误!请检查输入!");

return;

}

arrayObj.pointer ++;

if(typeof arrayObj[arrayObj.pointer] == 'undefined'){

arrayObj.pointer --;

return false;

}

return true;

}

//Prev 函数,将数组内部指针上移一位

//如果已经指向第一个元素则返回 FALSE

var prev = function(arrayObj){

if(!(arrayObj instanceof Array)){

alert("Prev() 函数参数类型错误!请检查输入!");

return;

}

arrayObj.pointer --;

if(typeof arrayObj[arrayObj.pointer] == 'undefined'){

arrayObj.pointer ++;

return false;

}

return arrayObj[arrayObj.pointer];

}

//Unset 函数,删除指定的数组元素

var unset = function(index, arrayObj){

if(!(arrayObj instanceof Array)){

alert("Unset() 函数参数类型错误!请检查输入!");

return;

}

if(typeof arrayObj[index] == 'undefined'){

alert("Unset() 函数参数 index 错误!不存在此元素!");

return false;

}

arrayObj.splice(index, 1);

return true;

}

//Search 函数,通过数组键值返回数组的键名

var search = function(value, arrayObj){

if(!(arrayObj instanceof Array)){

alert("Search() 函数参数类型错误!请检查输入!");

return;

}

for(index in arrayObj){

if(arrayObj[index] == value){

return index;

}

}

return false;

}

//getKingMonkey 函数,我们的约瑟夫主函数,n 只猴子,数到 m

function getKingMonkey(n, m){

a = new Array();

for(i = 1; i <= n; i ++){

a[i] = i;

}

a[0] = 0;unset(0, a);reset(a);

while(a.length > 1){

for(counter = 1; counter <= m; counter ++){

if(next(a)){

if(counter == m){

unset(search(prev(a), a), a);

}

}else{

reset(a);

if(counter == m){

unset(search(end(a), a), a);

reset(a);

}

}

}

}

return current(a);

}

alert("猴子大王的编号为:" + getKingMonkey(100, 17));

希望本文所述对大家的javascript程序设计有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用指针实现问题C语言代码: ```c #include <stdio.h> #include <stdlib.h> typedef struct _node { int value; struct _node *next; } Node; Node *createList(int n) { Node *head = NULL, *prev = NULL, *new_node = NULL; int i; for (i = 1; i <= n; i++) { new_node = (Node *)malloc(sizeof(Node)); new_node->value = i; new_node->next = NULL; if (head == NULL) { head = new_node; } else { prev->next = new_node; } prev = new_node; } prev->next = head; return head; } void josephus(int n, int m) { Node *head = createList(n); Node *p = head, *prev = NULL; int i; while (p->next != p) { for (i = 1; i < m; i++) { prev = p; p = p->next; } prev->next = p->next; printf("%d ", p->value); free(p); p = prev->next; } printf("%d\n", p->value); free(p); } int main() { int n, m; scanf("%d%d", &n, &m); josephus(n, m); return 0; } ``` 在这个实现中,我们使用了一个链表来表示所有的人。在创建链表时,我们将最后一个人的next指向了第一个人,使得链表形成了一个。 接着,在问题的解法中,我们使用两个指针p和prev来遍历链表。当p指向第m个人时,我们将prev的next指向p的next,然后释放p的内存。最后,我们将p指向prev的下一个人,重新开始遍历。当链表中只剩下一个人时,我们输出该人的编号并释放其内存。 需要注意的是,在释放节点的内存时,我们应当先将p指向p的next,再释放p的内存。这是因为在释放p之后,我们无法再访问p的next指针,因此需要在释放p之前,先将其next指针保存下来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值