您的位置:首页 > 理论基础 > 数据结构算法

单向链表节点的移动(排序)

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息