#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");
}
选择排序(指针)
最新推荐文章于 2024-04-27 17:54:37 发布