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

来源:互联网 发布:java知识 编辑:程序博客网 时间:2024/06/06 06:00

测试空间旗下大头针出品

这个可是已经运行通过了的。大家可以看看,如果有什么问题,及时交流。

#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;
}