把一个无序单链表排序,有的问题
											把一个无序的单链表排序,变成递增,但是看了好久都不行啊,感觉应该是最后一个函数sort(代码的最后一个子函数)写得有问题,希望能改一下
程序代码:#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int datatype;
typedef struct node
{
    datatype data;
    struct node *next;
}listnode,*linklist;
void main()
{
    void init(linklist *head);
    int insert(linklist head,int i,datatype e);
    void display(linklist head);
    void sort(linklist head);
    datatype a[]={66,2,4,1,86,77,356,7};
    int i;
    linklist L;
    init(&L);
    for(i=1;i<=sizeof(a)/sizeof(a[0]);i++)
        if(insert(L,i,a[i-1])==0)
            return;
    printf("排序前的链表元素为:\n");
    display(L);
    sort(L);
    printf("排序后链表元素为:\n");
    display(L);
}
void init(linklist *head)
{
    if((*head=(linklist)malloc(sizeof(listnode)))==NULL)
        exit(-1);
    (*head)->next=NULL;
}
int insert(linklist head,int i,datatype e)
{
    listnode *p,*pre;
    int j;
    pre=head;
    j=0;
    while(pre->next!=NULL&&j<i-1)
    {
        pre=pre->next;
        j++;
    }
    if(j!=i-1)
        return;
    if((p=(linklist)malloc(sizeof(listnode)))==NULL)
        exit(-1);
    p->data=e;
    p->next=pre->next;
    pre->next=p;
    return 1;
}
void display(linklist head)
{
    listnode *p;
    p=head->next;
    while(p)
    {
        printf("%4d",p->data);
        p=p->next;
    }
    printf("\n");
}
void sort(linklist head)
/*排序*/
{
    listnode *p,*q,*t,*s;
    p=head->next;/*p指向第一个结点,q指向第二个结点,然后使第一个结点和头结果在链表中断开*/
    q=p->next;
    p->next=NULL;
    while(q->next!=NULL)
    {
        s=head->next;
        t=q->next;/*t指向准备插入结点的下一个结点*/
        while(s&&q->data>s->data)
        {
            p=s;
            s=s->next;/*找到插入位置,p指向插入位置的前一结点*/
        }
       
           
            q->next=p->next;/*把结点到适合位置插入*/
            p->next=q;
            q=t;
       
    }
}
   
    
										
					
	


											
	    

	

