算法思路
单链表实现选择排序的方法有很多种,我的方法是将一个链表分为三部分:
第一部分 + p1 + 第二部分+ p2 + 第三部分
第一部分的链表存的是P1之前的所有结点,第二部分的链表存的是p1-p2之间所有的结点,第三部分的链表存的是p2后面的所有结点,然后每次for循环时分8种情况(每个部分存在与否)对三个链表和p1 p2进行组合,最后即可对链表进行选择排序。
代码实现
#include<stdio.h>
#include<stdlib.h>
typedef struct stu_node{
int data;
struct stu_node *next;
}node;
int main(void){
node *head,*p,*tail;
int data;
head=tail=NULL;
printf("请输入数据:\n");
scanf("%d",&data);
while(data!=0){
p=(node*)malloc(sizeof(node));
p->data=data;
p->next=NULL;
if(head==NULL)
head=p;
else
tail->next=p;
tail=p;
//printf("请输入下一个数据:\n");
scanf("%d",&data);
}
printf("原始顺序:");
node *p1,*p2,*temp,*p3,*p0=NULL;
for(p1=head;p1!=NULL;p1=p1->next)
printf("%d ",p1->data);
printf("\n");
printf("开始排序:\n");
for(p1=head;p1->next!=NULL;p1=p1->next){
for(p2=p1->next;p2!=NULL;p2=p2->next){
if(p1->data>p2->data){
node *head1,*head2,*head3,*tail1,*tail2,*tail3,*p5,*p6,*p7;
head1=tail1=head2=tail2=head3=tail3=NULL;
if(head!=p1){//提取p1之前的所有结点
node *p51=head;
while(p51!=p1){
p5=(node*)malloc(sizeof(node));
p5->data=p51->data;
p5->next=p51->next;
if(head1==NULL)
head1=p5;
else
tail1->next=p5;
tail1=p5;
p51=p51->next;
}
tail1->next=NULL;
}
if(p1->next!=p2){//提取p1-p2之间的所有结点
node *p61=p1->next;
while(p61!=p2){
p6=(node*)malloc(sizeof(node));
p6->data=p61->data;
p6->next=p61->next;
if(head2==NULL)
head2=p6;
else
tail2->next=p6;
tail2=p6;
p61=p61->next;
}
tail2->next=NULL;
}
if(p2->next!=NULL){//提取p2后面的所有结点
node *p71=p2->next;
while(p71!=NULL){
p7=(node*)malloc(sizeof(node));
p7->data=p71->data;
p7->next=p71->next;
if(head3==NULL)
head3=p7;
else
tail3->next=p7;
tail3=p7;
p71=p71->next;
}
tail3->next=NULL;
}
//p1,p2交换位置
temp=p1;
p1=p2;
p2=temp;
//对8种情况分别进行讨论
if(head1&&head2&&head3){
head=head1;
tail1->next=p1;
p1->next=head2;
tail2->next=p2;
p2->next=head3;
}
else if(head1==NULL&&head2&&head3){
head=p1;
p1->next=head2;
tail2->next=p2;
p2->next=head3;
}
else if(head1==NULL&&head2==NULL&&head3){
head=p1;
p1->next=p2;
p2->next=head3;
}
else if(head1&&head2&&head3==NULL){
head=head1;
tail1->next=p1;
p1->next=head2;
tail2->next=p2;
p2->next=NULL;
}
else if(head1&&head2==NULL&&head3){
head=head1;
tail1->next=p1;
p1->next=p2;
p2->next=head3;
}
else if(head1&&head2==NULL&&head3==NULL){
head=head1;
tail1->next=p1;
p1->next=p2;
p2->next=NULL;
}
else if(head1==NULL&&head2&&head3==NULL){
head=p1;
p1->next=head2;
tail2->next=p2;
p2->next=NULL;
}
else{
head=p1;
p1->next=p2;
p2->next=NULL;
}
//输出每次排序后的情况,方便查找出错原因
for(p3=head;p3!=NULL;p3=p3->next)
printf("%d ",p3->data);
printf("\n |\n");
}
}
}
printf("最终结果为:\n");
for(p1=head;p1!=NULL;p1=p1->next)
printf("%d ",p1->data);
return 0;
}
鉴于本人是c语言新手,所以暂时只能想到这么笨的方法,而且可能程序还存在不少错误,还请各位大佬口下留情,对新手多一点关怀,另外也欢迎各位大佬对我进行批评指正!

本文介绍了如何使用C语言实现链表的选择排序算法。通过将链表分为三部分,不断调整各部分节点来达到排序目的。代码实现部分展示了作者作为C语言新手的尝试,尽管可能存在错误,欢迎读者提出宝贵意见。
2698

被折叠的 条评论
为什么被折叠?



