概述
一、排序
这里只介绍冒泡排序
①冒泡排序:
排序前:5 4 3 2 1
排序后:1 2 3 4 5
我们先定住a在5处,b在a的后面。之后4与5比较,若4小于5则把节点数据交换,之后b挪动到3处。
3与4比较,节点数据交换,b继续往后挪动一个节点。
2与3比较,节点数据交换,b继续往后挪动一个节点。
1与2比较,节点数据交换,b继续往后挪动一个节点,b等于NULL。
此时最小的数据已经挪动到了最前面,该处应该循环结束。开始下一轮新的循环,把后面4个数的最小值2放在1后面。
此时我们将a往后挪动一个节点,b在a的后面。
接下来的思路和上面一样,定住a,移动b。
②代码实现:
//sort函数如下:
void sort(Node*head)
{
int t;
Node*a;
Node*b;
for(a=head->next;a!=NULL;a=a->next)
{
for(b=a->next,t=0;b!=NULL;b=b->next)
{
if(a->data>b->data)
{
t = a->data;
a->data = b->data;
b->data = t;
}
}
}
}
输出结果:
二、有序合并
①什么是有序合并?
合并就是将两个链表组装成一个链表,并且新链表节点数据按升序或降序的方式排列。
link_one:5 2 1
link_two:1 3 1 4
link_new:1 1 1 2 3 4 5
②思路及代码实现
head1 : 1 2 5
head2 : 3 4 6 7
合并后的head3 : 1 2 3 4 5 6 7
这里我们假设已创建的两个链表是升序链表,并且将这两个链表合并为新的升序链表。我们的思路是将两个链表里的节点串起来。
新建一个头指针head3,比较head1、head2里面节点数据大小,1<3那么把1放在head3后面,再比较2<3把2放在1后面,5>3把3放在2后面,4<5把4放在3后面,6>5将5放在4后面。之后head1遍历完了,那么将剩下的4 6 7直接接在5后面。
合并后:
del是删除该映射
//combine函数如下
Node*combine(Node*head1,Node*head2)
{
Node*head3=(Node*)malloc(sizeof(Node));
Node*p1=head1->next;
Node*p2=head2->next;
Node*p3=head3;
while(p1!=NULL&&p2!=NULL)
{
if(p1->data>=p2->data)
{
p3->next=p2; //尾插法
p3=p2;
p2=p2->next;
}
else
{
p3->next=p1; //尾插法
p3=p1;
p1=p1->next;
}
}
if(p1!=NULL)
{
p3->next=p1;
}
if(p2!=NULL)
{
p3->next=p2;
}
return head3;
}
输出结果:
注:这里应用了尾插法,如果使用头插那么输出的结果则是逆序的。
最后
以上就是大气高山为你收集整理的单链表的排序、有序合并一、排序二、有序合并的全部内容,希望文章能够帮你解决单链表的排序、有序合并一、排序二、有序合并所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复