您的位置:首页 > 其它

华为笔试题目--约瑟夫环(Joseph)修改版

2007-07-23 20:24 417 查看
[b]测试空间旗下大头针出品[/b]
这个可是已经运行通过了的。大家可以看看,如果有什么问题,及时交流。

#include<stdio.h>
#include<stdlib.h>
typedef struct Node *PNode;

struct Node {
int num;
int key;
PNode next;
};

typedef struct Node *Linklist;

bool InitList(Linklist *L)//建立一个空链表
{
(*L)=NULL;

return 1;
}
/*
void destroyList(Linklist *L)//撤销链表
{
PNode p;
p=*L;
free(p);
}*/

bool MakeNode( PNode *p,int e,int n)//分配由p指向的数据元素为e,编号为n,后继为空的结点,并返回TRUE,若分配失败,则返回FALSE;
{
*p=(PNode) malloc(sizeof(Node));
if(!*p) return false;
(*p)->key=e;
(*p)->num=n;
(*p)->next=NULL;
return true;
}

void Append(Linklist *L, PNode s)//将s所指向的结点链接到链表尾部
{
if(*L)
{
PNode p;
p=*L;
while(p->next!=*L) p=p->next;
p->next=s;
s->next=*L;
}
else
{
*L=s;
s->next=*L;
}
}

void DeleteNode(Linklist *L, PNode p)//从链表中删除p所指向的结点,并打印该结点的编号
{
PNode temp;
temp=*L;
while(temp->next!=p) temp=temp->next;
temp->next=p->next;
if(p==*L&&p->next!=p)
*L=p->next;
if(p->next==p)
*L=NULL;
printf("%d/t",p->num);
free(p);

}

void CreatJoseph(int n, Linklist *L)//建立一个长为n的Joseph环,n的上限为30
{
if(n>30) { printf("overflow!!/n"); exit(0); }
InitList(L);
int i;
for(i=1;i<=n;i++)
{
int k;
printf("Please input the key:");
scanf("%d",&k);
PNode p=NULL;
MakeNode(&p,k,i);
Append(L, p);
}
}

void Joseph(Linklist *L, int m)
{
int nm=m;
PNode p,temp;
temp=*L;
while(*L!=NULL)
{
p=temp;
int i=1;
while(i!=nm) { i++; p=p->next; }
nm=p->key;
temp=p->next;
DeleteNode(L,p);

}
}

int main()
{
int n,m;
printf("Please input the mumbe n and m:");
scanf("%d",&n);
scanf("%d",&m);
Linklist L;
InitList(&L);
CreatJoseph(n, &L);
Joseph(&L, m);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: