把一个无序单链表排序,有的问题
把一个无序的单链表排序,变成递增,但是看了好久都不行啊,感觉应该是最后一个函数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;
}
}






