c++的链表问题

ysf1466123304 2012-12-28 11:17:35
#include<iostream>
using namespace std;
struct Node2//申明一个节点类型
{
int password;//密码
char name;//名字
}pNode[100];
struct Node1//申明一个节点类型
{
int values;//申明一个值
Node1 *next;//申明一个指向下一位的指针
};
void create(Node1 * first,int n)//构建一个循环链表
{ int m;
Node1 * q=new Node1;//申明一个新的节点
q=first;
cout<<"输入第1个数的值"<<endl;
cin>>first->values;//first的vlaues域赋值
for(int i = 2;i<=n;i++)
{
cout<<"输入第"<<i<<"个的信息"<<endl;
cin>>m;
Node1 * s= new Node1;//申请一个新的节点用于向链表中插入新值
s->values=m;
s->next=first;
q->next=s;
q=q->next;
//cout<<q->values;
//delete(s);//删除一个节点,避免空间的浪费
}
}
void josephs2(Node1 * first,int n)
{
Node1 * p=new Node1;//申请一个新的节点用于循环操作
p=first;
int k; int x;
cout<<"输入间隔k"<<endl;//输入要循环的间隔
cin>>k;
for(int j=0;j<n;j++)//循环全部出局的次数
{
for(int i=0;i<k-2;i++)//将指针指向下一个要出局的位置
{
p=p->next;
}
x=p->next->values;//保存要把删除的数据
// delete(p->next);
cout<<x<<" ";
p->next = p->next->next;//将下一个节点链上来
p=p->next;

}
}
//约瑟夫环(一维结构体数组实现)
void josephs1(int a[],int n,int m,int k)//约瑟夫环 (数组实现)函数
{

m=(m+k)%n;//循环定义起始点的位置
cout<<" "<<a[m]<<endl;

for(int i=0;i<n-m;i++)
{//将排除的值删除
a[m+i]=a[m+1+i];
}
n--;
if(n>0){
josephs1(a,n,m,k);//利用递归进行循环操作
}
else cout<<"结束"<<endl;
}

//约瑟夫环(循环单链表的实现)


void josephs3(Node2 pNode[],int m,int k,int n)
{

m=(m+k)%n;//定义循环的初始位置
cout<<pNode[m].name<<" "<<pNode[m].password<<endl;//输入节点信息
for(int i=0;i<n-m;i++)//删除出局的节点
{
pNode[m+i]=pNode[m+1+i];
}
n--;
int d=pNode[m].password-2;
if(n>0){
josephs3(pNode,m,d,n);//应用递归进行巡回
}
}void main()
{
int h;int nums; int k,n,a[100],j,c,i;
Node1 *first=new Node1;
first->next =first;
loop: cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<"★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆";
cout<<"★☆ 选择菜单 ☆★";
cout<<"★☆ 1---------- 约瑟夫环 (数组实现) ☆★";
cout<<"★☆ 2---------- 约瑟夫环(循环单链表的实现) ☆★";
cout<<"★☆ 3---------- 约瑟夫环(一维结构体数组实现) ☆★";
cout<<"★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆";
cout<<" 请选择要进行的操作:"<<endl;
cin>>h;
switch(h){
case 1:
cout<<"输入间隔的值k"<<endl;
cin>>k;
cout<<"输入实验的个数n"<<endl;
cin>>n;
k=k-1;
for(i=0;i<n;i++)
{
cout<<"输入第"<<i<<"个数据"<<endl;
cin>>j;
a[i]=j;
}
josephs1(a,n,0,k);
system("pause");
goto loop;
break;
case 2:
cout<<"输入人数"<<endl;
cin>>nums;
create(first,nums);
josephs2(first,nums);
system("pause");
goto loop;
break;
case 3:
cout<<"输入实验的个数c"<<endl;
cin>>c;
for(int j =0;j<c;j++)
{
cout<<"输入第"<<j+1<<"个数据 密码 姓名"<<endl;
cin>>pNode[j].password;
cin>>pNode[j].name;
}
josephs3(pNode,0,0,c);
system("pause");
goto loop;
break;
} }
求高人指点红色部分的代码是如何运行的,能解释清楚就更好了,刚学链表,希望大侠指教(举个例子就更好)
比如按3输入人数6人,前六个人的密码,和名字分别是2 t,4 y,6 w,1 d,9 v,5 h 输出的结果是t 2,d 1,w 6,h 5,y 4,9 v 求解释,谢了
...全文
72 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ysf1466123304 2012-12-29
  • 打赏
  • 举报
回复
我还是有点不明白,高人,int d=pNode[m].password-2; //下一个要删除的人 后面为什么要减2,求解释,还有猜测是从第m个人起始,删除从它开始第d个人(循环数) m刚开始不是为0吗,第0个人的密码小于2怎么搞,求指点
羽飞 2012-12-29
  • 打赏
  • 举报
回复
void josephs3(Node2 pNode[],int m,int k,int n) { m=(m+k)%n;//定义循环的初始位置 cout<<pNode[m].name<<" "<<pNode[m].password<<endl;//输入节点信息 for(int i=0;i<n-m;i++)//删除出局的节点 { pNode[m+i]=pNode[m+1+i]; } n--; int d=pNode[m].password-2; if(n>0){ josephs3(pNode,m,d,n);//应用递归进行巡回 } 楼主把这段代码按照实际情况运行一下就可以了 void josephs3(Node2 pNode[],0,0,n) { m=(m+k)%n;//定义循环的初始位置 m = (0 + 0) %n = 0; cout<<pNode[m].name<<" "<<pNode[m].password<<endl;//输入节点信息 for(int i=0;i<n-m;i++)//删除出局的节点 { pNode[m+i]=pNode[m+1+i]; // 删除第一个节点即pNode[0],从pNode[1]到最后一个节点全部向前移 } n--; //个数自然也少了一个 int d=pNode[m].password-2; //下一个要删除的人 if(n>0){ josephs3(pNode,m,d,n);//应用递归进行巡回 } 我只运行了第一组数据,猜测是从第m个人起始,删除从它开始第d个人(循环数)

64,654

社区成员

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

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