您的位置:首页 > 职场人生

求职笔试题目(二)

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指向下一个元素

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: