链表的选择排序
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct _node{
int number;
struct _node *next;
}Node;
typedef struct{
Node *head;
Node *tail;
}List;
void add(List *plist)
{
int number;
bool first=true;
printf("input the number untill -1\n");
scanf("%d",&number);
while(number!=-1)
{
Node *p=(Node *)malloc(sizeof(Node));
p->number=number;
p->next=NULL;
if(first)
{
first=false;
plist->head->next=p;
plist->tail=p;
}
else{
plist->tail->next=p;
plist->tail=p;
}
scanf("%d",&number);
}
}
void print(List *plist)
{
Node *p;
for(p=plist->head->next; p; p=p->next)
printf("%d--",p->number);
printf("\n");
}
void clean_up(List *plist)
{
Node *p;
Node *q;
for( p=plist->head,q=NULL; p; p=q )
{
q=p->next;
free(p);
}
}
int list_len(List *plist)
{
Node *p;
int len=0;
for(p=plist->head->next; p ;p=p->next)
{
len++;
}
return len;
}
int list_min(Node *p)
{
Node *q;
int min=p->number;
for(q=p->next; q ; )
{
min=min<q->number?min:q->number;
p=q;
q=p->next;
}
return min;
}
void selectsort_list(List *plist)
{
Node *p;
Node *q;
plist->tail=plist->head;
int len;
len=list_len(plist);
int i;
int min;
bool first=true;
Node *t;
for( i=0 ; i<len ;i++ )
{
q=plist->tail;
p=plist->tail->next;
t=p;
first=true;
min=list_min(p);
while( p )
{
if(first && p->number==min)
{
plist->tail=p;
break;
}
if(p->number==min)
{
q->next=p->next;
p->next=plist->tail->next;
plist->tail->next=p;
plist->tail=p;
break;
}
q=p;
p=p->next;
first=false;
}
}
}
int main()
{
List list;
list.head=(Node *)malloc(sizeof(Node));
list.tail=NULL;
add(&list);
printf("in the outset the LIST is:\n");
print(&list);
selectsort_list(&list);
printf("now the LIST is:\n");
print(&list);
printf("%d",list.tail->number);
clean_up(&list);
}