鱼C论坛

 找回密码
 立即注册
查看: 3931|回复: 2

[已解决]数据结构

[复制链接]
发表于 2020-10-19 21:22:30 | 显示全部楼层 |阅读模式

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

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

x
将两个非递减的有序链表合并为一个非递增的有序链表,如何用C代码实现?
要求使用原来两个链表的存储空间
最佳答案
2020-10-20 13:46:05
  1. #include "stdio.h"
  2. #include "stdlib.h"

  3. typedef struct tagLinkList
  4. {
  5.         int data;
  6.         struct tagLinkList * pNext;
  7. }LL,*LPLL;

  8. LPLL AddNode(int data)
  9. {
  10.         LPLL lpNode = (LPLL)malloc(sizeof(LL));
  11.         lpNode->data = data;
  12.         lpNode->pNext = NULL;
  13.         return lpNode;
  14. }

  15. void DestoryList(LPLL head)
  16. {
  17.         while(head != NULL)
  18.         {
  19.                 LPLL pNode = head;
  20.                 head = head->pNext;
  21.                 free(pNode);
  22.         }
  23. }

  24. void DisplayList(LPLL head)
  25. {
  26.         while(head != NULL)
  27.         {
  28.                 printf("%d,",head->data);
  29.                 head = head->pNext;
  30.         }

  31.         printf("\n");
  32. }

  33. LPLL MergeList(LPLL l1,LPLL l2)
  34. {
  35.         if(l1 == NULL)
  36.         {
  37.                 return l2;
  38.         }
  39.        
  40.         if(l2 == NULL)
  41.         {
  42.                 return l1;
  43.         }
  44.        
  45.         LPLL lpHead = (l1->data < l2->data) ? l1 : l2;
  46.         LPLL lpBig = (l1->data < l2->data) ? l2 : l1;
  47.        
  48.         LPLL lpSmall = lpHead;
  49.        
  50.         while(lpSmall != NULL)
  51.         {
  52.                 if(lpSmall->pNext == NULL)
  53.                 {
  54.                         lpSmall->pNext = lpBig;
  55.                         break;
  56.                 }
  57.                
  58.                 if(lpSmall->pNext->data < lpBig->data)
  59.                 {
  60.                         lpSmall = lpSmall->pNext;
  61.                 }
  62.                 else
  63.                 {
  64.                         LPLL lpNode = lpSmall->pNext;
  65.                         lpSmall->pNext = lpBig;
  66.                        
  67.                         lpSmall = lpBig;
  68.                         lpBig = lpNode;
  69.                 }
  70.         }       

  71.         return lpHead;
  72. }

  73. int main()
  74. {
  75.         int i = 0;
  76.         LPLL pList1 = NULL;
  77.         LPLL pList2 = NULL;
  78.         LPLL pTail = NULL;

  79.         for(i = 5 ; i <= 20 ; i ++)
  80.         {
  81.                 if(pList1 == NULL)
  82.                 {
  83.                         pList1 = AddNode(i * 2);
  84.                         pTail = pList1;
  85.                 }
  86.                 else
  87.                 {
  88.                         pTail->pNext = AddNode(i * 2);
  89.                         pTail = pTail->pNext;
  90.                 }
  91.         }

  92.         for(i = 1 ; i <= 10 ; i ++)
  93.         {
  94.                 if(pList2 == NULL)
  95.                 {
  96.                         pList2 = AddNode(i * 3);
  97.                         pTail = pList2;
  98.                 }
  99.                 else
  100.                 {
  101.                         pTail->pNext = AddNode(i * 3);
  102.                         pTail = pTail->pNext;
  103.                 }
  104.         }
  105.        
  106.         DisplayList(pList1);
  107.         DisplayList(pList2);

  108.         pList1 = MergeList(pList1,pList2);

  109.         DisplayList(pList1);
  110.         DestoryList(pList1);
  111.        
  112.         return 0;
  113. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-10-20 13:46:05 | 显示全部楼层    本楼为最佳答案   
  1. #include "stdio.h"
  2. #include "stdlib.h"

  3. typedef struct tagLinkList
  4. {
  5.         int data;
  6.         struct tagLinkList * pNext;
  7. }LL,*LPLL;

  8. LPLL AddNode(int data)
  9. {
  10.         LPLL lpNode = (LPLL)malloc(sizeof(LL));
  11.         lpNode->data = data;
  12.         lpNode->pNext = NULL;
  13.         return lpNode;
  14. }

  15. void DestoryList(LPLL head)
  16. {
  17.         while(head != NULL)
  18.         {
  19.                 LPLL pNode = head;
  20.                 head = head->pNext;
  21.                 free(pNode);
  22.         }
  23. }

  24. void DisplayList(LPLL head)
  25. {
  26.         while(head != NULL)
  27.         {
  28.                 printf("%d,",head->data);
  29.                 head = head->pNext;
  30.         }

  31.         printf("\n");
  32. }

  33. LPLL MergeList(LPLL l1,LPLL l2)
  34. {
  35.         if(l1 == NULL)
  36.         {
  37.                 return l2;
  38.         }
  39.        
  40.         if(l2 == NULL)
  41.         {
  42.                 return l1;
  43.         }
  44.        
  45.         LPLL lpHead = (l1->data < l2->data) ? l1 : l2;
  46.         LPLL lpBig = (l1->data < l2->data) ? l2 : l1;
  47.        
  48.         LPLL lpSmall = lpHead;
  49.        
  50.         while(lpSmall != NULL)
  51.         {
  52.                 if(lpSmall->pNext == NULL)
  53.                 {
  54.                         lpSmall->pNext = lpBig;
  55.                         break;
  56.                 }
  57.                
  58.                 if(lpSmall->pNext->data < lpBig->data)
  59.                 {
  60.                         lpSmall = lpSmall->pNext;
  61.                 }
  62.                 else
  63.                 {
  64.                         LPLL lpNode = lpSmall->pNext;
  65.                         lpSmall->pNext = lpBig;
  66.                        
  67.                         lpSmall = lpBig;
  68.                         lpBig = lpNode;
  69.                 }
  70.         }       

  71.         return lpHead;
  72. }

  73. int main()
  74. {
  75.         int i = 0;
  76.         LPLL pList1 = NULL;
  77.         LPLL pList2 = NULL;
  78.         LPLL pTail = NULL;

  79.         for(i = 5 ; i <= 20 ; i ++)
  80.         {
  81.                 if(pList1 == NULL)
  82.                 {
  83.                         pList1 = AddNode(i * 2);
  84.                         pTail = pList1;
  85.                 }
  86.                 else
  87.                 {
  88.                         pTail->pNext = AddNode(i * 2);
  89.                         pTail = pTail->pNext;
  90.                 }
  91.         }

  92.         for(i = 1 ; i <= 10 ; i ++)
  93.         {
  94.                 if(pList2 == NULL)
  95.                 {
  96.                         pList2 = AddNode(i * 3);
  97.                         pTail = pList2;
  98.                 }
  99.                 else
  100.                 {
  101.                         pTail->pNext = AddNode(i * 3);
  102.                         pTail = pTail->pNext;
  103.                 }
  104.         }
  105.        
  106.         DisplayList(pList1);
  107.         DisplayList(pList2);

  108.         pList1 = MergeList(pList1,pList2);

  109.         DisplayList(pList1);
  110.         DestoryList(pList1);
  111.        
  112.         return 0;
  113. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-20 14:54:53 | 显示全部楼层
数据结构的相关作业,有没有简单点的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 18:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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