For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
昆明达内问:要处理“猴子选大王”的经典问题——一群猴子,手拉手排成一个圆,从任意一只猴子开始从1开始报数,当遇到要排除的数(预先设定)时该猴子退出该圈,从下一只猴子开始继续从1报数,如此反复,最终剩下的猴子便是猴子的大王。嵌入式工程师在用C语言解决这个问题的时候,是怎么做的呢?
第一,用C语言的思维方式进行程序构架构建。
程序分为三大部分:a、数据获取,为了程序的运行,上面的问题要获得猴子的总数,从那只猴子开始和剔除的个数;b、数据运算,需要从一堆数据中剔除相应的数据,注意逻辑的正确;c、提高程序的运行速率,少用循环多用指针。
第二,用C语言进行逻辑实现。
a、 数据获取,通过printf和scanf进行参数的获取。
/* 读入问题条件 */
printf("input total num:");
scanf("%d", &n);
printf("from which num begin:");
scanf("%d", &k);
if(k>n||k==0)
{printf("please input the right begin num");
return 1; }
printf("input the out num:");
scanf("%d", &m);
if(m>n||m==0)
{ printf("please input the right del num");
return 2; }
同时注意异常时的处理,比如上面两个if语句就是异常情况的判断,每种异常情况对应不同的返回值,这样便于程序过程的调试和数据的合法性。
b、 /* 定义链表节点类型 */
typedef struct node
{
int data;
struct node *next;
}linklist;
构建循环链表进行“猴子”的圆圈建设。
/* 创建循环链表,头节点也存信息 */
head = (linklist*) malloc(sizeof(linklist));
p = head;
p->data = 1;
p->next = p;
/* 初始化循环链表 */
for (i = 2; i data = i;
s->next = p->next;
p->next = s;
p = p->next;
}
通过该步骤后,head和p(present)都成了一个“猴子圈”的链表。在该链表的构建过程中需要注意一下几点:内存的开辟,此时遵守使用多少开辟多少的原则。如果一下开辟过多,会引起内存泄露的问题,但是,这个小程序是不会遇到这种问题了。其次是熟悉循环链表的构建方法:链表的尾巴指向链表的头。这个时候有心的话还会联想到双向链表的情况。
c、 /* 找到第 k 个节点 */
p = head;
for (i = 1; i next;
}
找到从第几个位置开始计数。
此时,p指向开始的“猴子”。因为采用了链表方法,这个过程只需要关注p指针的next指向即可。
(1)保存初始的“猴子”圆圈参数
/* 保存节点总数 */
total = n;
printf("the out num:");
q = head;
因为要控制猴子数目,所以保留了全部的数目。其次用q(qurry)来保留剔除猴子前面的链表,并连接剔除猴子后的链表。这样,完成了循环链表的元素删除。
(2)猴子查数
/* 只剩一个节点时停止循环 */
while (total != 1)
{
/* 报数过程,p指向要删除的节点 */
for (i = 1; i next;
}
/* 打印要删除的节点序号 */
printf("[%d] ", p->data);
/* q 指向 p 节点的前驱 */
while (q->next != p)
{
q = q->next;
}
/* 删除 p 节点 */
q->next = p->next;
/* 保存被删除节点指针 */
s = p;
/* p 指向被删除节点的后继 */
p = p->next;
/* 释放被删除的节点 */
free(s);
/* 节点个数减一 */
total--;
}
/* 打印最后剩下的节点序号 */
printf("the last num:[%d] ", p->data);
free(p);
}
猴子查数是整个程序的关键,需要完成以下任务:a、找到开始的“猴子”数;b、删除该“猴子”;c、将删除掉的循环链表首尾连接起来。
第三,使用C语言的指针。
比如本程序的链表指针的定义,p,s,q。
linklist *head, *p, *s, *q;
C语言是计算机程序语言的基础,是实用的程序设计工具,学好C语言对你今后学习JAVA、C++、VB等可以打下良好的基础,因为这些语言大部分都是由C语言扩充或衍生而来的。C可以用于开发比较底层的东西,比如驱动、通信协议之类,在Unix和Linux环境中也是不可或缺的,另外在嵌入式领域也大有作为。
想学习一门专业的IT技术,就来达内昆明IT培训机构:网络营销培训、UI培训、Java培训、web前端、Linux、PHP、C语言、Python等,欢迎来【昆明达内官网】或者电话咨询了解。免费试听课程活动正式启动,限额试听,先报先得。
每个月都有达内学员成功走向岗位
每个月都有新学员加入
梦想的接力棒在新老学员手中不断传递,相信通过几个月努力学习
他们都会找到心仪工作,拿到理想薪资!