跪求大佬指导。帮忙分析一下我的代码

一墨千里无色 2018-04-07 10:54:02
emmm输出是就无法运行了,不报错。
我想创建一个循环链表,输出看一下都不行。。。
#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode
{
int data;
struct Lnode *next;
}Lnode,*LinkList;
void creat(LinkList head,int n);
//void find(LinkList head,int n,int m,int k);
int main()
{
int i,n,m,k;
LinkList head,q;
printf("Please input the number:\n");
scanf("%d",&n);
printf("Please input the location m you start from:\n");
scanf("%d",&m);
while(m>n||m<1)
{printf("error!try again!\n");
scanf("%d",&m);}
printf("Please input the number k where game will stop:\n");
scanf("%d",&k);
creat(head,n);
q=head;
do
{
printf("%d",q->data);
q=q->next;
}while(q->next!=head);

// find(head,n,m,k);
return 0;
}

void creat(LinkList head,int n)
{
int i;
LinkList p,q;
p=q=(LinkList)malloc(sizeof(Lnode));
p->data=1;
p->next=NULL;
head=p;
i=1;
while(i<=n)
{
i++;
p=(LinkList)malloc(sizeof(Lnode));
p->data=i;
q->next=p;
q=p;

}
q->next=head;
}
/*void find(LinkList head,int n,int m,int k)
{
LinkList p=head,q=head;
int i,j,e;
while(p->next->data!=m)
p=p->next;
while(q->next->next->data!=m)
q=q->next;
while(p->next!=p)
{
for(i=1;i<=k;i++)
{
p=p->next;
q=q->next;
}
printf("%d ",p->data);
q=p->next;
p->next==NULL;
free(p);
LinkList p=q->next;
}
}*/



其实主要是想找出约瑟夫圈的问题。。但是无法运行,去掉注释部分就是创建一个循环链表,在主程序里面无法运行,但是在函数里面可以输出。
这个题目是,一圈人报数,从m开始,数到k的人出列,输出出列顺序。
但是我的代码不报错但不可以运行。求大佬说明一下原因!
...全文
1013 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-04-09
  • 打赏
  • 举报
回复
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
red-fly 2018-04-09
  • 打赏
  • 举报
回复
void find(Lnode &head,int n,int m,int k) 参数head 前加&,是表示引用,它的效果同地址传递,但形式上不是地址。当然,具体它的工作原理,我还真不知道,由于平时没有涉及到相关的问题,还真没有研究过它和指针的本质区别 这样写的好处是,变量的内存不在函数中分配,表面上方便管理,而且减少传递指针的指针这种比较bt的行为,从形式上更容易理解一些罢了
paschen 2018-04-09
  • 打赏
  • 举报
回复
引用 14 楼 weixin_40884861的回复:
[quote=引用 8 楼 jszj 的回复:] 可以在main()中定义头结构,其成员data不用而只用其指针,此时两个子函数可以传递结构的引用,这样对参数的指针成员附值即可 void creat(LinkList head,int n) 改为 void creat(Lnode &head,int n) { ... head.next = p; ... } void find(LinkList head,int n,int m,int k) 改为 void find(Lnode &head,int n,int m,int k) { LinkList p=head.next,q=head.next; .... } main()函数定义: int main() { int i,n,m,k; Lnode head; LinkList q; ... creat(head,n); q=head.next; ... find(head,n,m,k); ... }
鹅妈妈木木木木木。。请问有什么区别吗0-0。。是程序员习惯吗。。
引用 12 楼 paschen 的回复:
[quote=引用 10 楼 weixin_40884861的回复:][quote=引用 3 楼 paschen 的回复:] 要解决这个问题,你函数参数要传递指针的地址,而不是指针本身
额,大神,请问一下哈,指针不就是地址吗??为啥这个不能传递过去呢?我有写head=p啊,不是传过去了吗[/quote] 指针可以表示地址,但指针本身也占用内存,也有自己的地址 如果函数中要修改指针指向的地址中的值,你可以传递指针 你是如果要改变指针本身,需要传递指针自身的地址 你malloc函数改变的是指针自身的值,还有一个办法就是你把malloc放在主函数中[/quote] 恩。。。这样就OK了,但还不是很懂QAQ 怎样传递指针自身的地址呢?我传过去的其实是未初始化的随机地址,对吗? emmmfind函数我再改改吧,应该有逻辑错误,不可以运行。 谢谢大佬,好像你还帮过我QAQ[/quote] 使用&取指针地址,相当于传递二级指针 函数参数类型实际是LinkList* head 函数中使用*head对指针进行操作
一墨千里无色 2018-04-09
  • 打赏
  • 举报
回复
引用 8 楼 jszj 的回复:
可以在main()中定义头结构,其成员data不用而只用其指针,此时两个子函数可以传递结构的引用,这样对参数的指针成员附值即可 void creat(LinkList head,int n) 改为 void creat(Lnode &head,int n) { ... head.next = p; ... } void find(LinkList head,int n,int m,int k) 改为 void find(Lnode &head,int n,int m,int k) { LinkList p=head.next,q=head.next; .... } main()函数定义: int main() { int i,n,m,k; Lnode head; LinkList q; ... creat(head,n); q=head.next; ... find(head,n,m,k); ... }
鹅妈妈木木木木木。。请问有什么区别吗0-0。。是程序员习惯吗。。
引用 12 楼 paschen 的回复:
[quote=引用 10 楼 weixin_40884861的回复:][quote=引用 3 楼 paschen 的回复:] 要解决这个问题,你函数参数要传递指针的地址,而不是指针本身
额,大神,请问一下哈,指针不就是地址吗??为啥这个不能传递过去呢?我有写head=p啊,不是传过去了吗[/quote] 指针可以表示地址,但指针本身也占用内存,也有自己的地址 如果函数中要修改指针指向的地址中的值,你可以传递指针 你是如果要改变指针本身,需要传递指针自身的地址 你malloc函数改变的是指针自身的值,还有一个办法就是你把malloc放在主函数中[/quote] 恩。。。这样就OK了,但还不是很懂QAQ 怎样传递指针自身的地址呢?我传过去的其实是未初始化的随机地址,对吗? emmmfind函数我再改改吧,应该有逻辑错误,不可以运行。 谢谢大佬,好像你还帮过我QAQ
paschen 2018-04-08
  • 打赏
  • 举报
回复
引用 10 楼 weixin_40884861的回复:
[quote=引用 3 楼 paschen 的回复:] 要解决这个问题,你函数参数要传递指针的地址,而不是指针本身
额,大神,请问一下哈,指针不就是地址吗??为啥这个不能传递过去呢?我有写head=p啊,不是传过去了吗[/quote] 指针可以表示地址,但指针本身也占用内存,也有自己的地址 如果函数中要修改指针指向的地址中的值,你可以传递指针 你是如果要改变指针本身,需要传递指针自身的地址 你malloc函数改变的是指针自身的值,还有一个办法就是你把malloc放在主函数中
red-fly 2018-04-08
  • 打赏
  • 举报
回复
可以在main()中定义头结构,其成员data不用而只用其指针,此时两个子函数可以传递结构的引用,这样对参数的指针成员附值即可 void creat(LinkList head,int n) 改为 void creat(Lnode &head,int n) { ... head.next = p; ... } void find(LinkList head,int n,int m,int k) 改为 void find(Lnode &head,int n,int m,int k) { LinkList p=head.next,q=head.next; .... } main()函数定义: int main() { int i,n,m,k; Lnode head; LinkList q; ... creat(head,n); q=head.next; ... find(head,n,m,k); ... }
一墨千里无色 2018-04-08
  • 打赏
  • 举报
回复
引用 4 楼 destory27 的回复:
#ifndef josephuskill_h #define josephuskill_h class node{ public: int value; node *next; node(int value); static const node* josephuskill(node *head, const int m = 2); static const int getlive(int len, const int m); }; node::node(int value) :value(value), next(null) { } const node* node::josephuskill(node *head, const int m) { if(m <= 1) return head; if(!head || !head->next) return head; node *cur = head; static int length = 0; while(cur) { ++length; cur = cur->next; } length = getlive(length, m); cur = head; while(--length) { cur = cur->next; } head = cur; head->next = head; return head; } const int node::getlive(int len, const int m) { if(len == 1) return 1; return (getlive(len - 1, m) + m -1) % len + 1; } #endif
大佬,你这个是啥啊,我有点看不懂。。。是c吗?QAQ
red-fly 2018-04-08
  • 打赏
  • 举报
回复
说说结构定义的风格 typedef struct Lnode { int data; struct Lnode *next; }Lnode,*LinkList; 通常,第一行的struct后面的名字,和最后一行的名字不相同,比如改成如下: typedef struct _Lnode { int data; struct Lnode *next; }Lnode,*LinkList;
一墨千里无色 2018-04-08
  • 打赏
  • 举报
回复
引用 3 楼 paschen 的回复:
要解决这个问题,你函数参数要传递指针的地址,而不是指针本身
额,大神,请问一下哈,指针不就是地址吗??为啥这个不能传递过去呢?我有写head=p啊,不是传过去了吗
weixin_41967540 2018-04-08
  • 打赏
  • 举报
回复
void creat(LinkList head,int n) 改为 void creat(Lnode &head,int n) { ... head.next = p; ... } void find(LinkList head,int n,int m,int k) 改为 void find(Lnode &head,int n,int m,int k) { LinkList p=head.next,q=head.next; .... } main()函数定义: int main() { int i,n,m,k; Lnode head; LinkList q; ... creat(head,n); q=head.next; ... find(head,n,m,k); ... }
一墨千里无色 2018-04-07
  • 打赏
  • 举报
回复
脑子短路了。。改了改find函数 void find(LinkList head) { LinkList p=head,q=head; int i,k=3,m=2; while(p->next->data!=m) p=p->next; while(q->next->next->data!=m) q=q->next; while(p->next!=p) { for(i=1;i<=k;i++) { p=p->next; q=q->next; } printf("%d ",p->data); q->next=p->next; p->next=NULL; p=q->next; } } 但还是不对
zhouqunhai 2018-04-07
  • 打赏
  • 举报
回复
环链表传递的是二级指针
destory27 2018-04-07
  • 打赏
  • 举报
回复
#ifndef josephuskill_h #define josephuskill_h class node{ public: int value; node *next; node(int value); static const node* josephuskill(node *head, const int m = 2); static const int getlive(int len, const int m); }; node::node(int value) :value(value), next(null) { } const node* node::josephuskill(node *head, const int m) { if(m <= 1) return head; if(!head || !head->next) return head; node *cur = head; static int length = 0; while(cur) { ++length; cur = cur->next; } length = getlive(length, m); cur = head; while(--length) { cur = cur->next; } head = cur; head->next = head; return head; } const int node::getlive(int len, const int m) { if(len == 1) return 1; return (getlive(len - 1, m) + m -1) % len + 1; } #endif
paschen 2018-04-07
  • 打赏
  • 举报
回复
要解决这个问题,你函数参数要传递指针的地址,而不是指针本身
paschen 2018-04-07
  • 打赏
  • 举报
回复
你的creat函数的参数是按值传递的,也就是说主函数中的head和creat中的head是两个不同的变量,后者是前者复制得到的,你malloc申请的内存给了后者,但不会影响前者,也就是你主函数中的head仍然是个未初始的值,并没指向你申请到的内存,后面使用将导致你程序崩溃

69,371

社区成员

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

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