单链表实现选择排序

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

算法思路

单链表实现选择排序的方法有很多种,我的方法是将一个链表分为三部分:
第一部分 + 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语言新手,所以暂时只能想到这么笨的方法,而且可能程序还存在不少错误,还请各位大佬口下留情,对新手多一点关怀,另外也欢迎各位大佬对我进行批评指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值