行者的路 2017-03-17 12:40 采纳率: 100%
浏览 1984
已采纳

数据结构关于合并链表的算法:合并两个链表,但最终输出结果始终是第二个链表的值

题目

合并单链表 LA = (2,2,3),LB = (1,3,3,4)为 LC = (1,2,2,3,3,3,4)。要求是LC利用LA和LB元素的结点空间建表,不能额外申请结点空间。

问题

程序没有语法错误,修改许多次,但输出结果总是链表LB的值。望有人能帮助分析一下输出结果错误的原因。感激不尽。

代码如下

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

typedef struct Node
{
    char data;
    struct Node * next;
}Node, * LinkList;

void InitList(LinkList * L);
void CreateFromTail(LinkList L);
LinkList MergeLinkList(LinkList LA, LinkList LB);
void output(LinkList L);

int main()
{
    LinkList LA, LB, LC;

    InitList(&LA); //初始化单链表LA
    printf("输入链表LA的值: ");
    CreateFromTail(LA); 

    InitList(&LB); //初始化单链表LB
    printf("输入链表LB的值: ");
    CreateFromTail(LB);

    LC= MergeLinkList(LA, LB); //合并单链表
    printf("合并后链表LC的值为: ");
    output(LC);

    return 0;
}
void InitList(LinkList * L) //初始化单链表
{
    (* L) = (LinkList)malloc(sizeof(Node));
    (* L)->next = NULL;
}
void CreateFromTail(LinkList L) //尾插法建表
{
    Node * r, * s;
    r = L;
    int flag = 1;
    char c;
    while(flag)
    {
        c = getchar();
        if(c != '$')
        {
            s = (Node *)malloc(sizeof(Node));
            s->data = c;
            r->next = s;
            r = s;
        }
        else
        {
            flag = 0;
            r->next = NULL;
        }
    }
}
LinkList MergeLinkList(LinkList LA, LinkList LB) //合并链表LA和LB
{
    Node * pa, * pb, * r;
    LinkList LC;
    LC = LA; //将LC置为空表,且不额外分配结点空间
    LC->next = NULL;
    pa = LA->next; //让pa指向链表LA的第一个元素
    pb = LB->next; //让pb指向链表LB的第一个元素
    r = LC;

    while(pa != NULL && pb != NULL)
    {
        if(pa->data <= pb->data)
        {
            r->next = pa;
            r = pa;
            pa = pa->next;
        }
        else
        {
            r->next = pb;
            r = pb;
            pb = pb->next;
        }
    }
    if(pa)
        r->next = pa;
    else
        r->next = pb;

    free(LB);
    return(LC);
}
void output(LinkList L) //输出链表
{
    LinkList p = L->next;
    while(p != NULL)
    {
        printf("%c ", p->data);
        p = p->next;
    }
    printf("\n");
}

运行结果

图片说明

  • 写回答

2条回答

  • 关注

    LC和LA都是指针,赋值之后,清空LC就等于清空LA了

         LinkList LC;
        LC = LA; //将LC置为空表,且不额外分配结点空间
        LC->next = NULL;
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配