合并 k 个排序链表,返回合并后的排序链表

用C语言实现合并K个由大到小的排列的链表

思路:首先创建k个链表,并对其进行排序。然后用merge_linklist函数合并链表。

合并思路:扫描每个链表(如果链表已空,则跳过)找到所有链表当前节点值中的最小值,存放在temp中,并将此链表移动到下一个节点。然后将temp中的值存放到新链表当前节点中,新链表移动到下一个节点。直到将所有链表扫描完毕。

在这里插入图片描述

linklist merge_linklist(linklist l[],int k)
{
 linklist L=NULL;
 lnode *s,*r=NULL;
 int i=0;
 int temp=100;
 int daihao;
 while(panduan_linklist(l,k)==1)//用来判断是否所有的链表已空
 {
  for(i=0;i<=k;i++)//扫描每个链表
  {
   if(l[i]==NULL)//如果有链表为空,则跳过
    continue;
   if(temp>l[i]->data)
   {
    temp=l[i]->data;//将最小值赋给temp
    daihao=i;//用来存放最小值所在链表的代号
   }
  } 
  l[daihao]=l[daihao]->next;
  s=(lnode*)malloc(sizeof(lnode));//为新节点开辟一个空间
  s->data=temp;//将最小值赋给data
  if(L==NULL)
   L=s;
  else r->next=s;
  r=s;
  temp=100; 
 } 
 if(r)
  r->next=NULL;
 return L;
}
int panduan_linklist(linklist l[],int k)//用来判断是否所有的链表已空
{
 for(int i=0;i<=k;i++)
  if(l[i]!=NULL) 
  return 1;//如果有链表非空,返回1
  
 return 0;//如果所有的链表都空,返回0
}

下面是主函数

#include<stdio.h>
#include<stdlib.h>//后面用到了malloc函数与rand函数
#include<time.h>//用到time函数来获取种子
#define MAXSIZE 10000//定义链表个数最多为10000,也即k最大为10000
typedef struct lnode//定义一个节点类型的结构体
{
 int data;//用于存放节点的数据
 struct lnode *next;//存放下一个节点的地址
}lnode,*linklist;//给结构体起个别名,其中linklist为头结点类型

void main()
{
 linklist creat_linklist()//创建链表函数
 void paixu_linklist(linklist L)//定义排序函数,对链表进行排序
 void put_out(linklist L)//输出函数 
 linklist merge_linklist(linklist l[],int k)//定义合并k个链表的函数 
 srand(time(NULL));//取时间为种子
 puts("请输入链表个数");
 int i;
 scanf("%d",&i);
 linklist l[MAXSIZE];//用数组存放k个链表
 linklist L;//定义合并后的链表
 for(int j=0;j<=i-1;j++)
 {
  l[j]=creat_linklist();
  paixu_linklist(l[j]);//对链表进行排序
  printf("第%d个链表为\n",j+1);//输出链表
  put_out(l[j]);
  puts("");
 }
 puts("合并后的来链表为");
 L=merge_linklist(l,i-1);//对k个链表进行合并
 put_out(L);//输出链表
}
void put_out(linklist l)
{
 linklist L=l;int i=1;
 while(L!=NULL)
 {
  printf("%3d",L->data);
  if(i%21==0)
   puts("");
  L=L->next;
  i++;
 }
}

linklist creat_linklist()//创建链表
{
 
 linklist l=NULL;
 lnode *s,*r=NULL;
 int x;
 int i=rand()%5+15;
 x=rand()%101;
 for(int j=0;j<=i;j++)
 {
  s=(lnode*)malloc(sizeof(lnode));
  s->data=x;
  if(l==NULL)
   l=s;
  else r->next=s;
  r=s;
  x=rand()%101;
 }
 if(r)
  r->next=NULL;
 return l;
}

void paixu_linklist(linklist l)//对链表进行排序
{
 linklist L=l;
 int temp;
 int i=0;
 
 while(L!=NULL)
 {
  l=L;l=l->next;
  while(l!=NULL)
  {
   if(L->data>l->data)
   {
    temp=L->data;
    L->data=l->data;
    l->data=temp;
   }
   l=l->next;
  }
  L=L->next;
 }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值