C语言链表

#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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值