关于链表节点赋值的问题

applandtea 2008-01-03 10:45:05
题目是这样的
任务:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。
要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。
测试数据:
m的初值为20,n=7 ,7个人的密码依次为3,1,7,2,4,7,4,首先m=6,则正确的输出是什么?
要求:
输入数据:建立输入处理输入数据,输入m的初值,n ,输入每个人的密码,建立单循环链表。
输出形式:建立一个输出函数,将正确的输出序列



下面是我今天弄的代码,我想问下怎么给每个节点赋上我输入的值(密码)啊!急!拜托各位高手了!

#include<iostream.h>


class OnelinkNode //单链表的结点类
{
public:
int data; //数据元素域
int code;
OnelinkNode *next; //指针域,指向后继结点的指针
OnelinkNode(int k=0,int m=0,OnelinkNode *nextnode=NULL)
{ //构造结点,内联函数
data=k;
code=m;
next=NULL;
}
~OnelinkNode() //析构函数
{}
};


class Onering //单向循环链表类
{
public:
OnelinkNode *head; //头指针
Onering(int n=0); //构造函数
~Onering(); //析构函数
bool isEmpty()const //判断单向循环链表是否为空
{
return head==NULL;
}
bool remove(OnelinkNode *p); //删除p的后继节点
void output(); //输出单向循环链表的各个节点值
};


Onering::Onering(int n) //建立n个节点的单向循环链表
{ //链表节点值为1到n
head=NULL;
if(n>0)
{
int i=1,m;
OnelinkNode *rear,*q;

m=0;
head=new OnelinkNode(i++,m,head); //构造节点data值为i,next值为head
rear=head;
cout<<"请输入第1个人的密码:";
cin>>m;
while(i<=n)
{
cout<<"请输入第"<<i<<"个人的密码:";
cin>>m;

q=new OnelinkNode(i++,m,head);
rear->next=q; //q节点链入rear节点之后
rear=q; //rear指向新的链尾节点
}
rear->next=head;
}

}


Onering::~Onering() //析构函数
{
OnelinkNode *p=head,*q;
do
{
q=p;
p=p->next;
delete q;
}while(p!=head);
head=NULL;
}



bool Onering::remove(OnelinkNode *p) //删除q的后继节点
{
if(p!=NULL)
{
OnelinkNode *q=p->next; //q是p的后继节点
if(q!=NULL)
{
if(q==head) //欲删除head指向节点是,
head=q->next; //要将head向后移动
p->next=q->next; //删除q节点
cout<<q->data<<"出列"<<" ";
delete q;
return true;
}
}
return false;
}





void Onering::output() //输出单向循环链表的各个节点值
{
cout<<"剩下: ";
OnelinkNode *p=head;
do
{

cout<<p->data<<"-> ";
p=p->next;
}while(p!=head);
cout<<endl;
}






void display(Onering &ring,int s,int d) //解约瑟夫环
{
int j=0;
OnelinkNode *p=ring.head;
while(j<s-1) //计数起始点
{
j++;
p=p->next;

}
while(p->next!=p) //多于一个节点时循环
{
j=1;
while(j<d-1) //计数
{
j++;
p=p->next;
}
ring.remove(p); //删除p的后继节点
p=p->next;
ring.output();
}
cout<<"最后一个人是"<<p->data<<"\n"; //最后一个人
}

void main(void)
{
int n,s=1,d=0;
cout<<"输入人数总数n: "; //输入人数
cin>>n;
// cout<<"输入初始密码: "; //输入初始密码
// cin>>d;
Onering ring1(n); //建立有n个结点的单向循环链表
ring1.output();
display(ring1,s,d);
}

...全文
502 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
applandtea 2008-01-04
  • 打赏
  • 举报
回复
程序改动太大了!~能不能在我的程序里加一个赋值语句?
huangxw000 2008-01-03
  • 打赏
  • 举报
回复
试试我写的这个,我的密码输入是这样的,将密码依次输入到一个数组中,在从数组取出密码建立队伍.这样保证了输入的时候的不会出错,如果输一个密码建立一个结点这样很麻烦,结点个数多了,自己都不知道输入完成了没.
#include<stdio.h>
#include<malloc.h>
typedef int Elemtype;
#define LEN sizeof(node)
struct node
{
Elemtype data;
Elemtype secret;
node *next;
};
node *setnode(Elemtype x,Elemtype m); //建立一首结点

node * insnode(node *&last,Elemtype x,Elemtype m); //在尾结点插入结点

node * delnode(node *&last,node *s); //删除s指向的当前的结点

void display(node *last); //打印单循环链表的元素


node *setnode(Elemtype x,Elemtype m)
{
node *s;
s=(node *)malloc(LEN);
s->data=x;
s->secret=m;
s->next=s;
return(s);
}

node *insnode(node *&last,Elemtype x,Elemtype m) //在尾结点插入结点
{ node *s;
s=(node *)malloc(LEN);
s->data=x;
s->secret=m;
s->next=last->next;
last->next=s;
return(s); //返回新尾指针
}

node *delnode(node *&last,node *s)
{
node *p; //p用于保存要删除结点的前驱结点
p=last->next;
if(last==p)
{
printf("链表中只有一个结点,无法删除!!\n"); //只有第一个结点
printf("%d\n",p->data);
return(last);
}
else if(s==last && last!=last->next) //删除的是尾接点,同时链表中有多个接点
{
while(p->next!=s) //查找要删除结点的前驱结点
p=p->next;
p->next=s->next;
return(p); // 返回新尾指针
free(s);
}
else //删除的不是尾接点
{
while(p->next!=s) //查找要删除结点的前驱结点
p=p->next;
p->next=s->next;
return(last);
free(s); //返回新尾指针
}

}

void display(node *last) //打印单循环链表的元素
{
node *p;
if(last->next==last)
printf("%d %d ",last->data,last->secret);
else
{
p=last->next;
while(p!=last)
{
printf("%d %d ->",p->data,p->secret);
p=p->next;
}
printf("%d %d -> ",last->data,last->secret);
printf("%d %d...\n",last->next->data,last->next->secret);
}
}


void main()
{
int n,m,i,j=1,k=0,sec[100],y;
node *Last,*p;
printf("请输入一个大于1的整数,及排队人的总数。\n");
scanf("%d",&n);
printf("请输入顺序输入每个号的密码:\n");
for(i=0;i<n;i++)
{
printf("%d号的密码:\n",i+1);
scanf("%d",&sec[i]);
}
y=sec[0];
Last=setnode(1,y); //先建立第一个结点
for(i=2;i<=n;i++)
{
y=sec[i-1];
Last=insnode(Last,i,y);
}
printf("建立的环行队伍如下:\n");
display(Last);
printf("请输入一个的整数,及第一个要出队的号数\n");
scanf("%d",&m);
p=Last->next;
printf("出队的序列是:\n");
while(Last!=Last->next) //删除至一个结点,相当于出队
{
if(j==m)
{ ++k;
m=p->secret;
Last=delnode(Last,p); //修改密码,为下个出队的号码
printf("第%-3d个出队的是%-3d号,密码是%-3d。\n",k,p->data,p->secret); //输入出队的号数
j=0;
}
p=p->next;
++j;
}
printf("队伍中最后还剩下%-3d号,密码是%-3d。\n",Last->data,Last->secret); //输出剩下的结点
}


69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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