题目
合并单链表 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");
}