单向链表节点的移动(排序)
2018-02-23 09:45
295 查看
单向链表的创建在这里不在赘述,详细请看另一篇文章《单向链表的创建》。在本篇文章中,主要通过举例的方式来帮大家理解单向链表节点的移动。
本篇文章中创建节点用如下表示
typdef struct node{
int date;//定义数据域
struct node * next;//定义指针域
} ElemSN; 例一:设head指向一个非空单项链表,设数据域值不重复,且都为正整数,将所有奇数节点放在偶数节点之前(不允许创建新节点)
方法一:拆成两根链表再合并ElemSN * PreLink(ElemSN *head)
{
ElemSN *h1,*p,*q,*pk;
h1=NULL;
p=head;
while(p){
if(!p->data%2){
pk=p;
if(head==p)
head=head->next;
else
q->next=p->next
pk->next=h1;
h1=pk;
}
else{
q=p;
p=p->next;
}
}
for(p=head;p->next;p=p->next;)
p->next=h1;
return head;
} 方法二:ElemSN *PreLink(ElemSN *head)
{
ElemSN *h1,*p,*q;
h1=q=head;
p=q->next;
while(p){
if(p->data%2){
q->next=p->next;
p->next=h1;
h1=p
p=q->next;
}
else{
q=p;
p=q->next;
}
}
return h1;
}例二:设head1和head2是两个非空单向链表的头指针,数据域值重复且升序排序,将head1和head2合成一个升序链表ElemSN *ComLink(ElemSN *head1,ElemSN *head2)
{
ElemSN *head,*t,*p;
head=NULL;
while(head1&&head2){
if(head1->data<head2->data){
p=head1;
head1=head1->next;
}
else{
p=head2;
head2=head2->next;
}
if(!head)
head=t=p;
else{
t->next=p;
t=t->next;
}
t->next=NUll;
}
if(head1)
t->next=head1;
else
t->next=head2;
return head;
}例三:选择排序法,将一个非空单向链表升序排列ElemSN *SelectSort(ElemSN *head)
{
ElemSN *p,*q,*t,*pm,*qm,*h1;
h1=NULL;
while(head){
for(pm=q=head,p=head->next;p;q=p,p=p->next;)//遍历链表寻找最大值的节点
if(p->data>pm->data){
pm=p;
qm=q;
}
if(pm!=head)//如果最大值节点不是头节点,则从链表中移出该节点
qm->next=pm->next;
else//如果最大值节点是头节点,头指针后移,溢出该节点
head=head->next;
pm->next=h1;//头插法生成升序链表
h1=pm;
}
return h1;
}
本篇文章中创建节点用如下表示
typdef struct node{
int date;//定义数据域
struct node * next;//定义指针域
} ElemSN; 例一:设head指向一个非空单项链表,设数据域值不重复,且都为正整数,将所有奇数节点放在偶数节点之前(不允许创建新节点)
方法一:拆成两根链表再合并ElemSN * PreLink(ElemSN *head)
{
ElemSN *h1,*p,*q,*pk;
h1=NULL;
p=head;
while(p){
if(!p->data%2){
pk=p;
if(head==p)
head=head->next;
else
q->next=p->next
pk->next=h1;
h1=pk;
}
else{
q=p;
p=p->next;
}
}
for(p=head;p->next;p=p->next;)
p->next=h1;
return head;
} 方法二:ElemSN *PreLink(ElemSN *head)
{
ElemSN *h1,*p,*q;
h1=q=head;
p=q->next;
while(p){
if(p->data%2){
q->next=p->next;
p->next=h1;
h1=p
p=q->next;
}
else{
q=p;
p=q->next;
}
}
return h1;
}例二:设head1和head2是两个非空单向链表的头指针,数据域值重复且升序排序,将head1和head2合成一个升序链表ElemSN *ComLink(ElemSN *head1,ElemSN *head2)
{
ElemSN *head,*t,*p;
head=NULL;
while(head1&&head2){
if(head1->data<head2->data){
p=head1;
head1=head1->next;
}
else{
p=head2;
head2=head2->next;
}
if(!head)
head=t=p;
else{
t->next=p;
t=t->next;
}
t->next=NUll;
}
if(head1)
t->next=head1;
else
t->next=head2;
return head;
}例三:选择排序法,将一个非空单向链表升序排列ElemSN *SelectSort(ElemSN *head)
{
ElemSN *p,*q,*t,*pm,*qm,*h1;
h1=NULL;
while(head){
for(pm=q=head,p=head->next;p;q=p,p=p->next;)//遍历链表寻找最大值的节点
if(p->data>pm->data){
pm=p;
qm=q;
}
if(pm!=head)//如果最大值节点不是头节点,则从链表中移出该节点
qm->next=pm->next;
else//如果最大值节点是头节点,头指针后移,溢出该节点
head=head->next;
pm->next=h1;//头插法生成升序链表
h1=pm;
}
return h1;
}
相关文章推荐
- 对一个存储学生信息的单向链表,按照学号升序对链表进行排序,每个节点包含了一个学生ID
- 单向链表--初始化、添加删除节点、排序链表
- 利用二级指针删除单向链表节点
- 华为oj中级 从单向链表删除指定节点
- 输出单向链表倒数第k个节点,倒数第0个指向尾节点.
- 单链表中的选择排序(有头节点)
- 删除单向链表的指定节点
- 单向链表:在插入值的同时要进行排序
- 单向链表的排序
- 单向链表排序——冒泡排序(C语言版)
- 数据结构——求单向链表的倒数第K个节点
- 将链表中的节点顺序倒排序
- 单向链表小练习--》创建链表头,添加删除链表节点,释放链表内存,选择插入数据
- 笔试算法题(27):判断单向链表是否有环并找出环入口节点 & 判断两棵二元树是否相等
- /单向链表操作/ 节点对换 C++版
- 单向链表排序:快速排序和归并排序
- 华为oj输出单向链表倒数第k个节点
- 一次遍历单向链表找到中间节点
- 多级菜单 多级树形结构 多级树排序 多级树节点移动
- [算法练习]找到单向链表的中间节点