您的位置:首页 > 其它

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

2015-05-10 10:48 323 查看
链表冒泡排序,可以通过修改节点值和交换节点两种方法,下面给出交换节点的方法。

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