用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;
daihao=i;
}
}
l[daihao]=l[daihao]->next;
s=(lnode*)malloc(sizeof(lnode));
s->data=temp;
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;
return 0;
}
下面是主函数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAXSIZE 10000
typedef struct lnode
{
int data;
struct lnode *next;
}lnode,*linklist;
void main()
{
linklist creat_linklist()
void paixu_linklist(linklist L)
void put_out(linklist L)
linklist merge_linklist(linklist l[],int k)
srand(time(NULL));
puts("请输入链表个数");
int i;
scanf("%d",&i);
linklist l[MAXSIZE];
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);
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;
}
}