网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
03月20日
漏签
0
天
c语言吧
关注:
798,920
贴子:
4,351,560
看贴
图片
吧主推荐
视频
游戏
12
回复贴,共
1
页
<<返回c语言吧
>0< 加载中...
用循环链表解决约瑟夫环
只看楼主
收藏
回复
axbhdd
异能力者
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
如标题,不知道该咋弄,总是无法得出正确答案
axbhdd
异能力者
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
源代码在这
void Joseph(Linklist&L,int m)//L指向链表的头节点,m是隔几个删除
{
Linklist p = L;
int i = 0;
while (L->count != 1)
{
p = L;
Linklist q;
i++;
if (i == m)
{
//删除编号为m的节点
q = p->next;
p->next = q->next;
p = q->next;//指向下一个有效节点
free(q);
L->count--; //计数器减一
i = 0; //重置i
}
else
{
p = p->next;
}
}
//输出留下的编号
printf("\n%d", p->data);
}
axbhdd
异能力者
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
生成链表的操作经过调试是没有问题的,就是解决约瑟夫环的函数有问题,求大佬帮我看看问题在哪
艾蕾得
强能力者
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
首先就是,你的LinkList是什么。你传进来了一个引用,但是访问内部数据又用了指针的写法,虽然不是不能这样实现,但你这写得也太怪了。其次,我看了下你的逻辑,你传进来了一个指针(我当做是指针),然后整个复制给另一个LinkList?应该是把头指针复制过去吧。然后你的while循环下面的第一行,你又把linklist整个复制给p,那你下面的else判断里面使p往后走了又有什么意义呢?
axbhdd
异能力者
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
L是指向头结点的指针,头结点只存放了节点的个数
sec
异能力者
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
头结点指错了吧
axbhdd
异能力者
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
这是全部的源代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int count;
int data;
LNode* next;
}LinkNode,*Linklist;
void init_link(Linklist& L)
{
L = (Linklist)malloc(sizeof(LNode));
if (L == NULL) return;
L->next = NULL;
L->count = 0;
}
void creat_link(Linklist& L,int n)
{
int i = 0;
Linklist p = L;
while (i <= n)
{
p = L;
Linklist s = (Linklist)malloc(sizeof(LNode));
if (s == NULL)
{
return;
}
s->data = i+1;
if (L->count == 0)
{
p->next=s;
s->next = L;
i++;
L->count++;
continue;
}
while (p ->next!= L)
{
p = p->next;
}
p->next = s;
s->next = L;
i++;
L->count++;
}
L->count--;
}
void print_link(Linklist& L)
{
Linklist p = L->next;
while (p->next != L)
{
printf("%d ", p->data);
p = p->next;
}
}
void Joseph(Linklist&L,int m)//L指向链表的头节点,m是隔几个删除
{
Linklist p = L;
int i = 0;
while (L->count != 1)
{
Linklist q;
i++;
if (i == m)
{
//删除编号为m的节点
q = p->next;
p->next = q->next;
p = q->next;//指向下一个有效节点
free(q);
L->count--; //计数器减一
i = 0; //重置i
}
else
{
p = p->next;
}
}
//输出留下的编号
printf("\n%d", p->data);
}
int main()
{
Linklist L;
init_link(L);
int x = 0;
int m = 0;
printf("输入猴子个数\n");
scanf_s("%d", &x);
printf("隔几个删除?\n");
scanf_s("%d", &m);
creat_link(L,x);
print_link(L);
Joseph(L, m);
return 0;
}
axbhdd
异能力者
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
调试发现,删了三个节点后就会陷入死循环,不知道为啥
小李寻欢_95
毛蛋
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
d
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示