华为笔试题目--约瑟夫环(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;
}

                      
                      
     
                      
                      
                      
                      
                      
                      
      
         
                  
     
     
    

 


    
    
    


    
    


      
      

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值