求助!链表输出后第一位错误
2个集合排序若用表La、Lb分别代表两个已存在的有序表,Lc为算法完成后产生新的有序表。可行的算法之一为:
从表La与Lb中各取一个元素进行比较,将小的元素插入到Lc中,并取小元素所在表的下一个元素继续与另一表的元素继续比较操作,直到一个表中元素取尽为止,再将另一表的余下元素直接挂入新表Lc的末尾。
//运行出来后面都对,就是第一位不知道怎么办。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 50
#define LEN sizeof(struct LNode)
//Status 为函数的类型,其值是函数结果状态代码,如OK等
typedef int Status;
// ElemType为数据元素类型,根据实际情况而定,这里假设为int
typedef int ElemType;
struct LNode /* 结点定义 */
{
ElemType data;
struct LNode *next;
};
typedef struct LNode *LinkList; /* 表的头指针类型 */
struct LNode *input();
int ListLength(LinkList L);
Status GetElem(LinkList L,int i,ElemType *e);//
Status ListEmpty(LinkList L);//
struct LNode *ListInsert(LinkList L,int n,ElemType e);
struct LNode *MergeList(LinkList La,LinkList Lb,LinkList Lc);
int main()
{
LinkList La=NULL,Lb=NULL;
LinkList p;
LinkList Lc=(struct LNode *)malloc(LEN);
Lc->next=NULL;
printf("请输入集合A(以0结尾):");
La = input();
printf("集合A的长度:%d\n",ListLength(La));
printf("请输入集合B(以0结尾):");
Lb = input();
printf("集合B的长度:%d\n",ListLength(Lb));
Lc=MergeList(La,Lb,Lc);
printf("\n最后的长度:%d\n",ListLength(Lc));
printf("结果为:");
while (Lc != NULL)
{
printf("%d ", Lc->data);
Lc = Lc->next;
}
return 0;
}
int ListLength(LinkList L)
{
int i=1;
LinkList p;
p=L->next;
while(p!=NULL)
{
p=p->next;
i++;
}
return i;
}
struct LNode *input()
{
struct LNode *head;
struct LNode *p1,*p2;
int i=0,j=0;
p1=p2=(struct LNode *)malloc(LEN);
scanf("%d",&p1->data);
head=NULL;
while(p1->data!=0)
{
i=i+1;
if(i==1)
{
head=p1;
}
else
{
p2->next=p1;
}
p2=p1;
p1=(struct LNode *)malloc(LEN);
scanf("%d",&p1->data);
}
p2->next=NULL;
return(head);
}
struct LNode *ListInsert(LinkList L,int n,ElemType e)
{
LinkList p1,p2,p;
p=(struct LNode *)malloc(sizeof(struct LNode));
p->data=e;
p1=L;
while(p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(p1->next==NULL)
{
p1->next=p;
p->next=NULL;
}
return L;
}
Status GetElem(LinkList L,int i,ElemType *e)
{ /* L为单链表的头指针。当第i个元素存在时,
其值赋给e并返回OK,否则返回ERROR */
int j=1; /* j为计数器 */
LinkList p=L; /* p指向第一个结点 */
while(p&&j<i) /* 顺指针向后查找, 直到p指向第i个元素
或p为空 */
{
p=p->next;
j++;
}
if(!p||j>i) /* 第i个元素不存在 */
return ERROR;
*e=p->data; /* 取第i个元素 */
return OK;
}
Status ListEmpty(LinkList L)
{ /* 初始条件:链式存储的表L已存在。*/
/*操作结果:若L为空表,则返回TRUE,否则返回FALSE */
if(L->next)
return FALSE;
else
return TRUE;
}
struct LNode *MergeList(LinkList La,LinkList Lb,LinkList Lc)
{ /* 已知表La和Lb中的数据元素按值非递减排列。 */
/* 归并La和Lb得到新的表Lc,Lc的数据元素也按值非递减排列 */
int i=1,j=1;
int k=0;
int La_len=ListLength(La);
int Lb_len=ListLength(Lb);
int ai,bj;
while(i<=La_len&&j<=Lb_len) /* 表La和表Lb均非空 */
{
GetElem(La,i,&ai);
GetElem(Lb,j,&bj);
if(ai<=bj)
{
ListInsert(Lc,++k,ai);
++i;
}
else
{
ListInsert(Lc,++k,bj);
++j;
}
}
while(i<=La_len) /* 表La非空且表Lb空 */
{
GetElem(La,i++,&ai);
ListInsert(Lc,++k,ai);
}
while(j<=Lb_len) /* 表Lb非空且表La空 */
{
GetElem(Lb,j++,&bj);
ListInsert(Lc,++k,bj);
}
return Lc;
}