1. 程式人生 > >華為筆試題目--約瑟夫環(Joseph)修改版

華為筆試題目--約瑟夫環(Joseph)修改版

測試空間旗下大頭針出品

這個可是已經執行通過了的。大家可以看看,如果有什麼問題,及時交流。

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