鱼C论坛

 找回密码
 立即注册
查看: 2240|回复: 29

[已解决](悬赏贴)求个大佬求助,帮我解答一下本题

[复制链接]
发表于 2023-6-18 18:13:56 | 显示全部楼层 |阅读模式
5鱼币
本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。

函数接口定义:

  1. List Merge( List L1, List L2 );
复制代码


其中List结构定义如下:

  1. typedef struct Node *PtrToNode;
  2. struct Node {
  3.     ElementType Data; /* 存储结点数据 */
  4.     PtrToNode   Next; /* 指向下一个结点的指针 */
  5. };
  6. typedef PtrToNode List; /* 定义单链表类型 */
复制代码


L1和L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge要将L1和L2合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的带头结点的链表头指针。

裁判测试程序样例:

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef int ElementType;
  4. typedef struct Node *PtrToNode;
  5. struct Node {
  6.     ElementType Data;
  7.     PtrToNode   Next;
  8. };
  9. typedef PtrToNode List;

  10. List Read(); /* 细节在此不表 */
  11. void Print( List L ); /* 细节在此不表;空链表将输出NULL */

  12. List Merge( List L1, List L2 );

  13. int main()
  14. {
  15.     List L1, L2, L;
  16.     L1 = Read();
  17.     L2 = Read();
  18.     L = Merge(L1, L2);
  19.     Print(L);
  20.     Print(L1);
  21.     Print(L2);
  22.     return 0;
  23. }

  24. /* 你的代码将被嵌在这里 */
复制代码




我的代码:
  1. List Merge( List L1, List L2 )
  2. {
  3.     List head,temp;
  4.     head = temp = (List)malloc(sizeof(struct Node));
  5.    
  6.         L1 = L1->Next;
  7.         L2 = L2->Next;


  8.       while(L1 && L2)
  9.      {
  10.         if(L1->Data <= L2->Data)
  11.         {
  12.                 temp->Next = L1;
  13.                 L1 = L1->Next;
  14.         }
  15.         else
  16.         {
  17.                 temp->Next = L2;
  18.                 L2 = L2->Next;
  19.         }
  20.         temp = temp->Next;
  21.     }
  22.    
  23.     if(L1)
  24.     {
  25.         while(L1)
  26.         {
  27.             temp->Next = L1;
  28.             L1 = L1->Next;
  29.             temp = temp->Next;
  30.         }
  31.         temp->Next = NULL;
  32.     }
  33.    
  34.     else if(L2)
  35.     {
  36.          while(L2)
  37.         {
  38.             temp->Next = L2;
  39.             L2 = L2->Next;
  40.             temp = temp->Next;
  41.         }
  42.         temp->Next = NULL;
  43.     }
  44.     else
  45.         temp->Next = NULL;

  46.     //到这里L1 L2为NULL 运行到后面在main函数里打印出L1 L2为原始头节点。。


  47.     return head;
  48. }
复制代码



实例测试:
e08ccdafc585af243b58ad5db036aca.png
结果图片:
c4c3abd6d88a0c62d8d6d5b75492a80.png


我在函数里通过传进去结构体指针L1 L2修改L1 L2的节点位置 最后返回head  最后在main函数里打印出来的链表却是原始节点 按照正常情况下  在Merge函数里 L1 L2都为NULL。

函数是传值操作,但是传入的L1 L2是结构体指针  所以传入的L1 L2应该是地址吧?那为什么在Merge函数里做的修改都没有用  那如果需要修改 要怎样才行呢?

比如在main函数里 a = 4;  int *p = a;  我把p传进一个函数里做修改,最后回到main函数里打印a的值 能够做修改  这里传递指针p和结构体指针有什么区别呢? 为什么结构体指针传进去不能做修改呢? 求解答 十分感谢!
最佳答案
2023-6-18 18:13:57
我确实没认真看题,^_^
我是先直接看的代码

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef int ElementType;
  4. typedef struct Node *PtrToNode;

  5. struct Node {
  6.     ElementType Data;
  7.     PtrToNode Next;
  8. };

  9. typedef PtrToNode List;

  10. List Read(); /* 细节在此不表 (也就是说提交的时候可以不考虑,不过还是要写的!) */
  11. void Print(List L); /* 细节在此不表;空链表将输出NULL   (同上)*/
  12. List Merge(List L1, List L2);


  13. // 你是不是忘了写这个函数了?
  14. void list_free(List L) {
  15.     if(L) list_free(L->Next);
  16.     free(L);
  17. }

  18. int main(void) {
  19.     List L1, L2, L;
  20.     L1 = Read();
  21.     L2 = Read();
  22.     L = Merge(L1, L2);
  23.     Print(L);
  24.     Print(L1);
  25.     Print(L2);
  26.     list_free(L);

  27.     // 现在就可以free了
  28.     list_free(L1);
  29.     list_free(L2);
  30.     // 要共用节点的话,这两个就只能单独释放了
  31.     //free(L1);
  32.     //free(L2);
  33.     return 0;
  34. }

  35. /* 你的代码将被嵌在这里 */
  36. List Read() {
  37.     int n, i;
  38.     scanf("%d", &n);
  39.     //List L = (List)malloc(sizeof(PtrToNode)); /// 申请一个头结点
  40.     //List L = malloc(sizeof(PtrToNode));       // 这是C语言,没必要强制转换
  41.     //List L = malloc(sizeof(struct Node));     // 是PtrToNode还是struct Node?
  42.     List L = malloc(sizeof(*L));                // 对吧?管他什么类型了
  43.     L->Next = NULL;                           // 头指针为空
  44.     if(n)                                     // 当n不是0时
  45.     {
  46.         List r = L; /// r是一个中间变量的节点
  47.         for(i = 0; i < n; i++) {
  48.             //List p = (List)malloc(sizeof(struct Node));
  49.             List p = malloc(sizeof(*p));
  50.             //scanf("%d", &(p->Data)); // 尾插法
  51.             scanf("%d", &p->Data);  // 尾插法
  52.             r->Next = p;
  53.             r = p;
  54.         }
  55.         r->Next = NULL;
  56.     }
  57.     return L;
  58. }

  59. void Print(List L) {
  60.     List p = L->Next;
  61.     if(p) {
  62.         List r;
  63.         r = L;
  64.         while(r->Next) {
  65.             r = r->Next;
  66.             printf("%d ", r->Data);
  67.         }
  68.     } else {
  69.         printf("NULL");
  70.     }
  71.     printf("\n");
  72. }

  73. #if 0
  74. // 好了,知道定义了
  75. List Merge(List L1, List L2) {
  76.     List L = malloc(sizeof(*L));
  77.     L->Next = NULL;
  78.     List *px = &L->Next;
  79.     List p1 = L1->Next;
  80.     List p2 = L2->Next;
  81.     while(p1 && p2) {
  82.         ElementType v;
  83.         ElementType a = p1->Data;
  84.         ElementType b = p2->Data;
  85.         if(a < b) {
  86.             v = a; p1 = p1->Next;
  87.         } else {
  88.             v = b; p2 = p2->Next;
  89.         }
  90.         *px = malloc(sizeof(**px));
  91.         (*px)->Data = v;
  92.         (*px)->Next = NULL;
  93.         px = &(*px)->Next;
  94.     }
  95.     while(p1) {
  96.         *px = malloc(sizeof(**px));
  97.         (*px)->Data = p1->Data;
  98.         (*px)->Next = NULL;
  99.         p1 = p1->Next;
  100.         px = &(*px)->Next;
  101.     }
  102.     while(p2) {
  103.         *px = malloc(sizeof(**px));
  104.         (*px)->Data = p2->Data;
  105.         (*px)->Next = NULL;
  106.         p2 = p2->Next;
  107.         px = &(*px)->Next;
  108.     }
  109.     return L;
  110. }
  111. #else
  112. List Merge(List L1, List L2) {
  113.     List head, temp;
  114.     //head = temp = (List)malloc(sizeof(struct Node));
  115.     head = temp = malloc(sizeof(*head));

  116.     List L1_bak = L1;
  117.     List L2_bak = L2;

  118.     L1 = L1->Next;
  119.     L2 = L2->Next;

  120.     while(L1 && L2) {
  121.         if(L1->Data <= L2->Data) {
  122.             temp->Next = L1;
  123.             L1 = L1->Next;
  124.         } else {
  125.             temp->Next = L2;
  126.             L2 = L2->Next;
  127.         }
  128.         temp = temp->Next;
  129.     }

  130.     if(L1) {
  131.         while(L1) {
  132.             temp->Next = L1;
  133.             L1 = L1->Next;
  134.             temp = temp->Next;
  135.         }
  136.         temp->Next = NULL;
  137.     }
  138.     else if(L2) {
  139.         while(L2) {
  140.             temp->Next = L2;
  141.             L2 = L2->Next;
  142.             temp = temp->Next;
  143.         }
  144.         temp->Next = NULL;
  145.     } else
  146.         temp->Next = NULL;

  147.     // 到这里L1 L2为NULL 运行到后面在main函数里打印出L1 L2为原始头节点。。
  148.     L1_bak->Next = NULL;
  149.     L2_bak->Next = NULL;

  150.     return head;
  151. }
  152. #endif
复制代码

最佳答案

查看完整内容

我确实没认真看题,^_^ 我是先直接看的代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-6-18 18:13:57 | 显示全部楼层    本楼为最佳答案   
我确实没认真看题,^_^
我是先直接看的代码

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef int ElementType;
  4. typedef struct Node *PtrToNode;

  5. struct Node {
  6.     ElementType Data;
  7.     PtrToNode Next;
  8. };

  9. typedef PtrToNode List;

  10. List Read(); /* 细节在此不表 (也就是说提交的时候可以不考虑,不过还是要写的!) */
  11. void Print(List L); /* 细节在此不表;空链表将输出NULL   (同上)*/
  12. List Merge(List L1, List L2);


  13. // 你是不是忘了写这个函数了?
  14. void list_free(List L) {
  15.     if(L) list_free(L->Next);
  16.     free(L);
  17. }

  18. int main(void) {
  19.     List L1, L2, L;
  20.     L1 = Read();
  21.     L2 = Read();
  22.     L = Merge(L1, L2);
  23.     Print(L);
  24.     Print(L1);
  25.     Print(L2);
  26.     list_free(L);

  27.     // 现在就可以free了
  28.     list_free(L1);
  29.     list_free(L2);
  30.     // 要共用节点的话,这两个就只能单独释放了
  31.     //free(L1);
  32.     //free(L2);
  33.     return 0;
  34. }

  35. /* 你的代码将被嵌在这里 */
  36. List Read() {
  37.     int n, i;
  38.     scanf("%d", &n);
  39.     //List L = (List)malloc(sizeof(PtrToNode)); /// 申请一个头结点
  40.     //List L = malloc(sizeof(PtrToNode));       // 这是C语言,没必要强制转换
  41.     //List L = malloc(sizeof(struct Node));     // 是PtrToNode还是struct Node?
  42.     List L = malloc(sizeof(*L));                // 对吧?管他什么类型了
  43.     L->Next = NULL;                           // 头指针为空
  44.     if(n)                                     // 当n不是0时
  45.     {
  46.         List r = L; /// r是一个中间变量的节点
  47.         for(i = 0; i < n; i++) {
  48.             //List p = (List)malloc(sizeof(struct Node));
  49.             List p = malloc(sizeof(*p));
  50.             //scanf("%d", &(p->Data)); // 尾插法
  51.             scanf("%d", &p->Data);  // 尾插法
  52.             r->Next = p;
  53.             r = p;
  54.         }
  55.         r->Next = NULL;
  56.     }
  57.     return L;
  58. }

  59. void Print(List L) {
  60.     List p = L->Next;
  61.     if(p) {
  62.         List r;
  63.         r = L;
  64.         while(r->Next) {
  65.             r = r->Next;
  66.             printf("%d ", r->Data);
  67.         }
  68.     } else {
  69.         printf("NULL");
  70.     }
  71.     printf("\n");
  72. }

  73. #if 0
  74. // 好了,知道定义了
  75. List Merge(List L1, List L2) {
  76.     List L = malloc(sizeof(*L));
  77.     L->Next = NULL;
  78.     List *px = &L->Next;
  79.     List p1 = L1->Next;
  80.     List p2 = L2->Next;
  81.     while(p1 && p2) {
  82.         ElementType v;
  83.         ElementType a = p1->Data;
  84.         ElementType b = p2->Data;
  85.         if(a < b) {
  86.             v = a; p1 = p1->Next;
  87.         } else {
  88.             v = b; p2 = p2->Next;
  89.         }
  90.         *px = malloc(sizeof(**px));
  91.         (*px)->Data = v;
  92.         (*px)->Next = NULL;
  93.         px = &(*px)->Next;
  94.     }
  95.     while(p1) {
  96.         *px = malloc(sizeof(**px));
  97.         (*px)->Data = p1->Data;
  98.         (*px)->Next = NULL;
  99.         p1 = p1->Next;
  100.         px = &(*px)->Next;
  101.     }
  102.     while(p2) {
  103.         *px = malloc(sizeof(**px));
  104.         (*px)->Data = p2->Data;
  105.         (*px)->Next = NULL;
  106.         p2 = p2->Next;
  107.         px = &(*px)->Next;
  108.     }
  109.     return L;
  110. }
  111. #else
  112. List Merge(List L1, List L2) {
  113.     List head, temp;
  114.     //head = temp = (List)malloc(sizeof(struct Node));
  115.     head = temp = malloc(sizeof(*head));

  116.     List L1_bak = L1;
  117.     List L2_bak = L2;

  118.     L1 = L1->Next;
  119.     L2 = L2->Next;

  120.     while(L1 && L2) {
  121.         if(L1->Data <= L2->Data) {
  122.             temp->Next = L1;
  123.             L1 = L1->Next;
  124.         } else {
  125.             temp->Next = L2;
  126.             L2 = L2->Next;
  127.         }
  128.         temp = temp->Next;
  129.     }

  130.     if(L1) {
  131.         while(L1) {
  132.             temp->Next = L1;
  133.             L1 = L1->Next;
  134.             temp = temp->Next;
  135.         }
  136.         temp->Next = NULL;
  137.     }
  138.     else if(L2) {
  139.         while(L2) {
  140.             temp->Next = L2;
  141.             L2 = L2->Next;
  142.             temp = temp->Next;
  143.         }
  144.         temp->Next = NULL;
  145.     } else
  146.         temp->Next = NULL;

  147.     // 到这里L1 L2为NULL 运行到后面在main函数里打印出L1 L2为原始头节点。。
  148.     L1_bak->Next = NULL;
  149.     L2_bak->Next = NULL;

  150.     return head;
  151. }
  152. #endif
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-6-18 18:18:44 | 显示全部楼层
函数参数传递分为值传递和指针传递。对于基本类型的值传递,传入的是该值的副本,修改该副本不会对原始值造成影响;而对于指针类型的值传递,传入的是指针所指向地址的副本,这个副本指向同一个地址,因此可以通过该指针修改原始值。结构体指针也是指针类型,如果传入 Merge 函数的是 L1 和 L2 的指针,那么在函数内部修改 L1 和 L2 就可以作用到原始链表的头结点上了。可能你的问题出在 L1 和 L2 是值传递而非指针传递,导致在 Merge 函数中做的修改不能反映到 main 函数里。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-6-18 18:21:19 | 显示全部楼层
在C语言中,函数参数的传递方式可以是值传递或地址传递。对于基本数据类型(如int、float等),采用值传递的方式,即将变量的值复制给形式参数,在函数内部对形参的修改不会影响到实参的值。而对于指针类型,采用地址传递的方式,即将实参的地址传递给形式参数,函数内部通过操作该地址所指向的内存,可以修改实参所指向的数据。

在你的代码中,`List`类型是指向结构体 `Node` 的指针类型,当你将 `L1` 和 `L2` 作为函数参数进行传递时,实际上是将它们的值(即结构体指针的地址)复制给了函数内部的形参 `L1` 和 `L2`。因此,在函数内部修改 `L1` 和 `L2` 的指向并不会影响原始的链表头节点。

要解决这个问题,可以考虑使用指向指针的指针(双重指针)来实现地址传递,以达到在函数内部修改链表头节点的目的。函数声明和定义需要做以下修改:


  1. List Merge(List* L1, List* L2);
复制代码


在函数内部,通过对指针的间接引用,修改指针指向的值即可:

  1. List Merge(List* L1, List* L2) {
  2.     List head, temp;
  3.     head = temp = (List)malloc(sizeof(struct Node));

  4.     *L1 = (*L1)->Next;  // 修改L1指针指向的值,使其指向下一个节点
  5.     *L2 = (*L2)->Next;  // 修改L2指针指向的值,使其指向下一个节点

  6.     // 其他代码不变...

  7.     return head;
  8. }
复制代码


在函数调用时,传入 `&L1` 和 `&L2`,以传递它们的地址(即指向指针的指针):

  1. L = Merge(&L1, &L2);
复制代码


这样,在函数内部对 `L1` 和 `L2` 的操作就能够影响到原始的链表头节点了。

求最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-18 18:28:17 | 显示全部楼层
sfqxx 发表于 2023-6-18 18:21
在C语言中,函数参数的传递方式可以是值传递或地址传递。对于基本数据类型(如int、float等),采用值传递 ...

我只能在Merge函数里做修改,参数只能是这样List Merge( List L1, List L2 ),我该如何解决呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-18 18:34:17 | 显示全部楼层
sfqxx 发表于 2023-6-18 18:21
在C语言中,函数参数的传递方式可以是值传递或地址传递。对于基本数据类型(如int、float等),采用值传递 ...

将 `L1` 和 `L2` 作为函数参数进行传递时,实际上是将它们的值(即结构体指针的地址)复制给了函数内部的形参 `L1` 和 `L2`。 那么传递&L1和&L2 实际上是传递的什么呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-18 20:23:52 | 显示全部楼层
有人吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-18 20:30:33 | 显示全部楼层
  1. List Merge( List L1, List L2 )
  2. {
  3.     List head,temp,TL1,TL2;
  4.     head = temp = (List)malloc(sizeof(struct Node));
  5.    
  6.    
  7.         TL1 = L1->Next;
  8.         TL2 = L2->Next;


  9.       while(TL1 && TL2)
  10.      {
  11.         if(TL1->Data <= TL2->Data)
  12.         {
  13.                 temp->Next = TL1;
  14.                 TL1 = TL1->Next;
  15.         }
  16.         else
  17.         {
  18.                 temp->Next = TL2;
  19.                 TL2 = TL2->Next;
  20.         }
  21.         temp = temp->Next;
  22.     }
  23.    
  24.     if(TL1)
  25.     {
  26.         while(TL1)
  27.         {
  28.             temp->Next = TL1;
  29.             TL1 = TL1->Next;
  30.             temp = temp->Next;
  31.         }
  32.         temp->Next = NULL;
  33.     }
  34.    
  35.     else if(TL2)
  36.     {
  37.          while(TL2)
  38.         {
  39.             temp->Next = TL2;
  40.             TL2 = TL2->Next;
  41.             temp = temp->Next;
  42.         }
  43.         temp->Next = NULL;
  44.     }
  45.     else
  46.         temp->Next = NULL;

  47.     //到这里L1 L2为NULL 运行到后面在main函数里打印出L1 L2为原始头节点。。
  48. L1->Next = NULL;
  49. L2->Next = NULL;

  50.     return head;
  51. }
复制代码


代码修改一下就可以了 真的希望有大佬出来解释一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-18 20:36:59 | 显示全部楼层
@isdkz 能帮我看看吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-6-18 20:42:26 | 显示全部楼层
在C语言中,函数参数传递有两种方式:传值和传址。传值是将参数的值拷贝一份传入函数内部,对参数的修改不会影响原始值;而传址是将参数的内存地址传入函数内部,因此对参数的修改会直接反映到原始值上。

对于指针类型的参数,传递时一般是传递指针的值,即指针变量所指向的内存地址。这样做相当于传址,因为函数内部可以通过指针来访问原始值的内存地址,并对其值进行修改。

回到你的问题,你在Merge函数中对L1和L2指针的修改并不能影响main函数中的L1和L2的值,因为你修改的是指针变量本身的值,而非其指向的内存地址的值。要想在Merge函数中修改L1和L2的值,可以使用指向指针的指针或者指针的引用作为函数参数,这样可以实现对指针变量本身的修改,从而使得修改在函数外部可见。

以下是使用指针的指针实现对L1和L2的修改的示例代码:

  1. List Merge( List* pL1, List* pL2 )
  2. {
  3.     List head,temp;
  4.     head = temp = (List)malloc(sizeof(struct Node));
  5.    
  6.     List L1 = (*pL1)->Next;
  7.     List L2 = (*pL2)->Next;

  8.     while(L1 && L2)
  9.     {
  10.         if(L1->Data <= L2->Data)
  11.         {
  12.             temp->Next = L1;
  13.             L1 = L1->Next;
  14.         }
  15.         else
  16.         {
  17.             temp->Next = L2;
  18.             L2 = L2->Next;
  19.         }
  20.         temp = temp->Next;
  21.     }
  22.    
  23.     if(L1)
  24.     {
  25.         while(L1)
  26.         {
  27.             temp->Next = L1;
  28.             L1 = L1->Next;
  29.             temp = temp->Next;
  30.         }
  31.         temp->Next = NULL;
  32.     }
  33.     else if(L2)
  34.     {
  35.         while(L2)
  36.         {
  37.             temp->Next = L2;
  38.             L2 = L2->Next;
  39.             temp = temp->Next;
  40.         }
  41.         temp->Next = NULL;
  42.     }
  43.     else
  44.         temp->Next = NULL;

  45.     *pL1 = head; // 修改 L1 指针的值,使其指向合并后的链表头
  46.     (*pL2)->Next = NULL; // 将 L2 头节点的 Next 指针置为 NULL,防止出现错误

  47.     return head;
  48. }
复制代码

在main函数中,可以这样调用Merge函数:

  1. L = Merge(&L1, &L2);
复制代码


注意,由于L1和L2都是带头结点的链表,所以在Merge函数返回之前要将它们的头节点的Next指针置为NULL,以免出现链接关系错乱的情况。

如果只能在Merge函数里做修改,那么最简单的方式是使用一个新的指针变量p指向head,然后在函数中修改p的值即可,这样就不会修改原始的L1和L2指针了。具体实现如下:

  1. List Merge( List L1, List L2 )
  2. {
  3.     List head,temp,p;
  4.     head = temp = (List)malloc(sizeof(struct Node));
  5.     p = head; // 新增一个指针p,指向head
  6.    
  7.     L1 = L1->Next;
  8.     L2 = L2->Next;

  9.     while(L1 && L2)
  10.     {
  11.         if(L1->Data <= L2->Data)
  12.         {
  13.             p->Next = L1; // 使用p指针更新链表
  14.             L1 = L1->Next;
  15.         }
  16.         else
  17.         {
  18.             p->Next = L2; // 使用p指针更新链表
  19.             L2 = L2->Next;
  20.         }
  21.         p = p->Next;
  22.     }
  23.    
  24.     if(L1)
  25.     {
  26.         while(L1)
  27.         {
  28.             p->Next = L1;
  29.             L1 = L1->Next;
  30.             p = p->Next;
  31.         }
  32.         p->Next = NULL;
  33.     }
  34.     else if(L2)
  35.     {
  36.         while(L2)
  37.         {
  38.             p->Next = L2;
  39.             L2 = L2->Next;
  40.             p = p->Next;
  41.         }
  42.         p->Next = NULL;
  43.     }
  44.     else
  45.         p->Next = NULL;

  46.     return head;
  47. }
复制代码


调用方式与之前相同:

  1. L = Merge(L1, L2);
复制代码

需要注意的是,在Merge函数中只要涉及到链表的插入、删除、移动等操作,都需要使用p指针来修改链表结构,以免影响原始的L1和L2指针。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-18 21:03:39 | 显示全部楼层
有没有一个不是人工智能回答的呀,有没有真人回答一下

本题我已测试过L1 L2是一个结构体指针 传进Merge函数里做修改 main函数打印也会改变  如图: ad106bc074cdac543070b1401ce647a.png

@小甲鱼 他们的回答都是通过L1 L2在Merge函数修改节点位置在main函数里是无法修改的  而在Merge函数里通过L1 L2头节点下一个指NULL时  在main函数里打印的NULL 能够被修改
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-18 21:47:51 | 显示全部楼层
完整的测试代码
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef int ElementType;
  4. typedef struct Node *PtrToNode;
  5. struct Node {
  6.     ElementType Data;
  7.     PtrToNode   Next;
  8. };
  9. typedef PtrToNode List;

  10. List Read(); /* 细节在此不表     (也就是说提交的时候可以不考虑,不过还是要写的!)    */
  11. void Print( List L ); /* 细节在此不表;空链表将输出NULL   (同上)*/

  12. List Merge( List L1, List L2 );

  13. int main()
  14. {
  15.     List L1, L2, L;
  16.     L1 = Read();
  17.     L2 = Read();
  18.     L = Merge(L1, L2);
  19.     Print(L);
  20.     Print(L1);
  21.     Print(L2);
  22.     return 0;
  23. }

  24. /* 你的代码将被嵌在这里 */
  25. List Read()
  26. {
  27.     int n,i;
  28.     scanf("%d",&n);
  29.     List L=(List)malloc(sizeof(PtrToNode));   ///申请一个头结点
  30.     L->Next = NULL;        ///头指针为空
  31.     if(n)    ///当n不是0时
  32.     {
  33.         List r=L;     ///r是一个中间变量的节点
  34.         for(i=0;i<n;i++)
  35.         {
  36.             List p=(List)malloc(sizeof(struct Node));
  37.             scanf("%d",&(p->Data));    ///尾插法
  38.             r->Next = p;
  39.             r = p;
  40.         }
  41.         r->Next = NULL;         
  42.     }
  43.     return L;
  44. }

  45. void Print( List L )
  46. {
  47.    List p=L->Next;
  48.    if(p)
  49.    {
  50.        List r;
  51.        r = L;
  52.        while(r->Next)
  53.        {
  54.            r = r->Next;
  55.            printf("%d ",r->Data);
  56.        }
  57.    }
  58.    else
  59.    {
  60.        printf("NULL");
  61.    }
  62.    printf("\n");
  63. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-6-18 23:00:00 | 显示全部楼层
a905448839 发表于 2023-6-18 21:03
有没有一个不是人工智能回答的呀,有没有真人回答一下

本题我已测试过L1 L2是一个结构体指针 传进Merge ...

那就来个不是ai的回答
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef int ElementType;
  4. typedef struct Node *PtrToNode;

  5. struct Node {
  6.     ElementType Data;
  7.     PtrToNode Next;
  8. };

  9. typedef PtrToNode List;

  10. List Read(); /* 细节在此不表 (也就是说提交的时候可以不考虑,不过还是要写的!) */
  11. void Print(List L); /* 细节在此不表;空链表将输出NULL   (同上)*/
  12. List Merge(List L1, List L2);


  13. // 你是不是忘了写这个函数了?
  14. void list_free(List L) {
  15.     if(L) list_free(L->Next);
  16.     free(L);
  17. }

  18. int main(void) {
  19.     List L1, L2, L;
  20.     L1 = Read();
  21.     L2 = Read();
  22.     L = Merge(L1, L2);
  23.     Print(L);
  24.     Print(L1);
  25.     Print(L2);
  26.     list_free(L);
  27.     list_free(L1);
  28.     list_free(L2);
  29.     return 0;
  30. }

  31. /* 你的代码将被嵌在这里 */
  32. List Read() {
  33.     int n, i;
  34.     scanf("%d", &n);
  35.     //List L = (List)malloc(sizeof(PtrToNode)); /// 申请一个头结点
  36.     //List L = malloc(sizeof(PtrToNode));       // 这是C语言,没必要强制转换
  37.     //List L = malloc(sizeof(struct Node));     // 是PtrToNode还是struct Node?
  38.     List L = malloc(sizeof(*L));                // 对吧?管他什么类型了
  39.     L->Next = NULL;                           // 头指针为空
  40.     if(n)                                     // 当n不是0时
  41.     {
  42.         List r = L; /// r是一个中间变量的节点
  43.         for(i = 0; i < n; i++) {
  44.             //List p = (List)malloc(sizeof(struct Node));
  45.             List p = malloc(sizeof(*p));
  46.             //scanf("%d", &(p->Data)); // 尾插法
  47.             scanf("%d", &p->Data);  // 尾插法
  48.             r->Next = p;
  49.             r = p;
  50.         }
  51.         r->Next = NULL;
  52.     }
  53.     return L;
  54. }

  55. void Print(List L) {
  56.     List p = L->Next;
  57.     if(p) {
  58.         List r;
  59.         r = L;
  60.         while(r->Next) {
  61.             r = r->Next;
  62.             printf("%d ", r->Data);
  63.         }
  64.     } else {
  65.         printf("NULL");
  66.     }
  67.     printf("\n");
  68. }

  69. // 定义是什么?
  70. List Merge(List L1, List L2) {
  71.     List L = malloc(sizeof(*L));
  72.     L->Next = NULL;
  73.     List *px = &L->Next;
  74.     List p1 = L1->Next;
  75.     while(p1) {
  76.         *px = malloc(sizeof(**px));
  77.         (*px)->Data = p1->Data;
  78.         (*px)->Next = NULL;
  79.         p1 = p1->Next;
  80.         px = &(*px)->Next;
  81.     }
  82.     List p2 = L2->Next;
  83.     while(p2) {
  84.         *px = malloc(sizeof(**px));
  85.         (*px)->Data = p2->Data;
  86.         (*px)->Next = NULL;
  87.         p2 = p2->Next;
  88.         px = &(*px)->Next;
  89.     }
  90.     return L;
  91. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-6-18 23:08:11 | 显示全部楼层
稍微改一改

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef int ElementType;
  4. typedef struct Node *PtrToNode;

  5. struct Node {
  6.     ElementType Data;
  7.     PtrToNode Next;
  8. };

  9. typedef PtrToNode List;

  10. List Read(); /* 细节在此不表 (也就是说提交的时候可以不考虑,不过还是要写的!) */
  11. void Print(List L); /* 细节在此不表;空链表将输出NULL   (同上)*/
  12. List Merge(List L1, List L2);


  13. // 你是不是忘了写这个函数了?
  14. void list_free(List L) {
  15.     if(L) list_free(L->Next);
  16.     free(L);
  17. }

  18. int main(void) {
  19.     List L1, L2, L;
  20.     L1 = Read();
  21.     L2 = Read();
  22.     L = Merge(L1, L2);
  23.     Print(L);
  24.     Print(L1);
  25.     Print(L2);
  26.     list_free(L);
  27.     list_free(L1);
  28.     list_free(L2);
  29.     return 0;
  30. }

  31. /* 你的代码将被嵌在这里 */
  32. List Read() {
  33.     int n, i;
  34.     scanf("%d", &n);
  35.     //List L = (List)malloc(sizeof(PtrToNode)); /// 申请一个头结点
  36.     //List L = malloc(sizeof(PtrToNode));       // 这是C语言,没必要强制转换
  37.     //List L = malloc(sizeof(struct Node));     // 是PtrToNode还是struct Node?
  38.     List L = malloc(sizeof(*L));                // 对吧?管他什么类型了
  39.     L->Next = NULL;                           // 头指针为空
  40.     if(n)                                     // 当n不是0时
  41.     {
  42.         List r = L; /// r是一个中间变量的节点
  43.         for(i = 0; i < n; i++) {
  44.             //List p = (List)malloc(sizeof(struct Node));
  45.             List p = malloc(sizeof(*p));
  46.             //scanf("%d", &(p->Data)); // 尾插法
  47.             scanf("%d", &p->Data);  // 尾插法
  48.             r->Next = p;
  49.             r = p;
  50.         }
  51.         r->Next = NULL;
  52.     }
  53.     return L;
  54. }

  55. void Print(List L) {
  56.     List p = L->Next;
  57.     if(p) {
  58.         List r;
  59.         r = L;
  60.         while(r->Next) {
  61.             r = r->Next;
  62.             printf("%d ", r->Data);
  63.         }
  64.     } else {
  65.         printf("NULL");
  66.     }
  67.     printf("\n");
  68. }

  69. // 好了,知道定义了
  70. List Merge(List L1, List L2) {
  71.     List L = malloc(sizeof(*L));
  72.     L->Next = NULL;
  73.     List *px = &L->Next;
  74.     List p1 = L1->Next;
  75.     List p2 = L2->Next;
  76.     while(p1 && p2) {
  77.         ElementType v;
  78.         ElementType a = p1->Data;
  79.         ElementType b = p2->Data;
  80.         if(a < b) {
  81.             v = a; p1 = p1->Next;
  82.         } else {
  83.             v = b; p2 = p2->Next;
  84.         }
  85.         *px = malloc(sizeof(**px));
  86.         (*px)->Data = v;
  87.         (*px)->Next = NULL;
  88.         px = &(*px)->Next;
  89.     }
  90.     while(p1) {
  91.         *px = malloc(sizeof(**px));
  92.         (*px)->Data = p1->Data;
  93.         (*px)->Next = NULL;
  94.         p1 = p1->Next;
  95.         px = &(*px)->Next;
  96.     }
  97.     while(p2) {
  98.         *px = malloc(sizeof(**px));
  99.         (*px)->Data = p2->Data;
  100.         (*px)->Next = NULL;
  101.         p2 = p2->Next;
  102.         px = &(*px)->Next;
  103.     }
  104.     return L;
  105. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-6-18 23:24:19 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef int ElementType;
  4. typedef struct Node *PtrToNode;

  5. struct Node {
  6.     ElementType Data;
  7.     PtrToNode Next;
  8. };

  9. typedef PtrToNode List;

  10. List Read(); /* 细节在此不表 (也就是说提交的时候可以不考虑,不过还是要写的!) */
  11. void Print(List L); /* 细节在此不表;空链表将输出NULL   (同上)*/
  12. List Merge(List L1, List L2);


  13. // 你是不是忘了写这个函数了?
  14. void list_free(List L) {
  15.     if(L) list_free(L->Next);
  16.     free(L);
  17. }

  18. int main(void) {
  19.     List L1, L2, L;
  20.     L1 = Read();
  21.     L2 = Read();
  22.     L = Merge(L1, L2);
  23.     Print(L);
  24.     Print(L1);
  25.     Print(L2);
  26.     list_free(L);
  27.     //list_free(L1);
  28.     //list_free(L2);
  29.     // 要共用节点的话,这两个就只能单独释放了
  30.     free(L1);
  31.     free(L2);
  32.     return 0;
  33. }

  34. /* 你的代码将被嵌在这里 */
  35. List Read() {
  36.     int n, i;
  37.     scanf("%d", &n);
  38.     //List L = (List)malloc(sizeof(PtrToNode)); /// 申请一个头结点
  39.     //List L = malloc(sizeof(PtrToNode));       // 这是C语言,没必要强制转换
  40.     //List L = malloc(sizeof(struct Node));     // 是PtrToNode还是struct Node?
  41.     List L = malloc(sizeof(*L));                // 对吧?管他什么类型了
  42.     L->Next = NULL;                           // 头指针为空
  43.     if(n)                                     // 当n不是0时
  44.     {
  45.         List r = L; /// r是一个中间变量的节点
  46.         for(i = 0; i < n; i++) {
  47.             //List p = (List)malloc(sizeof(struct Node));
  48.             List p = malloc(sizeof(*p));
  49.             //scanf("%d", &(p->Data)); // 尾插法
  50.             scanf("%d", &p->Data);  // 尾插法
  51.             r->Next = p;
  52.             r = p;
  53.         }
  54.         r->Next = NULL;
  55.     }
  56.     return L;
  57. }

  58. void Print(List L) {
  59.     List p = L->Next;
  60.     if(p) {
  61.         List r;
  62.         r = L;
  63.         while(r->Next) {
  64.             r = r->Next;
  65.             printf("%d ", r->Data);
  66.         }
  67.     } else {
  68.         printf("NULL");
  69.     }
  70.     printf("\n");
  71. }

  72. #if 0
  73. // 好了,知道定义了
  74. List Merge(List L1, List L2) {
  75.     List L = malloc(sizeof(*L));
  76.     L->Next = NULL;
  77.     List *px = &L->Next;
  78.     List p1 = L1->Next;
  79.     List p2 = L2->Next;
  80.     while(p1 && p2) {
  81.         ElementType v;
  82.         ElementType a = p1->Data;
  83.         ElementType b = p2->Data;
  84.         if(a < b) {
  85.             v = a; p1 = p1->Next;
  86.         } else {
  87.             v = b; p2 = p2->Next;
  88.         }
  89.         *px = malloc(sizeof(**px));
  90.         (*px)->Data = v;
  91.         (*px)->Next = NULL;
  92.         px = &(*px)->Next;
  93.     }
  94.     while(p1) {
  95.         *px = malloc(sizeof(**px));
  96.         (*px)->Data = p1->Data;
  97.         (*px)->Next = NULL;
  98.         p1 = p1->Next;
  99.         px = &(*px)->Next;
  100.     }
  101.     while(p2) {
  102.         *px = malloc(sizeof(**px));
  103.         (*px)->Data = p2->Data;
  104.         (*px)->Next = NULL;
  105.         p2 = p2->Next;
  106.         px = &(*px)->Next;
  107.     }
  108.     return L;
  109. }
  110. #else
  111. List Merge(List L1, List L2) {
  112.     List head, temp;
  113.     //head = temp = (List)malloc(sizeof(struct Node));
  114.     head = temp = malloc(sizeof(*head));

  115.     L1 = L1->Next;
  116.     L2 = L2->Next;

  117.     while(L1 && L2) {
  118.         if(L1->Data <= L2->Data) {
  119.             temp->Next = L1;
  120.             L1 = L1->Next;
  121.         } else {
  122.             temp->Next = L2;
  123.             L2 = L2->Next;
  124.         }
  125.         temp = temp->Next;
  126.     }

  127.     if(L1) {
  128.         while(L1) {
  129.             temp->Next = L1;
  130.             L1 = L1->Next;
  131.             temp = temp->Next;
  132.         }
  133.         temp->Next = NULL;
  134.     }
  135.     else if(L2) {
  136.         while(L2) {
  137.             temp->Next = L2;
  138.             L2 = L2->Next;
  139.             temp = temp->Next;
  140.         }
  141.         temp->Next = NULL;
  142.     } else
  143.         temp->Next = NULL;

  144.     // 到这里L1 L2为NULL 运行到后面在main函数里打印出L1 L2为原始头节点。。

  145.     return head;
  146. }
  147. #endif
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-18 23:42:43 | 显示全部楼层

感谢你的回复,真的很牛,不过这二级指针我越看越迷糊,我也free不了内存空间,我只能对Merge函数内容做出修改,参数也不能更改。main函数也不能动。我把你的代码copy过去测试了,我把测试结果发出来。
9e4d0d98f2f3e11726f57a37c35575d.png
dd6e228b10892501e4176888bf5d77a.png
1176f1e42cb9db0d84946e4e891c4a6.png

你的第一次回复 Merge函数代码 测试:
  1. List Merge(List L1, List L2) {
  2.     List L = malloc(sizeof(*L));
  3.     L->Next = NULL;
  4.     List *px = &L->Next;
  5.     List p1 = L1->Next;
  6.     while(p1) {
  7.         *px = malloc(sizeof(**px));
  8.         (*px)->Data = p1->Data;
  9.         (*px)->Next = NULL;
  10.         p1 = p1->Next;
  11.         px = &(*px)->Next;
  12.     }
  13.     List p2 = L2->Next;
  14.     while(p2) {
  15.         *px = malloc(sizeof(**px));
  16.         (*px)->Data = p2->Data;
  17.         (*px)->Next = NULL;
  18.         p2 = p2->Next;
  19.         px = &(*px)->Next;
  20.     }
  21.     return L;
  22. }
复制代码


1abcbddd95e43351fbf381bb3b285cd.png
b802d82dc226464c619a58cf3567cc0.png

你的第二次回复 Merge函数代码 测试:
  1. List Merge(List L1, List L2) {
  2.     List L = malloc(sizeof(*L));
  3.     L->Next = NULL;
  4.     List *px = &L->Next;
  5.     List p1 = L1->Next;
  6.     List p2 = L2->Next;
  7.     while(p1 && p2) {
  8.         ElementType v;
  9.         ElementType a = p1->Data;
  10.         ElementType b = p2->Data;
  11.         if(a < b) {
  12.             v = a; p1 = p1->Next;
  13.         } else {
  14.             v = b; p2 = p2->Next;
  15.         }
  16.         *px = malloc(sizeof(**px));
  17.         (*px)->Data = v;
  18.         (*px)->Next = NULL;
  19.         px = &(*px)->Next;
  20.     }
  21.     while(p1) {
  22.         *px = malloc(sizeof(**px));
  23.         (*px)->Data = p1->Data;
  24.         (*px)->Next = NULL;
  25.         p1 = p1->Next;
  26.         px = &(*px)->Next;
  27.     }
  28.     while(p2) {
  29.         *px = malloc(sizeof(**px));
  30.         (*px)->Data = p2->Data;
  31.         (*px)->Next = NULL;
  32.         p2 = p2->Next;
  33.         px = &(*px)->Next;
  34.     }
  35.     return L;
  36. }
复制代码


5b63a4d00aad59acc3a4dba4522a798.png
b4083409ed49bef2b36ba6b99cce845.png
也许大佬你没有仔细看题  实现这个题目最后L1 L2指向的下一个节点是NULL  由于我的代码是通过传递进去的L1 L2指针来进行改动移动节点 导致回到主函数中去的时候好像没有改动到L1 L2节点位置 还依然是头节点 我看过一些题解是用两个局部变量的指针指向L1 L2 再来做这两个局部变量的指针移动节点 最后把L1 L2指向的下一个节点为NULL 有这样一段代码实现 我不明白的是 为什么用完局部变量的节点之后  最后L1->Next = NULL和L2->Next = NULL 是能够影响到外面main函数的L1 L2。而直接对L1 L2修改 直到L1 L2都为NULL时返回到main函数,main函数里的L1 L2依然为最开始头节点。

能够实现的代码 使用两个局部变量来移动节点  用temp来指向产生一个新的链表  最后让始终是L1 L2头结点下一个指向NULL  成功影响外面的main函数里的L1 L2:
  1. List Merge( List L1, List L2 )
  2. {
  3.     List head,temp,TL1,TL2;
  4.     head = temp = (List)malloc(sizeof(struct Node));
  5.    
  6.    
  7.         TL1 = L1->Next;
  8.         TL2 = L2->Next;


  9.       while(TL1 && TL2)
  10.      {
  11.         if(TL1->Data <= TL2->Data)
  12.         {
  13.                 temp->Next = TL1;
  14.                 TL1 = TL1->Next;
  15.         }
  16.         else
  17.         {
  18.                 temp->Next = TL2;
  19.                 TL2 = TL2->Next;
  20.         }
  21.         temp = temp->Next;
  22.     }
  23.    
  24.     if(TL1)
  25.     {
  26.         while(TL1)
  27.         {
  28.             temp->Next = TL1;
  29.             TL1 = TL1->Next;
  30.             temp = temp->Next;
  31.         }
  32.         temp->Next = NULL;
  33.     }
  34.    
  35.     else if(TL2)
  36.     {
  37.          while(TL2)
  38.         {
  39.             temp->Next = TL2;
  40.             TL2 = TL2->Next;
  41.             temp = temp->Next;
  42.         }
  43.         temp->Next = NULL;
  44.     }
  45.     else
  46.         temp->Next = NULL;

  47.    
  48. L1->Next = NULL;
  49. L2->Next = NULL;

  50.     return head;
  51. }
复制代码


不能够实现的代码  对传进来L1 L2结构体指针操作  能够实现让两个链表合并成一个递增的顺序链表 但是L1 L2在Merge函数结束时为NULL 回到main函数却变成了最开始L1 L2的头指针:
  1. List Merge( List L1, List L2 )
  2. {
  3.     List head,temp;
  4.     head = temp = (List)malloc(sizeof(struct Node));
  5.    
  6.         L1 = L1->Next;
  7.         L2 = L2->Next;


  8.       while(L1 && L2)
  9.      {
  10.         if(L1->Data <= L2->Data)
  11.         {
  12.                 temp->Next = L1;
  13.                 L1 = L1->Next;
  14.         }
  15.         else
  16.         {
  17.                 temp->Next = L2;
  18.                 L2 = L2->Next;
  19.         }
  20.         temp = temp->Next;
  21.     }
  22.    
  23.     if(L1)
  24.     {
  25.         while(L1)
  26.         {
  27.             temp->Next = L1;
  28.             L1 = L1->Next;
  29.             temp = temp->Next;
  30.         }
  31.         temp->Next = NULL;
  32.     }
  33.    
  34.     else if(L2)
  35.     {
  36.          while(L2)
  37.         {
  38.             temp->Next = L2;
  39.             L2 = L2->Next;
  40.             temp = temp->Next;
  41.         }
  42.         temp->Next = NULL;
  43.     }
  44.     else
  45.         temp->Next = NULL;

  46.     //到这里L1 L2为NULL 运行到后面在main函数里打印出L1 L2为原始头节点。。


  47.     return head;
  48. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-6-19 00:49:54 | 显示全部楼层
a905448839 发表于 2023-6-18 23:42
感谢你的回复,真的很牛,不过这二级指针我越看越迷糊,我也free不了内存空间,我只能对Merge函数内容做 ...

这里需要修改的是L->Next

L1 = L1->Next;
L1->Next = NULL;
这个修改的就是 L->Next->Next 了

  1. L1 = L1->Next;
  2. L1->Next = NULL;
复制代码

  1. L->Next->Next = NULL;
复制代码


他俩一个意思
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-6-19 00:59:17 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef int ElementType;
  4. typedef struct Node *PtrToNode;

  5. struct Node {
  6.     ElementType Data;
  7.     PtrToNode Next;
  8. };

  9. typedef PtrToNode List;

  10. void Print(List L); /* 细节在此不表;空链表将输出NULL   (同上)*/


  11. void list_free(List L) {
  12.     if(L) list_free(L->Next);
  13.     free(L);
  14. }

  15. void set_null(List a, List b) {

  16.     a->Next->Next = NULL;

  17.     b = b->Next;
  18.     b->Next = NULL;
  19. }

  20. int main(void) {
  21.     List L1, L2;
  22.     L1 = malloc(sizeof(*L1));
  23.     L1->Next = malloc(sizeof(*L1->Next));
  24.     L1->Next->Data = 123;
  25.     L2 = malloc(sizeof(*L2));
  26.     L2->Next = malloc(sizeof(*L2->Next));
  27.     L2->Next->Data = 456;
  28.     set_null(L1, L2);
  29.     Print(L1);
  30.     Print(L2);
  31.     list_free(L1);
  32.     list_free(L2);
  33.     return 0;
  34. }

  35. void Print(List L) {
  36.     List p = L->Next;
  37.     if(p) {
  38.         List r;
  39.         r = L;
  40.         while(r->Next) {
  41.             r = r->Next;
  42.             printf("%d ", r->Data);
  43.         }
  44.     } else {
  45.         printf("NULL");
  46.     }
  47.     printf("\n");
  48. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-19 10:12:20 | 显示全部楼层
人造人 发表于 2023-6-18 18:13
我确实没认真看题,^_^
我是先直接看的代码

感谢你的回答 两种方式我都看了! 最后还有一个小问题 在第二个Merge函数里最后L1_bak->Next = NULL;
    L2_bak->Next = NULL; 这里的L1_bak和L2_bak原本是L1 L2头结点位置  这里指向NULL 让main函数L1 L2的下一节点指向NULL了 的的确确影响到了 但是如果在Merge函数里移动L1 L2节点 或者移动L1_bak L2_bak节点 最后在移动的中途节点 或者在最后节点再把下一个节点指向NULL 就不会导致main函数里的L1 L2节点下一个指向为NULL 是原始的情况 是否在Merge函数里移动这些节点 不会导致main函数里的L1 L2节点位置改变 但是如果在Merge函数里直接做指向节点修改 不移动节点就会影响到main函数里的L1 L2指向吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-6-19 10:13:59 | 显示全部楼层
a905448839 发表于 2023-6-19 10:12
感谢你的回答 两种方式我都看了! 最后还有一个小问题 在第二个Merge函数里最后L1_bak->Next = NULL;
   ...

没看懂,用代码说明你的问题吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-10 05:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表