选择排序(指针)

#include<stdio.h>
#include<malloc.h>

typedef struct node{
	int num;
	struct node *next;
}Node, *NODE;

NODE Rank(NODE head);
void print(NODE head);

main(){
	NODE pt, head, tail, p;
	int i;
	/*先初始化一个有十个节点的链表,注意,
	头部有一个空的节点*/
	p = (NODE)malloc(sizeof(Node));
	p->next = NULL;
	head = tail = p;
	for(i=1; i<=10; i++){
		p = (NODE)malloc(sizeof(Node));
		p->next = NULL;
		printf("请输入第%d个节点的值:", i);
		scanf("%d", &p->num);
		tail->next = p;
		tail = p;
	}
	/*进入函数排序的不包含空节点,故head->next*/ 
	print(head->next);
	pt = Rank(head->next);
	print(pt);
		
} 

NODE Rank(NODE head){
	NODE first;//排列后有序链表的头指针
	NODE tail;//排列后有序链表的尾指针
	NODE p_min;//键值小的节点的前驱节点的指针
	NODE min;//存储最小的节点
	NODE p;//当前活动的指针
	
	first = NULL;
	
	while(head != NULL){
		
		/*此for循环的主要功能是找到链表中的一个最小键值的
		节点,用min记录,并用p_min记录该节点的前驱*/ 
		for(p=head, min=head; p->next!=NULL; p=p->next){
			if(p->next->num < min->num){
				p_min = p;
				min = p->next;
			}
		}
		
		/*下面的if,else语句将找到的最小节点放到
		一个新链表中*/ 
		if(first == NULL){
			first = min;
			tail = min;
		}
		else{
			tail->next = min;
			tail = min;
		}
		/*下面的if,else语句的功能是:确定找到的最小键值的节点
		是头节点与否,然后删除该节点*/ 
		if(min == head){
			head = head->next;
		}
		else{
			p_min->next = min->next; 
		}
	} 
	
	if(first != NULL){
		tail->next = NULL;
	}
	head = first;
	return head;	
}


void print(NODE head){
	NODE pt;
	if(head == NULL){
		printf("空表");
		return;
	}
	pt = head;
	while(1){
		printf("%3d", pt->num);
		if(pt->next == NULL) break;
		pt = pt->next;
	}
	printf("\n");
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值