鱼C论坛

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

[已解决]数据结构

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

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

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

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

typedef struct tagLinkList
{
        int data;
        struct tagLinkList * pNext;
}LL,*LPLL;

LPLL AddNode(int data)
{
        LPLL lpNode = (LPLL)malloc(sizeof(LL));
        lpNode->data = data;
        lpNode->pNext = NULL;
        return lpNode;
}

void DestoryList(LPLL head)
{
        while(head != NULL)
        {
                LPLL pNode = head;
                head = head->pNext;
                free(pNode);
        }
}

void DisplayList(LPLL head)
{
        while(head != NULL)
        {
                printf("%d,",head->data);
                head = head->pNext;
        }

        printf("\n");
}

LPLL MergeList(LPLL l1,LPLL l2)
{
        if(l1 == NULL)
        {
                return l2;
        }
        
        if(l2 == NULL)
        {
                return l1;
        }
        
        LPLL lpHead = (l1->data < l2->data) ? l1 : l2;
        LPLL lpBig = (l1->data < l2->data) ? l2 : l1;
        
        LPLL lpSmall = lpHead;
        
        while(lpSmall != NULL)
        {
                if(lpSmall->pNext == NULL)
                {
                        lpSmall->pNext = lpBig;
                        break;
                }
                
                if(lpSmall->pNext->data < lpBig->data)
                {
                        lpSmall = lpSmall->pNext;
                }
                else
                {
                        LPLL lpNode = lpSmall->pNext;
                        lpSmall->pNext = lpBig;
                        
                        lpSmall = lpBig;
                        lpBig = lpNode;
                }
        }        

        return lpHead;
}

int main()
{
        int i = 0;
        LPLL pList1 = NULL;
        LPLL pList2 = NULL;
        LPLL pTail = NULL;

        for(i = 5 ; i <= 20 ; i ++)
        {
                if(pList1 == NULL)
                {
                        pList1 = AddNode(i * 2);
                        pTail = pList1;
                }
                else
                {
                        pTail->pNext = AddNode(i * 2);
                        pTail = pTail->pNext;
                }
        }

        for(i = 1 ; i <= 10 ; i ++)
        {
                if(pList2 == NULL)
                {
                        pList2 = AddNode(i * 3);
                        pTail = pList2;
                }
                else
                {
                        pTail->pNext = AddNode(i * 3);
                        pTail = pTail->pNext;
                }
        }
        
        DisplayList(pList1);
        DisplayList(pList2);

        pList1 = MergeList(pList1,pList2);

        DisplayList(pList1);
        DestoryList(pList1);
        
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

typedef struct tagLinkList
{
        int data;
        struct tagLinkList * pNext;
}LL,*LPLL;

LPLL AddNode(int data)
{
        LPLL lpNode = (LPLL)malloc(sizeof(LL));
        lpNode->data = data;
        lpNode->pNext = NULL;
        return lpNode;
}

void DestoryList(LPLL head)
{
        while(head != NULL)
        {
                LPLL pNode = head;
                head = head->pNext;
                free(pNode);
        }
}

void DisplayList(LPLL head)
{
        while(head != NULL)
        {
                printf("%d,",head->data);
                head = head->pNext;
        }

        printf("\n");
}

LPLL MergeList(LPLL l1,LPLL l2)
{
        if(l1 == NULL)
        {
                return l2;
        }
        
        if(l2 == NULL)
        {
                return l1;
        }
        
        LPLL lpHead = (l1->data < l2->data) ? l1 : l2;
        LPLL lpBig = (l1->data < l2->data) ? l2 : l1;
        
        LPLL lpSmall = lpHead;
        
        while(lpSmall != NULL)
        {
                if(lpSmall->pNext == NULL)
                {
                        lpSmall->pNext = lpBig;
                        break;
                }
                
                if(lpSmall->pNext->data < lpBig->data)
                {
                        lpSmall = lpSmall->pNext;
                }
                else
                {
                        LPLL lpNode = lpSmall->pNext;
                        lpSmall->pNext = lpBig;
                        
                        lpSmall = lpBig;
                        lpBig = lpNode;
                }
        }        

        return lpHead;
}

int main()
{
        int i = 0;
        LPLL pList1 = NULL;
        LPLL pList2 = NULL;
        LPLL pTail = NULL;

        for(i = 5 ; i <= 20 ; i ++)
        {
                if(pList1 == NULL)
                {
                        pList1 = AddNode(i * 2);
                        pTail = pList1;
                }
                else
                {
                        pTail->pNext = AddNode(i * 2);
                        pTail = pTail->pNext;
                }
        }

        for(i = 1 ; i <= 10 ; i ++)
        {
                if(pList2 == NULL)
                {
                        pList2 = AddNode(i * 3);
                        pTail = pList2;
                }
                else
                {
                        pTail->pNext = AddNode(i * 3);
                        pTail = pTail->pNext;
                }
        }
        
        DisplayList(pList1);
        DisplayList(pList2);

        pList1 = MergeList(pList1,pList2);

        DisplayList(pList1);
        DestoryList(pList1);
        
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-20 14:54:53 | 显示全部楼层
数据结构的相关作业,有没有简单点的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 22:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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