Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1294612
  • 博文数量: 168
  • 博客积分: 2124
  • 博客等级: 大尉
  • 技术积分: 2590
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-16 23:51
文章分类

全部博文(168)

文章存档

2014年(6)

2013年(74)

2012年(71)

2011年(17)

分类: LINUX

2013-08-04 23:44:49


点击(此处)折叠或打开

  1. //问题:程序员面试宝典174

  2. #include<stdio.h>

  3. /*************************************************************
  4. 编程思路:
  5. 1.建立起n个节点的循环链表
  6. 2.找出开始报数的第k个人
  7. 3.不断的从链表删除节点,直到链表为空,可以就用节点数n做条件变量

  8. 出错的地方
  9. 1.控制变量选的不好
  10. 2.若删除一个节点,要把这个节点之前的节点用一个临时变量保存起来,
  11.   我之前保存了是这个节点的备份,而不是之前的节点,所以出错。
  12. 3.在控制删除节点的时候,对于m为>2的情况应多一步处理,要是m为1,
  13. 那么直接跳过判断,所以取用了j=m-1
  14. **************************************************************/
  15. typedef struct node
  16. {    
  17.     struct node *next;
  18.     int data;
  19. }node;

  20. //n个人,k开始报数,m出列
  21. void joseph(int n, int k, int m)
  22. {
  23.     //1.建立n个节点的循环链表
  24.     node *p, *t, *cur, *pre;
  25.     int i, j;
  26.     
  27.     p = (node *)malloc(sizeof(node));
  28.     p->data = 0;
  29.     p->next = p;
  30.     
  31.     printf("head established successful! data = %d\n", p->data);
  32.     
  33.     for(i = 1; i < n; i++)
  34.     {
  35.         t = (node *)malloc(sizeof(node));
  36.         t->data = i;
  37.         t->next = p->next;
  38.         p->next = t;
  39.         p = t;    
  40.         printf("Node established successful! data = %d\n", p->data);
  41.     }
  42.     
  43.     //2.找出第k个人,用cur表示,准确说找到第k-1个人,用pre表示
  44.     
  45.     cur = NULL;
  46.     
  47.     while(k--)
  48.     {    
  49.         pre = p;//因为p在上面申请循环链表的时候是指向最后一个节点,这个节点在这保存为下文删除时备份
  50.     //    cur = p->next;
  51.         p = p->next;
  52.     }
  53.     
  54.     //printf("cur->data = %d\n",cur->data);
  55.     while(n--)
  56.     {
  57.         j = m - 1;        //这一步很重要
  58.         cur = pre->next;
  59.         printf("n = %d\n", n);    
  60.         while(j--)
  61.         {    
  62.             pre = cur;
  63.             cur = cur->next;    
  64.         }
  65.         pre->next = cur->next;
  66.         printf("cur->data = %d\n",cur->data);
  67.         free(cur);
  68.         
  69.     }
  70. }

  71. int main(int argc, char argv)
  72. {
  73.     joseph(10, 5, 6);
  74.     while(1);

  75. }






华为题目
 约瑟夫问题


问题描述: 
输入一个由随机数组成的数列(数列中每个数均是大于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。


 要求实现函数: 
void array_iterate(int len, int input_array[], int m, int output_array[])
【输入】 int len:输入数列的长度;
int intput_array[]:输入的初始数列
int m:初始计数值
【输出】 int output_array[]:输出的数值出列顺序
【返回】 无


//解题思路,倘若能将第一个问题写出来,那么对于华为的题目只是相当于多个数组当一层封装罢了
//另外还有一点是这里的m是根据输出变化的,当然实现起来也比较简单



点击(此处)折叠或打开

  1. /**********************************************************************
  2. void array_iterate(int len, int input_array[], int m, int output_array[])
  3. 【输入】 int len:输入数列的长度;
  4. int intput_array[]:输入的初始数列
  5. int m:初始计数值
  6. 【输出】 int output_array[]:输出的数值出列顺序
  7. 【返回】 无
  8. ***************************************************************************/

  9. #include<stdio.h>

  10. typedef struct node{
  11.     int data;
  12.     struct node *next;
  13. }node;

  14. node *node_creat(int input_array[], int len)
  15. {
  16.     node *p, *t;
  17.     int i;
  18.     
  19.     p = (node *)malloc(sizeof(node));
  20.     p->next = p;
  21.     
  22.     for(i = 1;i < len; i++)
  23.     {
  24.         t = (node *)malloc(sizeof(node));
  25.         t->next = p->next;
  26.         p->next = t;
  27.         p = t;
  28.     }
  29.     return p;
  30. }

  31. void array_iterate(int len, int input_array[], int m, int output_array[])
  32. {    
  33.     int i, j, k;
  34.     
  35.     node *pre, *cur, *init, *tmp;

  36.     init = node_creat(input_array, len);

  37.     tmp = init->next;

  38.     for(i = 0; i < len; i++)
  39.     {
  40.         tmp->data = input_array[i];
  41.         tmp = tmp->next;
  42.     }
  43.     //根据输入的数组对循环链表进行初始化
  44.     
  45.     pre = init;
  46.     k = 0;//k is used as output_array
  47.     while(len--)
  48.     {
  49.         j = m - 1;
  50.         cur = pre->next;
  51.         
  52.         while(j--)
  53.         {
  54.             pre = cur;
  55.              cur = cur->next;
  56.         }
  57.         
  58.         pre->next = cur->next;
  59.         m = output_array[k]= cur->data;

  60.         printf(" output_array[%d] = %d\n",k, output_array[k]);
  61.         k++;
  62.         free(cur);
  63.     }    
  64. }

  65. int main(int argc, char **argv)
  66. {
  67.     int input_array[]={3,1,2,4};
  68.     int len=4;
  69.     int m=7;

  70.     int output_array[4];
  71.     array_iterate(len, input_array, m, output_array);
  72.     while(1);
  73. }




最后,还有一种考法就是说刚开始从第k个,可见,就把我们第一种方法里的判断位置的方法应用进来即可。
阅读(876) | 评论(0) | 转发(0) |
0

上一篇:VC 快捷键

下一篇:字符串操作API

给主人留下些什么吧!~~