m0_70920332 2024-01-05 10:10 采纳率: 0%
浏览 2

循环链表的头节点的识别C++

为什么代码不循环


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

typedef struct LNode {
    int data;
    struct LNode* next;
} LNode, * LinkList;

bool InitList(LinkList& L) {
    L = (LNode*)malloc(sizeof(LNode));  // 分配一个头结点
    if (L == NULL)  // 内存不足分配失败
        return false;
    L->next = L;
    return true;
}

bool ListInsert(LinkList& L, int n) {
    LinkList p, s;
    p = L;
    for (int i = 1; i <= n; i++) {
        s = (LNode*)malloc(sizeof(LNode));
        if (s == NULL)  // 内存不足分配失败
            return false;
        s->data = i;
        s->next = p->next;
        p->next = s;
        p = s;
        if (i == n) {
            p = p->next->next;
        }
    }
    return true;
}

void Josephus(LinkList L, int m,int n) {
    LinkList p = L->next,s=L->next;
    while (n!=1) {
        for (int i = 1; i < m; i++) {
            if (p->next == s)p = p->next->next;
            else
            p = p->next;
        }
        if (p->next->next == s->next)
            p = p->next->next;
        LinkList q = p->next;
        free(q);
        n--;// 将p指向下一个节点,继续循环
    }
    printf("%d", p->data);
    free(p);
}

int main() {
    LinkList L;
    int n, m;
    scanf_s("%d%d", &n, &m);

    InitList(L);
    ListInsert(L, n);

    Josephus(L, m,n);

    free(L);

    return 0;
}
  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2024-01-05 12:19
    关注

    【相关推荐】



    • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7537199
    • 这篇博客你也可以参考下:队列链式存储结构的C++模板类头文件源代码实现
    • 您还可以看一下 高升老师的零基础C++程序设计课程中的 变量的类型与声明小节, 巩固相关知识点
    • 除此之外, 这篇博客: 双向链表+迭代器的C++实现中的 双向链表的概述 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

      写链表首先要对链表的构成有一个很好的了解,那么完成一个链表我们需要完成什么呢?

      1. 节点的定义
        对于双向链表,每一个节点都与其前驱、后继的连接,那么这个链接我们通过指向节点的指针来完成。指向节点的指针在解引用之后就是一个节点对象。

      2. 方法的定义
        双向链表因为具有头与尾,所以需要实现的方法有:
        在末尾插入,删除元素
        在链表首部插入、删除元素
        可以像访问数组元素一样使用[]运算符对链表元素进行访问

      3. 迭代器的定义
        首先了解什么是迭代器:

      In computer programming, an iterator is an object that enables a programmer to traverse a container, particularly lists. Various types of iterators are often provided via a container’s interface.
      An iterator is any object that, pointing to some element in a range of elements (such as an array or a container), has the ability to iterate through the elements of that range using a set of operators (with at least the increment (++) and dereference (*) operators).

      最典型的迭代器就是指针,在数组之中可以使用指针对数组进行遍历。但在其他的容器中简单的指针并不能完成这样的活动,所以我们应该使用迭代器来对不同容器完成统一的遍历访问功能。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 1月5日

悬赏问题

  • ¥15 这种情况的伯德图和奈奎斯特曲线怎么分析?
  • ¥50 paddleocr带斜线的0很容易识别成9
  • ¥15 电子档案元素采集(tiff及PDF扫描图片)
  • ¥15 flink-sql-connector-rabbitmq使用
  • ¥15 zynq7015,PCIE读写延时偏大
  • ¥15 使用spss做psm(倾向性评分匹配)遇到问题
  • ¥20 vue+UEditor附件上传问题
  • ¥15 想做个WPS的自动化代码,不知道能做的起不。
  • ¥15 uniApp,生成安卓安卓包后,黑暗主题中间内容不生效,底部导航正常
  • ¥15 斯坦福自动漂移非线性模型反解