实现双链表的排序

实现双链表的排序:

方法一:

就是不变动节点,只把节点中数据进行交换。

采用选择排序法:

 

#include <iostream>
using namespace std;

typedef struct DouLinkNode
{
    int data ;
    struct DouLinkNode *pre ,*next;
}node;

node *create(int n)
{   
    int x;
    node *head = new node();
    node *p,*s;
    p = head;
    p->pre = NULL;
    while(n)
    {
        s = new node();
        printf("input x:");
        scanf("%d",&x);
        s->data = x;
        p->next = s;
        s->pre = p;
        p = s;
        n--;
    }
    s->next = NULL;
    return head;
}

void display(node *head)
{
    node *p = head->next;
    while(p)
    {
        cout<<p->data;
        p = p->next;
    }
    cout<<endl;
}

node  *paixu(node *head)
{
	node *p,*s,*min;
    int tmp;
	
	for(p = head->next ;p->next!=NULL ;p=p->next)
	{
		min = p ;
		for(s= p->next ; s!=NULL ;s=s->next)
		{
			if(s->data <min->data)
			{
				min = s;//找到每次排序中最小的节点,然后记住这个节点
			}
		}
		if(min != p)//把这个节点与前面的节点的数据进行交换,把最小的数据放在前面的节点内。
		{
			tmp = min->data;
			min->data = p->data;
			p->data = tmp;
		}
	}
	return head;

}
void main()
{
    node *head,*head1;
    int n;
    printf("input n:");
    scanf("%d",&n);
    head = create(n);
    display(head);
    head1 = paixu(head);
    display(head1);
}


方法二 采用选择排序,但交换的是节点

 

#include <iostream>
using namespace std;

typedef struct DouLinkNode
{
    int data ;
    struct DouLinkNode *pre ,*next;
}node;

node *create(int n)
{   
    int x;
    node *head = new node();
    node *p,*s;
    p = head;
    p->pre = NULL;
    while(n)
    {
        s = new node();
        printf("input x:");
        scanf("%d",&x);
        s->data = x;
        p->next = s;
        s->pre = p;
        p = s;
        n--;
    }
    s->next = NULL;
    return head;
}

void exchange( node * p, node * min )
{
    if(p==min)
        return;
    //p和min相邻要改6个指针,不相邻该8个指针
    if( min != p->next )
    {
        p->next->pre = min;
        min->pre->next = p;
    }

    p->pre->next = min;
    if( min->next != NULL)
        min->next->pre = p;

    node *min_pre = min->pre;
    node *p_next = p->next;
    min->pre = p->pre;
    p->next = min->next;

    if( min == p_next ) //p和min相邻
    {
        min->next = p;
        p->pre = min;
    }
    else
    {
        min->next = p_next;
        p->pre = min_pre;
    }

}

node* paixu(node *head)
{

    //选择排序,每一轮选择最小元素节点的和p节点交换
    for(node *p=head->next; p->next!=NULL; p=p->next)
    {
        node *min = p; //初始化最小节点
        for(node *s=p->next; s!=NULL; s=s->next)
        {
            //找最小元素的节点
            if( s->data < min->data )
                min = s;
        }
        exchange( p, min ); //交换两个节点
        p=min;//交换两个节点后,p变到了min的位置,为了遍历,把节点p重新在移动到上次节点处,即p = min;
    }

    

    return head;
}

void display(node *head)
{
    node *p = head->next;
    while(p)
    {
        cout<<p->data;
        p = p->next;
    }
    cout<<endl;
}


void main()
{
    node *head,*head1;
    int n;
    printf("input n:");
    scanf("%d",&n);
    head = create(n);
    display(head);
    head1 = paixu(head);
    display(head1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值