lemon3 发表于 2018-12-16 11:02:21

约瑟夫问题循环链表小故障

请教dalao约瑟夫问题,我想用循环链表实现,但是要求人数超过10的时候,要十个一行地输出(这是需要解决的问题),该怎么办呢
代码和网上的差不多,只有少量修改,请大佬帮助
#include <stdlib.h>
#include <stdio.h>

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int ElemType;
typedef int Status;
typedef struct LNode {
    ElemType data;
    struct LNode *next;
} LNode;
typedef LNode *LinkList;
LinkList Joseph;

Status InitList_Sq(LinkList L, int n) {
    int i;
    LinkList pNew, pTail;
    for (i = n; i >= 1; --i) {
      pNew = (LinkList) malloc(sizeof(LNode));
      if (NULL == pNew) exit(OVERFLOW);
      pNew->data = i;
      pNew->next = L;
      L = pNew;
      if (i == n)
            pTail = pNew;
    }
    pTail->next = L;
    Joseph = L;
    return OK;
}

Status DoJoseph(LinkList L, int k, int n, int m) {
    LinkList p, pNext;
    int i;
    if (!InitList_Sq(L, n)) exit(OVERFLOW);
    p = Joseph;
    for (i = 0; i < k - 1; ++i)
      p = p->next;
    while (p) {
      for (i = 0; i < m - 2; ++i)
            p = p->next;
      pNext = p->next;
      printf("%d ", pNext->data);
      if (p->next == p)
            p = NULL;
      else {
            p->next = pNext->next;
            p = p->next;
            free(pNext);
      }
    }
    L = NULL;

}

int main(){
    int m,n,k;
    LinkList L;
    L=NULL;
    scanf("%d%d%d",&n, &k, &m);
    if(n<1||m<1||k<1)
        {
                printf("n,m,k must bigger than 0.\n");
        }
        else if(k>n)
        {
                printf("k should not bigger than n.\n");
        }
        else
        {
                InitList_Sq(L,n);
            DoJoseph(L,k,n,m);
        }
   
    return 0;
}

lemon3 发表于 2018-12-16 12:23:40

现在还剩最后一个问题,如何判断输出项最后一个

lemon3 发表于 2018-12-16 12:43:15

测试用例如下,请问还有好的测试办法吗?
页: [1]
查看完整版本: 约瑟夫问题循环链表小故障