约瑟夫环 代码改错

f_312 2023-11-14 22:58:56

#include <stdio.h> 
#include <stdlib.h> 
struct LNode{
    int Num;  //序号 
    int Code;  //密码 
    struct LNode* Next; 
}; 
typedef struct LNode* List;

List CreatList(){
    int count;
    int i; //工具 
    printf("请输入玩游戏的人数:\n");
    scanf("%d",&count);
    List head,L;  //没有头节点,头指针的位置不要动,要不可能就返回空 
    L=head;
    //没有头结点,则第一个单独拎出来 
    List tmp_1=(List)malloc(sizeof(struct LNode));
    tmp_1->Num=1;
    printf("请输入第1个人的密码:\n");
    scanf("%d",&tmp_1->Code);
    tmp_1->Next=tmp_1;
    L=tmp_1;
    for(i=2;i<=count;i++){
        List tmp=(List)malloc(sizeof(struct LNode));
        tmp->Num=i;
        printf("请输入第%d个人的密码:\n");
        scanf("%d",&tmp->Code);
        tmp->Next=tmp_1;   //指向头,形成循环 
        L->Next=tmp;
        L=L->Next; 
    }
    //错误点:未形成循环
    L->Next=head; 
    return head; 
}
//检验链表是否完成
void Display(List L){
    List ptr;
    ptr=L;
    if(ptr){
        do{
            printf("%d",ptr->Code);
            ptr=ptr->Next;
        }while(ptr->Next!=L);
    }
}
void PlayList(List L){
    int m;
    List ptr;   //遍历整个链表的指针 
    printf("请输入报数上限m:\n"); 
    scanf("%d",&m);
    //单独判断表头
    if(L->Code==m){
        printf("%d",L->Num);
        ptr=L; 
        while(ptr->Next!=L){
            ptr=ptr->Next;
        }
        ptr->Next=L->Next;  //链尾指针修改 
        free(L);
        L=ptr->Next;  //链头指针修改 
    }
    while(L->Next){
        if(L->Next->Code==m){
            printf("%d",L->Next->Num);
            m=L->Next->Code;
            //删除这个结点
            List temp;
            temp=L->Next;
            L->Next=temp->Next;
            free(temp);
        }
        L=L->Next;
    }
}

int main()
{
    List L;
    L=CreatList();
    Display(L);
    PlayList(L);
}

改了三天了,还是找不出来,感觉自己就是对的,救救孩子吧

出错的地方:链表显示不出来

要求:

输入:m的初值为20;

n=7;

7个人的密码依次为 3,1,7,2,4,8,4。

    输出:正确的出列顺序为 6,1,4,7,2,3,5。

...全文
108 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
JHline2318 11-15
  • 打赏
  • 举报
回复

我意见PlayList 函数 :(主要你上面这代码,我看不到报数逻辑,反而像是用密码去匹配m)

void PlayList(List L){
    int m;
    List tear;   //遍历整个链表的指针 
    printf("请输入报数上限m:\n"); 
    scanf("%d",&m);
    tear=L;
    int count=1;
    while(tear->Next!=L){  //tear指针指向尾部
        tear=tear->Next;
        count++;
    }
    int j=1;
    while(j<=count){
            for(int i=1;i<m;i++){  //根据m报数轮转,L指向要弹出的元素  
                L=L->Next;
                tear=tear->Next;
            }
            printf("%d",L->Num);  //输出元素序号
            List p=(List)malloc(sizeof(struct LNode));
            p=L;
            m=L->Code;   //m更新为弹出元素的密码
            L=L->Next;   
            tear->Next=L; 
            free(p);
            j++;
    }
}

69,059

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧