程序设计思想
1.定义一个头指针。
2.键盘输入一个数值控制链表的长度。
3.利用输入的数值产生for循环结构输入结点位置的数据域,最后尾指针指向头节点,构成循环链表。
4.输入报数的上限值,从头节点开始循环,报数的上限停下的结点被删除。
5.从被删除的结点的下一个节点开始,以被删除的数据域为上限值继续循环。
设计思想漏洞: 有开始删除的标志,没有结束标志。
遇到的问题
1.循环的设置,从头循环结束。
2.对于密码位置得到设定。
重写的程序设计思想
1.建立一个包含位置与密码的数据域,再建立头指针。
2.输入循环链表的长度,建立完好的循环链表。
3.输入上限数,从头节点开始循环,在要删除的结点前一个节点停下。
4.将下一个节点的密码设为上限数,输出下一个节点的位置。
5.删除下一个节点,利用while循环判断上限数防止上限数是否过小可能导致循环停止。
6.如果太小则将该节点的密码设置为上限数,输出位置,否则继续循环。
7.再循环到只有一个节点的时候停止循环,循环外面直接输出最后一个节点的位置。
程序代码
#include <iostream>
using namespace std;
typedef struct
{
int number; //结点的密码
int position; //结点的位置
}data;
typedef struct LNode
{
data point;
struct LNode *next;
}LNode,*Linklist;
int main()
{
Linklist l;
l=new LNode;
l->next=NULL;
Linklist r;
r=new LNode;
r=l;
int n;
cout <<"请输入链表的长度:";
cin>>n;
cout <<"请输入"<<n<<"个整数:"<<endl;//链表的建立
for(int i=1;i<=n;i++)
{
Linklist p;
p=new LNode;
cin>>p->point.number;
p->point.position=i;
p->next=NULL;
r->next=p;
r=p;
if(i==n)
{
p->next=l->next;
cout <<p->next->point.number;
}
}
int m;
cout <<"请输入设定的上限数:";
cin>>m;
Linklist p;//验证是否可以循环输出,即循环链表是否建立成功
p=new LNode;
p=l->next;
for(int i=1;i<=m;i++) //利用输出判定循环链表的建立
{
cout <<p->point.number<<p->point.position<<" ";
p=p->next;
}
cout <<endl;
int t=0;//t代表执行的次数
for(int i=1;i<=m;i++)//利用给出的上限数开始循环 依次输出密码的位置
{
p=p->next;
if(i==m-1)
{
i=0;
m=p->next->point.number;
cout <<p->next->point.position<<" ";
t++;
Linklist q;
q=new LNode;
q=p->next;
p->next=q->next;
delete q;
while(m==1) //防止密码太小导致循环停止
{
m=p->next->point.number;
cout<<p->next->point.position<<" ";
t++;
Linklist w;
w=new LNode;
w=p->next;
p->next=w->next;
delete w;
}
}
if(t==n-1) //判断是否只剩下一个结点,若剩下一个则结束循环
{
break;
}
}
cout <<p->point.position<<endl; //输出最后一个结点的位置
return 0;
}