春风吹又生.c 2023-10-08 15:24 采纳率: 54.8%
浏览 5
已结题

程序出现问题,但没报错

/5、循环链表的应用(约瑟夫回环问题)
t个数据元素构成一个环,从环中任意位置k开始计数,计到m将该元素从表中取出,重复上述过程,直至表中只剩下一个元素。
提示:用一个无头结点的循环单链表来实现n个元素的存储。
/


#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
    int data;
    struct node* next;
} *linklist;


linklist  creatlist(int n)
{
    linklist p, r,head;
    head= (linklist*)malloc(sizeof(linklist));
    head->data = 1;   //第一个结点元素
    r = head;
    for (int i = 1; i < n; i++) //从第二个元素结点开始
    {
        p= (linklist*)malloc(sizeof(linklist));
        p->data = i + 1;

        //后插法创建单循环链表
        if (i = n - 1)//最后一个结点
        {
            p->next =head ;//最后一个结点指向第一个元素
            r->next = p;
            r = p;
        }
        else
        //p->next = NULL;
        r->next = p;
        r = p;
    }
    return head;
}

void getelem(linklist L,int n,int m,int k)  //共n个数 计到m时取出 从第K个数开始
{
    linklist p,r;
    p = L->next;  //P指向第一个元素结点

    for (int i = 1; i <= k-1; i++)
    {
        p = p->next;    //p指向k,从K开始
    }
    //此时P指向第K个

    for (int j = 0; j < n; j++) //要取出这n个数,需要进行n趟循环
    {
        for (int i = 0; i <= m - 1; i++)
        {
            p = p->next;    //p指向m的前一个
        }

        r = p->next;
        p->next = r->next;
        printf("取出的数是:%d", r->data);
        free(r);
    }

}

int main()
{
    int n, m,k;
    printf("请输入总数、计到要取出来的数、从第几个数开始计数:");
    scanf_s("%d%d%d", &n, &m,&k);    

    linklist L;
    L = creatlist(n);

    getelem(L, n, m, k);




    
    return 0;
}

  • 写回答

2条回答 默认 最新

  • 零之18 2023-10-08 15:43
    关注

    你的代码有一些小错误,我来帮你修复和解释一下。

    1. creatlist 函数中,你创建了一个头结点 head,但没有分配内存给它。你应该改成这样:
    linklist head = (linklist)malloc(sizeof(struct node));
    
    1. creatlist 函数中,你有一个条件语句 if (i = n - 1),但这里应该使用双等号 == 来进行比较,否则它实际上是在赋值而不是比较。应该改成这样:
    if (i == n - 1)
    
    1. getelem 函数中,你需要在 printf 函数中加上换行符,否则输出可能会混在一起。应该改成这样:
    printf("取出的数是:%d\n", r->data);
    
    1. 最后,在 getelem 函数中,你没有考虑到循环链表的特性,即在删除节点后,循环链表的头节点需要更新为下一个节点。你需要添加以下代码:
    L->next = p->next; // 更新头节点指向下一个节点
    

    这些修复后的代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct node
    {
        int data;
        struct node* next;
    } *linklist;
    
    linklist creatlist(int n)
    {
        linklist p, r, head;
        head = (linklist)malloc(sizeof(struct node));
        head->data = 1;   // 第一个结点元素
        r = head;
        for (int i = 1; i < n; i++) // 从第二个元素结点开始
        {
            p = (linklist)malloc(sizeof(struct node));
            p->data = i + 1;
    
            // 后插法创建单循环链表
            if (i == n - 1) // 最后一个结点
            {
                p->next = head; // 最后一个结点指向第一个元素
                r->next = p;
                r = p;
            }
            else
            {
                r->next = p;
                r = p;
            }
        }
        return head;
    }
    
    void getelem(linklist L, int n, int m, int k) // 共n个数 计到m时取出 从第K个数开始
    {
        linklist p, r;
        p = L->next; // P指向第一个元素结点
    
        for (int i = 1; i <= k - 1; i++)
        {
            p = p->next; // p指向k,从K开始
        }
        // 此时P指向第K个
    
        for (int j = 0; j < n; j++) // 要取出这n个数,需要进行n趟循环
        {
            for (int i = 0; i <= m - 1; i++)
            {
                p = p->next; // p指向m的前一个
            }
    
            r = p->next;
            p->next = r->next;
            printf("取出的数是:%d\n", r->data);
            free(r);
        }
    
        L->next = p->next; // 更新头节点指向下一个节点
    }
    
    int main()
    {
        int n, m, k;
        printf("请输入总数、计到要取出来的数、从第几个数开始计数:");
        scanf("%d%d%d", &n, &m, &k);
    
        linklist L;
        L = creatlist(n);
    
        getelem(L, n, m, k);
    
        return 0;
    }
    

    这些更改应该能够修复你的程序并使其按预期工作。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月16日
  • 已采纳回答 10月8日
  • 创建了问题 10月8日

悬赏问题

  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥15 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
  • ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
  • ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?