链表排序,本来想用双向链表用选择发排的后面发现只改值域的话没什么意义,全改的话实在太繁琐,最后就想到这种半投机的小办法啦,将链表的每一个节点用数组存~然后排序~最后再用这些排好的节点创建一个新的链表~虽然用到了数组,可是大体感觉还是可以的,就这样啦
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>

struct lian
{
 int a;
 struct lian *next;
};
struct lian *jian(int n,int x[1000])
{
 struct lian *head,*tail,*p,*s;
 int i;
 head=NULL;
 tail=NULL;
 p=(struct lian*)malloc(sizeof(struct lian));
 p->next=NULL;
 head=tail=p;
 for(i=0;i<n;i++)
 {
   s=(struct lian*)malloc(sizeof(struct lian));
    s->a=x[i];
    p->next=s;
    p=s;
 }
 p->next=NULL;
 return head;
}
struct lian *bian(struct lian *head,int n)
{
 int i,max,j,z;
 struct lian *p,*q,*s,*m[100];
  p=head->next;
  q=head->next;
 for(i=0;i<n;i++)
 {
  m[i]=p;
  p=p->next;
 }
 p=head->next;
 for(i=0;i<n;i++)
 {
  max=m[i]->a;
  for(j=i+1;j<n;j++)
  {
   if(max>m[j]->a)
   {
    max=m[j]->a;
    s=m[i];
    m[i]=m[j];
    m[j]=s;
   }
  }
 }
 head->next=m[0];
 p=head->next;
 for(i=1;i<n;i++)
 {
  p->next=m[i];
  p=m[i];
 }
 return head;
}
int main()
{
 int x[1000],i,a,b,n;
 struct lian *head,*p;
 scanf("%d",&n);
 for(i=0;i<n;i++)
 {
  scanf("%d",&x[i]);
 }
 head=jian(n,x);
 head=bian(head,n); 
 p=head->next;
 for(i=0;i<n;i++)
 {
  printf("%d ",p->a);
  p=p->next;
 }
 return 0;
}
 

发表评论

电子邮件地址不会被公开。

Post Navigation