user-0 提问: 求教大佬哪里错了

回复:
user: user-0
content: 大家不用再回复了，我知道哪里有问题了 C的指针移动到下一个的时候，应该先移动pa指针，再把C链接到pb，不能反过来，否则pa的指针被改变了

user: user-0
content: 引用 10 楼 寻开心的回复:哦，sorry，我看错了。 要求是：  a1 b1 a2 b2..... 还以为是a1 a2 ...am  bm+1，...bn呢  这样的话你的代码没看出别的问题，除了后面的free    //  free(A);     //  free(B);  改成    A->next = NULL;    B->next = NULL; 因为A和B都是传参进来的， 你在这里free他们， 并不能把结果通过参数带回去， 调用者并不知道A和B已经变成了野指针了   而且这种写法的前提假定链表都具有空的头节点的，因为A和B本身（头结点）并么有被挂到C的下面呢 就是因为一直错所以再随便写了几行上去 不管了，这个平台经常各种bug，不过谢谢你啦(*°∀°)=3

user: user-1
content: 哦，sorry，我看错了。 要求是：  a1 b1 a2 b2..... 还以为是a1 a2 ...am  bm+1，...bn呢  这样的话你的代码没看出别的问题，除了后面的free    //  free(A);     //  free(B);  改成    A->next = NULL;    B->next = NULL; 因为A和B都是传参进来的， 你在这里free他们， 并不能把结果通过参数带回去， 调用者并不知道A和B已经变成了野指针了   而且这种写法的前提假定链表都具有空的头节点的，因为A和B本身（头结点）并么有被挂到C的下面呢

user: user-0
content: 引用 8 楼 寻开心的回复:C利用A和B都空间构成， 这句话怎么解释  他们的指针和他们的内存，直接使用一个头，那么是不是从头到尾都带过来了呢  A是一列火车，B是一列火车， C是一个空车头 你把A车头拿走，把第一节车厢挂C后面，是不是C就是整个A原来的全部车厢了呢 C利用AB的结点构成，意思就是把AB每个结点往C上面放，就相当于把AB两只火车每节车厢都拆开，然后一个一个往C后面接

user: user-1
content: C利用A和B都空间构成， 这句话怎么解释  他们的指针和他们的内存，直接使用一个头，那么是不是从头到尾都带过来了呢  A是一列火车，B是一列火车， C是一个空车头 你把A车头拿走，把第一节车厢挂C后面，是不是C就是整个A原来的全部车厢了呢

user: user-0
content: 引用 6 楼 寻开心的回复:我怎么觉得是下面的这种逻辑才对呢 void lnk_merge(LinkList A, LinkList B, LinkList C) {     if (A->next) {                // 如果A有数据          C->next = pa;         // 那么C下，挂的必然是A的数据          A->next = NULL;    // 而无论何种情况，A下的所有数据都要移交到C的          if ( B->next ) {         // 如果B下有数据， A和B都要起头并进比较谁更长                Node * pA=A, Node * pB=B;               while (pA->next && pB->next ) {  // 同步比较谁更长                     pA = pA->next;                     pB = pB->next;               }               if ( pB->next ) {                   // A到头了，B还有                   pA->next = pB->next;     // B的后半截接到A的后面                   pB->next = NULL;           // B到此截断               } else if ( pA->next ) {                  //B到头了，A还有。 什么也不需要做； 可以删除，留此只是做说明               } else {                  // A和B等长，也不需要做什么；可以删，留此也是做说明而已               }          }      }     else if (B->next) {  // A没有数据，那么如果B有数据， B数据挂到C下面，B情况        C->next = B->next;        B->next = NULL;     } } 题目意思是要链表AB轮流插入C哦，我看你的想法好像是把B接到A的尾巴

user: user-1
content: 我怎么觉得是下面的这种逻辑才对呢 void lnk_merge(LinkList A, LinkList B, LinkList C) {     if (A->next) {                // 如果A有数据          C->next = pa;         // 那么C下，挂的必然是A的数据          A->next = NULL;    // 而无论何种情况，A下的所有数据都要移交到C的          if ( B->next ) {         // 如果B下有数据， A和B都要起头并进比较谁更长                Node * pA=A, Node * pB=B;               while (pA->next && pB->next ) {  // 同步比较谁更长                     pA = pA->next;                     pB = pB->next;               }               if ( pB->next ) {                   // A到头了，B还有                   pA->next = pB->next;     // B的后半截接到A的后面                   pB->next = NULL;           // B到此截断               } else if ( pA->next ) {                  //B到头了，A还有。 什么也不需要做； 可以删除，留此只是做说明               } else {                  // A和B等长，也不需要做什么；可以删，留此也是做说明而已               }          }      }     else if (B->next) {  // A没有数据，那么如果B有数据， B数据挂到C下面，B情况        C->next = B->next;        B->next = NULL;     } }

user: user-0
content: 引用 4 楼 自信男孩的回复:[quote=引用 3 楼 DYf3244 的回复:] [quote=引用 1 楼 自信男孩 的回复:] 建议直接贴代码，可以帮你调试一下～ void lnk_merge(LinkList A, LinkList B, LinkList C) {     Node *pa, *pb, *r;     pa = A->next;     pb = B->next;     r = C;     if (A->next == NULL && B->next == NULL)         return;     while (pa && pb) {         r->next = pa;         r = pa;         r->next = pb;         r = pb;         pa = pa->next;         pb = pb->next;     }     if (pa) {         r->next = pa;     } else {         r->next = pb;     }     free(A);     free(B); }[/quote] 所有的代码，创建和显示的功能呢？[/quote] 没有，就是系统用数据检测你的函数能不能实现功能

user: user-2
content: 引用 3 楼 DYf3244 的回复:[quote=引用 1 楼 自信男孩 的回复:] 建议直接贴代码，可以帮你调试一下～ void lnk_merge(LinkList A, LinkList B, LinkList C) {     Node *pa, *pb, *r;     pa = A->next;     pb = B->next;     r = C;     if (A->next == NULL && B->next == NULL)         return;     while (pa && pb) {         r->next = pa;         r = pa;         r->next = pb;         r = pb;         pa = pa->next;         pb = pb->next;     }     if (pa) {         r->next = pa;     } else {         r->next = pb;     }     free(A);     free(B); }[/quote] 所有的代码，创建和显示的功能呢？

user: user-0
content: 引用 1 楼 自信男孩 的回复:建议直接贴代码，可以帮你调试一下～ void lnk_merge(LinkList A, LinkList B, LinkList C) {     Node *pa, *pb, *r;     pa = A->next;     pb = B->next;     r = C;     if (A->next == NULL && B->next == NULL)         return;     while (pa && pb) {         r->next = pa;         r = pa;         r->next = pb;         r = pb;         pa = pa->next;         pb = pb->next;     }     if (pa) {         r->next = pa;     } else {         r->next = pb;     }     free(A);     free(B); }

user: user-0
content: 引用 1 楼 自信男孩的回复:建议直接贴代码，可以帮你调试一下～ 这个是我们学校的一个网站，就只是写一个函数实现某个功能

user: user-2
content: 建议直接贴代码，可以帮你调试一下～