链表的冒泡排序(节点交换法)

链表冒泡排序,可以通过修改节点值和交换节点两种方法,下面给出交换节点的方法。

#include<stdio.h>
#include<malloc.h>
struct Node{
	int data;
	Node *next;
};
int createlist(Node **p,int i);
int pop_sort(Node *p);
int main()
{
	int i=0;
	Node *p,*head,*ph;
//	head = (Node*)malloc(sizeof(Node)); //如果传入指针需要先在此分配空间 
	createlist(&head,5); 
	ph=head;
	pop_sort(head);
	while(head->next)
	{
	//	printf("... ");
		printf("%d ",head->next->data);
		head=head->next;
	}
	
	free(ph);
	ph=NULL;
	return 0;
}
int createlist(Node **p,int i)    //此处头指针还没分配空间,需要传入指针地址;如果已分配空间,可以传入 
{
	Node *pp,*temp;
	int j;
	int k;
	*p=(Node*)malloc(sizeof(Node));
	temp=*p;       //此处需要临时变量,防止传入指针值被修改 
	for(j=0;j<i;j++)    //也可采用递归,递归调用 createlist(p->next,i) 来创建链表 
	{
		pp = (Node*)malloc(sizeof(Node));
		scanf("%d",&k);
		pp->data=(k);
		
		temp->next=pp;
		temp=pp;
	}
 	temp->next= NULL;
	return 0;
}
int pop_sort(Node *head)   //链表冒泡排序,节点交换法(还有换值法);传入头节点指针 
{							//排序中没有修改头节点指针值,只是修改指针内容head->next的值 
	Node *pre,*p,*tail,*temp;
	tail=NULL;
	pre=head;
	
	while((head->next->next)!=tail)//(head->next)!=tail同样适用 ,多执行最后一个步比较 
	{
		p=head->next;
		pre=head;
		while(p->next!=tail)
		{
			if((p->data)>(p->next->data))
			{
			/*	pre->next=p->next; //交换节点方法一
				p->next = p->next->next;
                pre->next->next = p;
                p = pre->next; */
                
                pre->next=p->next; //交换节点方法二 
                temp=p->next->next;
                p->next->next=p;
                p->next=temp;
                p=pre->next;  //p回退一个节点 
                
			}
			p=p->next;  //p再前进一个节点 
			pre=pre->next;	
		}
		tail=p;
	}
	return 0 ;
}


评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值