行者的路 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条回答 默认 最新

  • 十八年后又是 2017-03-17 13:18
    关注

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

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

报告相同问题?

悬赏问题

  • ¥15 iscsi服务无法访问,如何解决?
  • ¥15 感应式传感器制作的感应式讯响器
  • ¥15 如何使用SC92F8003固件库解析私有协议数据?
  • ¥15 如何在音频中嵌入字符串(水印)信息进行传递
  • ¥30 plc怎么以设计说明书申请软著
  • ¥15 硬盘识别不了,需要初始化,可我的数据怎么办
  • ¥15 lvm2被mask了,怎么unmask都没用(标签-ubuntu|关键词-apt)
  • ¥15 交叉注意力机制的残差问题
  • ¥15 微信小程序:渲染收货地址时页面不显示
  • ¥20 win7 64位DirectShow提示初始化失败如何解决?