//有两个 有序表 LA和 LB,将它们合并成一个有序表 LC,要求 LC 也是有序
//链表
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node
{
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
List Create(int a[],int n)
{
List L,p;
L=(List)malloc(sizeof(List)); //链表这里是List
L->Next = NULL; //带有头结点便于操作
p=L;
for(int i=0;i<n;i++)
{
List t;
t=(List)malloc(sizeof(List)); //不断地开空间放数据
t->Data =a[i];
t->Next = p->Next ;
p->Next = t;
p = t;
}
return L;
}
void Print( List L )
{
List p=L->Next ;
while(p)
{
printf("%d ",p->Data );
p=p->Next ;
}
}
List Union( List LA, List LB )
{
List LC,h,p,q;
LC=(List)malloc(sizeof(List)); //给 LC分配空间
h=LC; //头指针
p=LA->Next ; q=LB->Next ; //从头开始扫描
while( p&&q ) //不断地改变指针指向来创建LC
{
if(p->Data <= q->Data ) //LA的值比较小
{
LC->Next = p ;
LC=p;
p=p->Next ;
}
else
{
LC->Next =q;
LC=q;
q=q->Next ;
}
}
if(p)
{
LC->Next = p;
}
else
{
LC->Next = q;
}
return h;
}
int Length(List L)
{
List p;
int cnt=0;
p = L->Next ;
while(p)
{
p = p->Next ;
cnt++;
}
return cnt;
}
int main()
{
int a[5]={1,23,45,67,98};
int b[4]={2,12,56,89};
List LA, LB, LC;
LA = Create(a,5);
LB = Create(b,4);
LC = Union(LA, LB);
//printf("%d %d %d\n",Length(LA),Length(LB),Length(LC));
Print(LC);
return 0;
}
//有两个 有序表 LA和 LB,将它们合并成一个有序表 LC,要求 LC 也是有序
//顺序表
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int Position;
typedef int ElementType;
typedef struct LNode *PtrToNode;
struct LNode
{
ElementType Data[MAXSIZE];
Position Last;
};
typedef PtrToNode List;
List Create(int a[],int n)
{
List L;
L=(List)malloc(sizeof(struct LNode));//顺序表后面sizeof(struct LNode)
for(int i=0;i<n;i++)
{
L->Data [i] = a[i];
}
L->Last = n;
return L;
}
void Print( List L )
{
for(int i=0;i<L->Last ;i++)
printf("%d ",L->Data [i]);
printf("\n");
}
List Union( List LA, List LB )
{
List LC;
LC=(List)malloc(sizeof(struct LNode));
int i=0,j=0,k=0;
while(i<LA->Last && j<LB->Last )//两个都没结束 用的是小于Last
{
if(LA->Data [i] <= LB->Data [j])//LA的数比较小
{
LC->Data [k] = LA->Data [i];
i++;k++;
}
else
{
LC->Data [k] = LB->Data [j];
j++;k++;
}
}
while(i<LA->Last )
//如果LB扫描完了 但LA还没扫描完那就是i<LA->Last
{
LC->Data [k] = LA->Data [i]; //把LA剩下的部分接上去
i++;k++;
}
while(j<=LB->Last )
{
LC->Data [k] = LB->Data [j];
j++;k++;
}
LC->Last = LA->Last + LB->Last ;
//LC的收尾,之前我没写,然后调用打印函数的时候出错,所以最后什么也没显示
return LC;
}
int main()
{
int a[5]={1,23,45,67,98};
int b[4]={2,12,56,89};
List LA, LB, LC;
//LC = (List)malloc(sizeof(struct LNode));
LA = Create(a,5);
LB = Create(b,4);
LC = Union(LA, LB);
//Print(LA); Print(LB);
Print(LC);
return 0;
}