一直以来不会链表的排序,我之前把排序想的太过复杂,只想着移动链表,但是东林学长启发我,只需要交换数据域就可以排序链表让我恍然大悟!(感谢我们的东林学长)于是很快的写了一个链表合并和排序。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct link{
int date;
struct link *next;
}link;
int main()
{
int i,j;
int t;
int date;
link *p,*q,*k,*head1=NULL,*head2=NULL;//两个头指针
int m,n;
printf("请输入第一个链表长度:");
scanf("%d",&n);
printf("请输入数据:");
for(i=1;i<=n;i++)
{
p=(link*)malloc(sizeof(link));
p->next=NULL;
scanf("%d",&p->date);
if(head1==NULL)
head1=p;
else
q->next=p;
q=p;
}
k=head1;
printf("请输入第二个链表长度;");
scanf("%d",&m);
printf("请输入数据:");
for(i=1;i<=m;i++)
{
p=(link*)malloc(sizeof(link));
scanf("%d",&p->date);
p->next=NULL;
if(head2==NULL)
head2=p;
else
q->next=p;
q=p;
}
q->next=head1;//连接两个链表
putchar('\n');
//排序
p=head2;
for(i=1;i<=m+n;i++)
{
p=head2;//每次开始从头开始
for(j=1;j<=m+n-i+1&&p->next!=NULL&&p!=NULL;j++)//判断这里多了判断当前节点和下一个节点是否为空
{
if((p->date)>(p->next->date))//从小到大
{
t=p->date;//利用冒泡的思想
p->date=p->next->date;
p->next->date=t;
}
p=p->next;//记得继续往下走节点
}
}
p=head2;
while(p!=NULL)
{
printf("%d ",p->date);
p=p->next;
}
p=head2;
while(p!=NULL)//释放链表
{
q=p->next;
free(p);
p=q;
}
return 0;
}