#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef struct node
{ //单链表的结构定义
int data;
struct node *next;
}node,*LinkList;
node *StartList(node *L){ //初始化单链表 并设置为空表
L=(node*)malloc(sizeof(node));
L->next=NULL;
return L;
}
void PrintList(node *L){//打印单链表的函数
printf("整个单链表的元素为:");
while(L->next!=NULL)
{//遍历
printf("%d ",L->next->data);
L=L->next;
}
printf("\n");
}
LinkList MergeLinkList(LinkList La,LinkList Lb){//融合两个单链表
LinkList pa,pb;
pa=La->next;
pb=Lb->next;
LinkList pc=La;//以La进行链的连接操作
while(pa&&pb){
if(pa->data<=pb->data)//pa里数据比pb小,就连接pa指向的结点,pa指向La的后一个
{
LinkList p=pa->next;
pa->next=NULL;
pc->next=pa;
pc=pc->next;
pa=p;
}
else
{//pb里数据较小,就连接pb指向的结点,pb指向Lb的后一个
LinkList p=pb->next;
pb->next=NULL;
pc->next=pb;
pc=pc->next;
pb=p;
}
}
pc->next=pa?pa:pb;//合并剩下的没遍历完的部分
return La;
}
void CreateList(node *a,int n);
int main()
{//主函数写调用函数
node *L1,*L2;//L1,L2分别为两个插入的单链表
int n,m;//输入链表的长度
printf("输入第一个链表长度:");
scanf("%d",&n);
printf("\n");
L1=StartList(L1);
L2=StartList(L2);//分别初始化
//构建第一个单链表
printf("下面构建第一个单链表\n");
CreateList(L1,n);
PrintList(L1);
printf("\n"); //构建第二个单链表
printf("下面构建第二个单链表\n");
printf("输入第一个链表长度:");
scanf("%d",&m);
printf("\n");
CreateList(L2,m);
PrintList(L2);
printf("\n"); //合成两个链表,使其有序
printf("合并两个单链表,");
MergeLinkList(L1,L2);
PrintList(L1);
return 0;
}
void CreateList(node *a,int n){
node *p,*pnew;
int i;
p = a;
printf("请输入元素,用空格分隔:");
for(i = 0;i < n;i++)
{
pnew = (node*)malloc(sizeof(node));
scanf("%d",&pnew->data);
pnew->next = NULL;
p->next = pnew;
p = p->next;
}
}