问题描述
- C++单循环链表约瑟夫问题
-
#includeusing namespace std;
class Node
{
public:Node *next;
char *name;
char *number;
char *sex;
char *age;
char *banji;
char *heal;
/*void input()
{
cin>>name;
cin>>number;
cin>>sex;
cin>>age;
cin>>banji;
cin>>heal;} void output() { cout<<name<<" "<<number<<" "<<sex<<" "<<age<<" "<<banji<<" "<<heal<<endl; } */
};
class linklist
{
public:
Node *head;
int n;linklist() { head=new Node ; head->next=NULL; } void input3() { Node *t=head; Node *q; for(int i=0; i<n; i++) { q=new Node; t->next=q;
cin>>q->name>>q->number>>q->sex>>q->age>>q->banji>>q->age>>q->banji>>q->heal;
q->next=NULL;t=q; } q->next=head->next; } void johesu(linklist a) { Node *p=a.head->next,*q=a.head->next; while(q&&q!=q->next) { int i=1; cin>>n; for( i=1; i<n; p=q,q=q->next) i++; cout<<q->name<<" "<<q->number<<" "<<q->sex<<" "<<q->age<<" "<<q->banji<<" "<<q->age<<" "<<q->banji<<" "<<q->heal<<endl; p->next=q->next; delete q; q=p->next; } a.head=NULL; }
};
int main()
{
linklist a;int m,n,i; cin>>m; a.n=m; a.input3(); a.johesu(a);
}
请大神指出我的代码错误,本人新手,不喜勿喷。。我只是想不断改正自己的代码,发现自己的问题。谢谢!!!!
解决方案
不知道楼主问题解决了没有,前天看得太粗,没有找出问题。今天找到问题了。你之所以输入崩溃是因为你输入的数据没有地方存储,所以崩溃。你在input3()函数中用了q=new node;开创建一个节点,这一句的执行效果是:在计算机内存中申请到了一块内存空间,这块空间大小共7个字节,并且返回了这块空间第一个字节的地址,赋值给了指针变量q。之所以这样,是因为你在node类的定义中,定义了7个指针,分别是next,name,number,sex,age,banji和heal。这7个只是指针变量,它们并没有对应内存空间,所以,在后面input3()函数中,你在需要输入数据的时候,系统发现你输入的数据没有地方存储,也就是说执行cin>>name >>number…的时候,name,number等是没有初始化的指针,它们所指向的内存空间可能不存在或者是系统正在使用的内存空间,这是非常危险的。
修改的方法:
第一,你可以在node类的定义中将name,number等变量(除了next变量)定义为字符串类型,或者字符数组类型,而不是像你原来的指针类型;
第二种方法,你可以在node类中添加构造函数,在构造函数中用new运算符为name等的6个指针申请字符串型的内存空间;
第三种方法,你可以在input3()函数中,在cin语句之前,逐一为name等六个指针用new申请字符串类型内存空间,然后再是cin输入语句。
解决方案二:
你这个johesu函数作用是将链表倒序输出吗?我理解为你是在倒序输出,而且在每次输出一个节点之后,将该节点析构。在倒序输出的时候,你的for循环中每次都循环n-1次,这是不对的,这样输出的结果是乱序的。你for循环每次应该循环的是上一次输出的时候的那个循环中的循环次数减1次。即,假如你共有5个节点。第一次你应该循环4次,输出第5个节点,然后将第5个节点析构,然后for循环3次,因为这次你总共只有4个节点了,然后输出、析构,然后循环2次,输出、析构。就这样依次类推
解决方案三:
代码太长,我还没看,首先说一下,你这include预编译命令后面什么都没有是几个意思?先把这个改了再说吧
解决方案四:
单链表,单循环链表,约瑟夫问题
(1.2.1.3)单循环链表和约瑟夫问题
循环双向链表 及 约瑟夫问题的解决
解决方案五:
不知道楼主问题解决了没有,前天看得太粗,没有找出问题。今天找到问题了。你之所以输入崩溃是因为你输入的数据没有地方存储,所以崩溃。你在input3()函数中用了q=new node;开创建一个节点,这一句的执行效果是:在计算机内存中申请到了一块内存空间,这块空间大小共7个字节,并且返回了这块空间第一个字节的地址,赋值给了指针变量q。之所以这样,是因为你在node类的定义中,定义了7个指针,分别是next,name,number,sex,age,banji和heal。这7个只是指针变量,它们并没有对应内存空间,所以,在后面input3()函数中,你在需要输入数据的时候,系统发现你输入的数据没有地方存储,也就是说执行cin>>name >>number…的时候,name,number等是没有初始化的指针,它们所指向的内存空间可能不存在或者是系统正在使用的内存空间,这是非常危险的。
修改的方法:
第一,你可以在node类的定义中将name,number等变量(除了next变量)定义为字符串类型,或者字符数组类型,而不是像你原来的指针类型;
第二种方法,你可以在node类中添加构造函数,在构造函数中用new运算符为name等的6个指针申请字符串型的内存空间;
第三种方法,你可以在input3()函数中,在cin语句之前,逐一为name等六个指针用new申请字符串类型内存空间,然后再是cin输入语句。
解决方案六:
不知道楼主问题解决了没有,前天看得太粗,没有找出问题。今天找到问题了。你之所以输入崩溃是因为你输入的数据没有地方存储,所以崩溃。你在input3()函数中用了q=new node;开创建一个节点,这一句的执行效果是:在计算机内存中申请到了一块内存空间,这块空间大小共7个字节,并且返回了这块空间第一个字节的地址,赋值给了指针变量q。之所以这样,是因为你在node类的定义中,定义了7个指针,分别是next,name,number,sex,age,banji和heal。这7个只是指针变量,它们并没有对应内存空间,所以,在后面input3()函数中,你在需要输入数据的时候,系统发现你输入的数据没有地方存储,也就是说执行cin>>name >>number…的时候,name,number等是没有初始化的指针,它们所指向的内存空间可能不存在或者是系统正在使用的内存空间,这是非常危险的。
修改的方法:
第一,你可以在node类的定义中将name,number等变量(除了next变量)定义为字符串类型,或者字符数组类型,而不是像你原来的指针类型;
第二种方法,你可以在node类中添加构造函数,在构造函数中用new运算符为name等的6个指针申请字符串型的内存空间;
第三种方法,你可以在input3()函数中,在cin语句之前,逐一为name等六个指针用new申请字符串类型内存空间,然后再是cin输入语句。