关于环链表的问题

fengni99 2009-09-23 08:56:25
各位大虾,我刚学不久单链表
现有个问题希望高手指教,急用
题目是这样的:
13人围成一圈,从第一个人开始顺序报号1、2、3.凡报到“3”者退出圈子,找到最后留在圈子中的人,输出他原来的序号
编程要求:使用环形链表。
#include<iostream>
using namespace std;
#define N 13
struct node{
int data;
node*next;
};
node*Huan_Creat()//建立(尾结点插入法形成环链)
{ node*head,*n,*tail;
int a,i=0;
head=NULL;
cout<<"请输入"<<N<<"个同学的编号:\n";
for(cin>>a;i<N;cin>>a,i++)
{ n=new node;
n->data=a;
if(!head)tail=head=n;
else tail->next=n,tail=n;
}
if(head)tail->next=head;
return head;
}
void Print(const node*head)//输出
{cout<<"链表上各结点的数据为:\n";
while(head)
{cout<<head->data<<'\t';
head=head->next;
}
cout<<'\n';
}
int delete_smnode(node*h)//删除指定结点
{node*p;
int m=0,y=0;
for(;m<N;m++)
{p=h;h=h->next;
if(m%3==0){delete p;y++;}//y是用来记录共有几个被删除的,以便于释放
}
return y;
}
void deletechain(node*h,int c)//释放
{node*p;
int r=0;
while(r<N-c)
{p=h;h=h->next;delete p;r++;}
}
int main()
{node*head;
int z;
head=Huan_Creat();
delete_smnode(head);
z=delete_smnode(head);
Print(head);
deletechain(head,z);
return 0;
}
调试不出来,这是咋回事啊
...全文
293 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengni99 2009-09-26
  • 打赏
  • 举报
回复
还是约瑟夫换好啊!
就是有点看不懂
技术不行啊
thy38 2009-09-24
  • 打赏
  • 举报
回复
Python都上来了?
yuqiyue1106 2009-09-24
  • 打赏
  • 举报
回复
调试一下,看是不是指针出了问题
steven_007 2009-09-24
  • 打赏
  • 举报
回复
路过
mstlq 2009-09-24
  • 打赏
  • 举报
回复
楼主还是google“约瑟夫环”吧……
大量优质代码可供参考……
fengni99 2009-09-24
  • 打赏
  • 举报
回复
回复三楼:
高手!谢谢啦!在主函数里调用了两次,应该是这里的错误
fengni99 2009-09-24
  • 打赏
  • 举报
回复
还有这题编译的时候没有错误
应该是逻辑上的错误
但是在哪里就不好找了
fengni99 2009-09-24
  • 打赏
  • 举报
回复
这题确实很让我头大
怪我没介绍清楚
我的思路是这样的
首先建个环形链表,
再让表内的数据域按号循环,依次删除不符合的结点,同时记录不符合的结点个数,以便在释放的时候用循环逐个释放
然后也就得到了余下的那个编号(可能不是一个),而且可以得到余下的个数,这就可以让其在DOS里显示了
dskit 2009-09-23
  • 打赏
  • 举报
回复
约瑟夫换问题,参见O(n)算法:


#!/usr/bin/env python

def Josephus():
N = int(raw_input('N: '))
M = int(raw_input('M: '))

Alive = 0

for i in range(2, N + 1):
Alive = (Alive + M) % i

return Alive + 1

if __name__ == '__main__':
print Josephus()
raw_input()
quan123a 2009-09-23
  • 打赏
  • 举报
回复
还有delete_smnode函数,里面有错误,你删了p后,p前个结构没有指向后后面的结构,你可能要重写这个函数
quan123a 2009-09-23
  • 打赏
  • 举报
回复
intmain 函数里面多了条 delete_smnode 函数
Print函数里面陷入死循环了,应该加入个临时的指针用来头检测退出,你的单链表是循环的
主要是上面两个错误
deletechain 函数根本就不需要写得那么复杂,让别人看得头晕死,直接 delete head 不就好了
whg01 2009-09-23
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20090923/00/5f9477c9-c0f6-4214-ad59-8fe055fe1904.html 看看这个吧,我的回复在3楼。估计你俩是同学。
delete_smnode这个函数,你是想删除一个节点,还是想不停的删除直到只剩下一个节点?
如果只想删除一个,那么这个函数你要调用N-1次。
如果不停的删,则只需要调用一次。
不管哪种方法,函数里面的逻辑都要改。
另外,这个函数应该返回node*,因为head也可能被删除。
单向链表,删除当前节点,要把上一个和下一个链起来。针对你这个题目,还有个更简便一点的做法:因为能知道下一个节点是不是要删除的,所以可以转变为删除下一个节点。这样可以少一个变量。

要改的地方太多,分太少,你自己改吧。而且这样更锻炼你自己。
link_biao 2009-09-23
  • 打赏
  • 举报
回复
我的VC刚删了,应该把编译信息一起帖出来,如第几行第几行有问题——虽然不一定对,但至少缩小了范围

65,206

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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