求职笔试题目(二)
2008-10-27 20:36
288 查看
链表一类的问题自己还是弄得不是特别熟,发现那天还是把题目做错了。今天在电脑上好好写了下。晕啊,啥时候自己也能成为一个编程达人呢。努力中,努力找工作当中。程序写在下面,这样应该对了吧。呵呵。
//Josephus环问题
/*
设有total 个人围成一圈,对他们进行顺时针编号,从第start个人开始数1,数到第m个人,第m个人出局。
接着从出局人的下一个开始从1数,同样第m个人出局,最终这些人全部出局。请以下面的函数实现将出局
人的次序以双向链表形式实现。
struct node * locate(int total,int start,int m),
其中,struct node {
int order;
node* left;
node* right;
};
*/
#define LENG sizeof(struct node)
struct node
{
int order;
struct node* left;
struct node* right;
};
//环状链表实现
struct node* locate(int total, int start ,int m)
{
struct node* cp1,*cp2,*head;// 创建环状链表时用到的指针
struct node* cpp1,*cpp2,*head2;//创建出局顺序的链表
struct node* p1,*p2,*fpointer; //进行计数M 时用到的指针
int i,j,k;//循环变量
if(total<1 || start<1 || m<1)
exit(3);
//开始创建环形链表队列
cp1=(struct node*)malloc(LENG);
cp1->left=cp1->right=NULL;
cp1->order=1;
head=cp2=cp1;
for(i=2;i<=total;i++)
{
cp1=(struct node*)malloc(LENG);
cp1->order=i;
cp1->right=NULL;
cp1->left=cp2;
cp2->right=cp1;
cp2=cp1;
}
cp2->right=head;
head->left=cp2;
//创建一个非环形链表用于标志出局顺序
cpp1=(struct node*)malloc(LENG);
cpp1->left=cp1->right=NULL;
cpp1->order=1;
head2=cpp2=cpp1;
for(i=2;i<=total;i++)
{
cpp1=(struct node*)malloc(LENG);
cpp1->order=i;
cpp1->right=NULL;
cpp1->left=cpp2;
cpp2->right=cpp1;
cpp2=cpp1;
}
p1=head;
p2=head2;
//将出局顺序写入新的双向链表中
for(k=1;k<start%total;k++)//第一个循环将从第start%total个人开始数
{
fpointer=p1;
p1=p1->right;
}
for(i=2;i<=total;i++)
{
for(j=1;j<m%total;j++)
{
fpointer=p1;
p1=p1->right;
}
p2->order=p1->order;//数到第m个人,将这个人的序列号安排在链表2的最左面元素中
p2=p2->right; //链表2指向下一个元素
fpointer->right=p1->right;//链表1删除掉第m个元素后,将此元素以后的首元素左指针向前移
free(p1);//将p1释放
p1=fpointer->right;//链表1指向下一个元素
}
}
//Josephus环问题
/*
设有total 个人围成一圈,对他们进行顺时针编号,从第start个人开始数1,数到第m个人,第m个人出局。
接着从出局人的下一个开始从1数,同样第m个人出局,最终这些人全部出局。请以下面的函数实现将出局
人的次序以双向链表形式实现。
struct node * locate(int total,int start,int m),
其中,struct node {
int order;
node* left;
node* right;
};
*/
#define LENG sizeof(struct node)
struct node
{
int order;
struct node* left;
struct node* right;
};
//环状链表实现
struct node* locate(int total, int start ,int m)
{
struct node* cp1,*cp2,*head;// 创建环状链表时用到的指针
struct node* cpp1,*cpp2,*head2;//创建出局顺序的链表
struct node* p1,*p2,*fpointer; //进行计数M 时用到的指针
int i,j,k;//循环变量
if(total<1 || start<1 || m<1)
exit(3);
//开始创建环形链表队列
cp1=(struct node*)malloc(LENG);
cp1->left=cp1->right=NULL;
cp1->order=1;
head=cp2=cp1;
for(i=2;i<=total;i++)
{
cp1=(struct node*)malloc(LENG);
cp1->order=i;
cp1->right=NULL;
cp1->left=cp2;
cp2->right=cp1;
cp2=cp1;
}
cp2->right=head;
head->left=cp2;
//创建一个非环形链表用于标志出局顺序
cpp1=(struct node*)malloc(LENG);
cpp1->left=cp1->right=NULL;
cpp1->order=1;
head2=cpp2=cpp1;
for(i=2;i<=total;i++)
{
cpp1=(struct node*)malloc(LENG);
cpp1->order=i;
cpp1->right=NULL;
cpp1->left=cpp2;
cpp2->right=cpp1;
cpp2=cpp1;
}
p1=head;
p2=head2;
//将出局顺序写入新的双向链表中
for(k=1;k<start%total;k++)//第一个循环将从第start%total个人开始数
{
fpointer=p1;
p1=p1->right;
}
for(i=2;i<=total;i++)
{
for(j=1;j<m%total;j++)
{
fpointer=p1;
p1=p1->right;
}
p2->order=p1->order;//数到第m个人,将这个人的序列号安排在链表2的最左面元素中
p2=p2->right; //链表2指向下一个元素
fpointer->right=p1->right;//链表1删除掉第m个元素后,将此元素以后的首元素左指针向前移
free(p1);//将p1释放
p1=fpointer->right;//链表1指向下一个元素
}
}
相关文章推荐
- .NET求职笔试题目(续) 转载
- .NET求职笔试题目(续)
- 求职笔试题目
- 针对产品经历笔试很好的一篇资料:应届生求职助理产品经理岗位,总是通不过笔试,下面是我一次笔试题目的答案,请问出了什么问题?
- .NET求职笔试题目(续) 转载
- android面试题目大全<完结部分>,android笔试题目集锦
- 求职面试必看:巨牛的招聘题目
- 找工作知识储备(3)---从头说12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用
- 2012九月3号阿里巴巴笔试题目
- 百度笔试题目剖析——拼写纠错
- C/C++ 笔试、面试题目大汇总
- moto & google笔试题目-STL/C++面试题
- 中兴笔试题目总结(二)数据库部分
- 常见笔试面试题目与解析(1)
- 牛客网-专业IT笔试面试备考平台,最全C++JAVA前端求职题库,全面提升IT编程能力
- C/C++笔试题目大全
- 九度OJ 1525 子串逆序打印 -- 2012年Google校园招聘笔试题目
- 笔试题目总结1
- 高深笔试题目(嵌入式软件开发)
- 腾讯招聘笔试题目