鱼C论坛

 找回密码
 立即注册
查看: 3677|回复: 5

求助大神啊,这个链表的合并函数,实在找不出哪里不对啊~~~~

[复制链接]
发表于 2012-10-13 16:03:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位大神多指教啊,实在找不出这个合并链表函数的错误在哪里,先谢谢了
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>

  4. typedef struct NODE *pNode;
  5. struct NODE{
  6.         int data;
  7.         pNode pNext;
  8. };
  9. pNode creat_list(int );//链表的创建
  10. void traverse_list(pNode);//链表的遍历
  11. pNode Union(pNode ,pNode,pNode);//合并两个链表

  12. int main(void)
  13. {
  14.         int len1,len2;
  15.         pNode pHead;
  16.         pNode pLast;
  17.         pNode pTem=(pNode)malloc(sizeof(*pTem));
  18.         pTem->pNext=NULL;

  19.         printf("请输入第一个链表的节点数:");
  20.         scanf("%d",&len1);
  21.         pHead=creat_list(len1);
  22.         traverse_list(pHead);
  23.         printf("请输入第二个链表的节点数:");
  24.         scanf("%d",&len2);
  25.         pLast=creat_list(len2);
  26.         traverse_list(pLast);
  27.         pTem=Union(pHead,pLast,pTem);
  28.         traverse_list(pTem);
  29.         system("pause");

  30.         return 0;
  31. }


  32. pNode creat_list(int n)
  33. {
  34.         int i;

  35.         pNode pHead=(pNode)malloc(sizeof(*pHead));
  36.         if(NULL==pHead)
  37.         {
  38.                 printf("内存分配失败!");
  39.                 exit(-1);
  40.         }
  41.         pHead->pNext=NULL;
  42.         pNode pTem=pHead;
  43.         for(i=0;i<n;i++)
  44.         {
  45.                 pNode pNew=(pNode)malloc(sizeof(*pNew));
  46.                 if(NULL==pNew)
  47.                 {
  48.                         printf("内存分配失败!");
  49.                         exit(-1);
  50.                 }
  51.                 pTem->pNext=pNew;
  52.                 printf("请输入第%d个节点的数据",i+1);
  53.                 scanf("%d",&pNew->data);
  54.                 pNew->pNext=NULL;
  55.                 pTem=pNew;
  56.         }

  57.         return pHead;
  58. }


  59. void traverse_list(pNode pHead)
  60. {
  61.         pNode pTem=pHead->pNext;
  62.         while(NULL!=pTem)
  63.         {
  64.                 printf("%d\n",pTem->data);
  65.                 pTem=pTem->pNext;
  66.         }
  67. }


  68. pNode Union(pNode pHead,pNode pLast,pNode pTem)
  69. {
  70.         pNode ph,pl,pt;
  71.         ph=pHead->pNext;
  72.         pl=pLast->pNext;
  73.         pTem=ph;pt=pTem;

  74.         while(ph&&pl)
  75.         {
  76.                 if(ph->data<=pl->data)
  77.                 {
  78.                         pt->pNext=ph;
  79.                         pt=ph;
  80.                         ph=ph->pNext;
  81.                 }
  82.                 else
  83.                 {
  84.                         pt->pNext=pl;
  85.                         pt=pl;
  86.                         pl=pl->pNext;
  87.                 }
  88.         }
  89.         pt->pNext=ph?ph:pl;
  90.         free(pl);

  91.         return pt;
  92. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-13 16:42:23 | 显示全部楼层
自己顶一下,别这么快沉了,在线等啊~~~~
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-13 20:12:54 | 显示全部楼层
改过以后的,改动的地方加了注释。。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>

  4. typedef struct NODE *pNode;
  5. struct NODE{
  6.         int data;
  7.         pNode pNext;
  8. };
  9. pNode creat_list(int );//链表的创建
  10. void traverse_list(pNode);//链表的遍历
  11. void Union(pNode ,pNode,pNode*);//合并两个链表

  12. int main(void)
  13. {
  14.         int len1,len2;
  15.         pNode pHead;
  16.         pNode pLast;

  17.                 pNode pTem = NULL;;
  18.         //pNode pTem=(pNode)malloc(sizeof(*pTem));        不需要为pTem分配空间。
  19.                
  20.        // pTem->pNext=NULL;

  21.         printf("请输入第一个链表的节点数:");
  22.         scanf("%d",&len1);
  23.         pHead=creat_list(len1);
  24.         traverse_list(pHead);
  25.         printf("请输入第二个链表的节点数:");
  26.         scanf("%d",&len2);
  27.         pLast=creat_list(len2);
  28.         traverse_list(pLast);
  29.         Union(pHead,pLast,&pTem);
  30.         traverse_list(pTem);
  31.         system("pause");

  32.         return 0;
  33. }


  34. pNode creat_list(int n)
  35. {
  36.         int i;

  37.         pNode pHead=(pNode)malloc(sizeof(*pHead));
  38.         if(NULL==pHead)
  39.         {
  40.                 printf("内存分配失败!");
  41.                 exit(-1);
  42.         }
  43.         pHead->pNext=NULL;
  44.         pNode pTem=pHead;
  45.         for(i=0;i<n;i++)
  46.         {
  47.                 pNode pNew=(pNode)malloc(sizeof(*pNew));
  48.                 if(NULL==pNew)
  49.                 {
  50.                         printf("内存分配失败!");
  51.                         exit(-1);
  52.                 }
  53.                 pTem->pNext=pNew;
  54.                 printf("请输入第%d个节点的数据",i+1);
  55.                 scanf("%d",&pNew->data);
  56.                 pNew->pNext=NULL;
  57.                 pTem=pNew;
  58.         }

  59.         return pHead;
  60. }


  61. void traverse_list(pNode pHead)
  62. {
  63.         pNode pTem=pHead->pNext;
  64.         while(NULL!=pTem)
  65.         {
  66.                 printf("%d\n",pTem->data);
  67.                 pTem=pTem->pNext;
  68.         }
  69. }


  70. void Union(pNode pHead,pNode pLast,pNode* pTem)        //你的pTem参数没有什么意义,这里用PNode*格式的。
  71. {
  72.         pNode ph,pl,pt;
  73.         ph=pHead->pNext;
  74.         pl=pLast->pNext;
  75.        (*pTem)=pHead;pt=*pTem;
  76.                
  77.         while(ph&&pl)
  78.         {
  79.                 if(ph->data<=pl->data)
  80.                 {
  81.                         pt->pNext=ph;
  82.                         pt=ph;
  83.                         ph=ph->pNext;
  84.                 }
  85.                 else
  86.                 {
  87.                         pt->pNext=pl;
  88.                         pt=pl;
  89.                         pl=pl->pNext;
  90.                 }
  91.         }
  92.         pt->pNext=ph?ph:pl;
  93.         free(pLast);                                //这里释放的是pLast;

  94. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-13 20:26:18 | 显示全部楼层

感谢,上代码的时候,没注意,第二处错误是打错的;另两处错误,我再消化一下,再次感谢~~~~
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-13 23:43:19 | 显示全部楼层
晓北 发表于 2012-10-13 20:26
感谢,上代码的时候,没注意,第二处错误是打错的;另两处错误,我再消化一下,再次感谢~~~~

我们这里需要返回head指针。这有两个方法,1、直接返回head指针,Union()函数就不需要第三个参数了。
2、需要一个参数来接受这个head指针。这个形参的类型必须是二级指针类型(pNode* )才能改变实参的指针,若是pNode类型,则只是改变了实参的副本。


你可以把指针再复习复习,可以看看《A Tutorial on pointers of c》这份资料。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-14 08:04:17 | 显示全部楼层
玩酷子弟lv 发表于 2012-10-13 23:43
我们这里需要返回head指针。这有两个方法,1、直接返回head指针,Union()函数就不需要第三个参数了。
2、 ...

谢谢,昨晚我还是想明白了,资料收下了,学习学习
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-15 14:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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