user-0 提问: 跪求大佬指导。帮忙分析一下我的代码

回复:
user: user-1
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-2
content: void find(Lnode &head,int n,int m,int k) 参数head 前加&，是表示引用，它的效果同地址传递，但形式上不是地址。当然，具体它的工作原理，我还真不知道，由于平时没有涉及到相关的问题，还真没有研究过它和指针的本质区别  这样写的好处是，变量的内存不在函数中分配，表面上方便管理，而且减少传递指针的指针这种比较bt的行为，从形式上更容易理解一些罢了

user: user-3
content: 引用 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对指针进行操作

user: user-0
content: 引用 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

user: user-3
content: 引用 10 楼 weixin_40884861的回复:[quote=引用 3 楼 paschen 的回复:] 要解决这个问题，你函数参数要传递指针的地址，而不是指针本身 额，大神，请问一下哈，指针不就是地址吗？？为啥这个不能传递过去呢？我有写head=p啊，不是传过去了吗[/quote] 指针可以表示地址，但指针本身也占用内存，也有自己的地址  如果函数中要修改指针指向的地址中的值，你可以传递指针  你是如果要改变指针本身，需要传递指针自身的地址  你malloc函数改变的是指针自身的值，还有一个办法就是你把malloc放在主函数中

user: user-2
content: 可以在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); ... }

user: user-0
content: 引用 4 楼 user-6 的回复:#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

user: user-2
content: 说说结构定义的风格 typedef struct Lnode { int data; struct Lnode *next; }Lnode,*LinkList; 通常，第一行的struct后面的名字，和最后一行的名字不相同，比如改成如下： typedef struct _Lnode { int data; struct Lnode *next; }Lnode,*LinkList;

user: user-0
content: 引用 3 楼 paschen 的回复:要解决这个问题，你函数参数要传递指针的地址，而不是指针本身 额，大神，请问一下哈，指针不就是地址吗？？为啥这个不能传递过去呢？我有写head=p啊，不是传过去了吗

user: user-4
content: 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); ... }

user: user-0
content: 脑子短路了。。改了改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; 	} } 但还是不对

user: user-5
content: 环链表传递的是二级指针

user: user-6
content: #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

user: user-3
content: 要解决这个问题，你函数参数要传递指针的地址，而不是指针本身

user: user-3
content: 你的creat函数的参数是按值传递的，也就是说主函数中的head和creat中的head是两个不同的变量，后者是前者复制得到的，你malloc申请的内存给了后者，但不会影响前者，也就是你主函数中的head仍然是个未初始的值，并没指向你申请到的内存，后面使用将导致你程序崩溃