已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n。试写一算法将这两个链表连接在一起,假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算。
C code:
#include<stdio.h>
#include
<
stdlib.h
>
#define LIST_INIT_SIZE 10
#define LIST_INCREMENT 2
#define ERROR 0
#define OK 1
#define OVERFLOW -1
#define TRUE 1
typedef int Status;
struct LNode
{
int data;
LNode * next;
};
typedef LNode * LinkList;
void InitList(LinkList & L)
{
L = (LinkList)malloc( sizeof (LNode));
if ( ! L)
exit(OVERFLOW);
L -> next = NULL;
}
void CreateList(LinkList & L, int n)
{
int i;
LinkList p,q;
L = (LinkList)malloc( sizeof (LNode));
L -> next = NULL;
q = L;
printf( " Please input %d numbers:\n " ,n);
for (i = 1 ; i <= n; i ++ )
{
p = (LinkList)malloc( sizeof (LNode));
scanf( " %d " , & p -> data);
q -> next = p;
q = q -> next;
}
p -> next = NULL;
}
void PrintList(LinkList L)
{
LinkList p;
p = L -> next;
while (p)
{
printf( " %d " ,p -> data);
p = p -> next;
}
printf( " \n " );
}
LinkList connect(LinkList La,LinkList Lb)
{
LinkList Lc,p,q;
Lc = (LinkList)malloc( sizeof (LNode));
p = La -> next;
Lc -> next = p;
q = Lb -> next;
while (p -> next)
{
p = p -> next;
}
p -> next = q;
free(La);
free(Lb);
return Lc;
}
int main()
{
LinkList La,Lb,Lc;
CreateList(La, 8 );
CreateList(Lb, 4 );
printf( " LinkList La: " );
PrintList(La);
printf( " \n " );
printf( " LinkList Lb: " );
PrintList(Lb);
printf( " \n " );
Lc = connect(La,Lb);
printf( " LinkList Lc: " );
PrintList(Lc);
return 0 ;
}
#define LIST_INIT_SIZE 10
#define LIST_INCREMENT 2
#define ERROR 0
#define OK 1
#define OVERFLOW -1
#define TRUE 1
typedef int Status;
struct LNode
{
int data;
LNode * next;
};
typedef LNode * LinkList;
void InitList(LinkList & L)
{
L = (LinkList)malloc( sizeof (LNode));
if ( ! L)
exit(OVERFLOW);
L -> next = NULL;
}
void CreateList(LinkList & L, int n)
{
int i;
LinkList p,q;
L = (LinkList)malloc( sizeof (LNode));
L -> next = NULL;
q = L;
printf( " Please input %d numbers:\n " ,n);
for (i = 1 ; i <= n; i ++ )
{
p = (LinkList)malloc( sizeof (LNode));
scanf( " %d " , & p -> data);
q -> next = p;
q = q -> next;
}
p -> next = NULL;
}
void PrintList(LinkList L)
{
LinkList p;
p = L -> next;
while (p)
{
printf( " %d " ,p -> data);
p = p -> next;
}
printf( " \n " );
}
LinkList connect(LinkList La,LinkList Lb)
{
LinkList Lc,p,q;
Lc = (LinkList)malloc( sizeof (LNode));
p = La -> next;
Lc -> next = p;
q = Lb -> next;
while (p -> next)
{
p = p -> next;
}
p -> next = q;
free(La);
free(Lb);
return Lc;
}
int main()
{
LinkList La,Lb,Lc;
CreateList(La, 8 );
CreateList(Lb, 4 );
printf( " LinkList La: " );
PrintList(La);
printf( " \n " );
printf( " LinkList Lb: " );
PrintList(Lb);
printf( " \n " );
Lc = connect(La,Lb);
printf( " LinkList Lc: " );
PrintList(Lc);
return 0 ;
}