#include<stdio.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkedList;
LinkedList InitLinkedList(LinkedList L) //初始化单链表
{
L=(LinkedList)malloc(sizeof(LNode));
L->next=NULL;
return L;
}
LinkedList CreatLinkedList(LinkedList L) ///尾插法创建链表
{
LinkedList p,q;
int x;
q=L;
printf("请输入有序数(从小到大),以-999结束: ");
scanf("%d",&x);
while(x!=-999)
{
p=(LinkedList)malloc(sizeof(LNode));
p->data=x;
q->next=p;
q=p;
scanf("%d",&x);
}
q->next=NULL;
return L;
}
void TraverseLinkedList(LinkedList L) //输出链表
{
LinkedList p;
p=L->next;
if(p==NULL)
printf("链表为空! ");
else
{
printf("单链表中的元素为: ");
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
if(p!=NULL)
printf(",");
}
printf(" ");
}
}
LinkedList MergedLinkedList(LinkedList L,LinkedList L1,LinkedList L2) //合并链表
{
LinkedList p,p1,p2;
p=L;
p1=L1->next;
p2=L2->next;
while(p1&&p2)
{
if(p1->data<=p2->data)
{
p->next=p1;
p=p1;
p1=p1->next;
}
else
{
p->next=p2;
p=p2;
p2=p2->next;
}
}
while(p1)
{
p->next=p1;
p=p1;
p1=p1->next;
}
while(p2)
{
p->next=p2;
p=p2;
p2=p2->next;
}
p->next=NULL;
return L;
}
void MergedAndSaveToFile(LinkedList LL,LinkedList L1,LinkedList L2)
{
FILE *fp;
char filename[20];
LinkedList p;
printf(" 请输入保存的文件名(如:file.txt):");
scanf("%s",filename);
fp=fopen(filename,"w");
//LL=MergedLinkedList(LL,L1,L2);
p=LL->next;
while(p!=NULL)
{
fprintf(fp,"%d",p->data);
p=p->next;
if(p!=NULL)
fprintf(fp,",");
}
fclose(fp);
printf(" 已保存到文件%s中,该文件与程序源文件在同一目录下,请查看 ",filename);
}
int Switch1()
{
int m;
system("cls");
printf(" ********************************************************* ");
printf(" 请选择操作: ");
printf(" --------------------------------------------------------- ");
printf(" ------------- 1:创建两个已排序的链表 -------------- ");
printf(" ------------- 2:输出两个链表 -------------- ");
printf(" ------------- 3:按序合并两个链表并输出 -------------- ");
printf(" ------------- 4:合并链表保存到文件中 -------------- ");
printf(" ------------- 5:退出 -------------- ");
printf(" ********************************************************* ");
scanf("%d",&m);
while(m<1||m>5)
{
printf(" 不合法选择,请再次输入以选择:");
scanf("%d",&m);
}
return m;
}
int Switch2()
{
int i;
printf(" ************************************************ ");
printf(" 请选择操作: ");
printf(" ------------------------------------------------ ");
printf(" --------- 1:返回上一级 --------- ");
printf(" -------- 2:退出 --------- ");
printf(" ************************************************ ");
scanf("%d",&i);
while(i<1||i>2)
{
printf(" 不合法选择,请再次输入以选择:");
scanf("%d",&i);
}
return i;
}
void main()
{
LinkedList L1,L2,L3;//L3为合并后的链表
int quit=0;
int flag=0;
L1=InitLinkedList(&L1);//初始化单链表
L2=InitLinkedList(&L2);//初始化单链表
L3=InitLinkedList(&L3);//初始化单链表
while(quit==0)
{
switch(Switch1())
{
case 1:
printf("请创建第一个非降序链表: ");
L1=CreatLinkedList(&L1);
printf("请创建第二个非降序链表: ");
L2=CreatLinkedList(&L2);
flag=0;
break;
case 2:
printf(" 第一个");
TraverseLinkedList(L1);
printf(" 第二个");
TraverseLinkedList(L2);
switch(Switch2())
{
case 1:break;
case 2:quit=1;break;
}
break;
case 3:
L3=MergedLinkedList(&L3,L1,L2);
printf(" 合并后的");
TraverseLinkedList(L3);
switch(Switch2())
{
case 1:break;
case 2:quit=1;break;
}
flag=1;
break;
case 4:
if(flag==0)
printf(" 尚未合并链表,不能进行此操作! ");
else
MergedAndSaveToFile(&L3,L1,L2);
switch(Switch2())
{
case 1:break;
case 2:quit=1;break;
}
break;
case 5:
quit=1;break;
}
}
exit(0);
}