选择排序法(链表)&(数组)

//数组实现

#include<stdio.h>
#include<stdlib.h>
#define N 8
void Sortarray(int *a)
{
 int i,j,k,t;
 for(i=0;i<N-1;i++){
  k=i;
  for(j=k+1;j<N;j++){
   if(a[k]>a[j]){//找到最小元素的下标
    k=j;
   }
  }
  t=a[i];//交换元素
  a[i]=a[k];
  a[k]=t;
 }
}
void Printarray(int *a)
{
 for(int i=0;i<N;i++)
 {
 printf("%5d",*(a+i));
 } 
}
int main()
{
 int i;
 int *a;
 a=(int *)malloc(N*sizeof(int));
 printf("Pleas input the s[i]:");
 for(i=0;i<N;i++)
 {
  scanf("%d",a+i);
 }
 Sortarray(a);
 Printarray(a);
 return 0;
 } 

//链表(降序) 头插法

#include<stdio.h>
#include<stdlib.h>
#define N 8 
typedef struct node{
 int data;
 struct node *next;
}ElemSN;
ElemSN *Createlink(int *a)
{
 ElemSN *h=NULL,*np;
 for(int i=N-1;i>=0;i--)
 {//逆向建链 
  np=(ElemSN *)malloc(sizeof(ElemSN));
  np->data=a[i];
  np->next=h;
  h=np;
 }
 return h;
}
ElemSN *Sortlink(ElemSN *head)
{
 ElemSN *q,*p,*pm,*qm,*h=NULL;
 while(head)
 {
  for(q=pm=head,p=head->next;p;q=p,p=p->next){
  if(p->data<pm->data)
  {//找到有最小值的结点
   pm=p;
   qm=q;
   
   } 
  }
  if(pm!=head)
  {//挂链
   qm->next=pm->next;
  }
  else{//挪头指针
   head=head->next;
  }//头插
  pm->next=h;
  h=pm;
 }
 return h;
 } 
void Printlink(ElemSN *head)
{
 ElemSN *p;
 for(p=head;p;p=p->next){
  printf("%d",p->data);
 }
}
int main()
{
 int i;
 int *a;
 ElemSN *head=NULL;
 a=(int *)malloc(N*sizeof(int));
 printf("Please input a[i]:");
 for(i=0;i<N;i++)
 {
  scanf("%d",a+i);
 }
 //创建链表 
 head=Createlink(a);
 //调用函数 
 head=Sortlink(head);
 //输出链表 
 Printlink(head);
 return 0;
}

//链表(升序) 尾插法

#include<stdio.h>
#include<stdlib.h>
#define N 8 
typedef struct node{
 int data;
 struct node *next;
}ElemSN;
ElemSN *Createlink(int *a)
{
 ElemSN *h=NULL,*np;
 for(int i=N-1;i>=0;i--)
 {//逆向建链 
  np=(ElemSN *)malloc(sizeof(ElemSN));
  np->data=a[i];
  np->next=h;
  h=np;
 }
 return h;
}
ElemSN *Sortlink(ElemSN *head)
{
 ElemSN *q,*p,*pm,*qm,*h=NULL,*tail;
 while(head)
 {
  for(q=pm=head,p=head->next;p;q=p,p=p->next){
  if(p->data<pm->data)
  {//找到最小值结点
   pm=p;
   qm=q;
   
   } 
  }
  if(pm!=head)
  {//挂链
   qm->next=pm->next;
  }
  else{//挪头指针
   head=head->next;
  }
  pm->next=NULL;//要尾插的结点指针域赋空
  if(!h)
  {//新头指针指上来
   h=tail=pm;
  }
  else{//挂链挪动指针
   tail=tail->next=pm;
  }
 }
 return h;
 } 
void Printlink(ElemSN *head)
{
 ElemSN *p;
 for(p=head;p;p=p->next){
  printf("%d",p->data);
 }
}
int main()
{
 int i;
 int *a;
 ElemSN *head=NULL;
 a=(int *)malloc(N*sizeof(int));
 printf("Please input a[i]:");
 for(i=0;i<N;i++)
 {
  scanf("%d",a+i);
 }
 //创建链表 
 head=Createlink(a);
 //调用函数 
 head=Sortlink(head);
 //输出链表 
 Printlink(head);
 return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_42727102/article/details/88809466
今日推荐