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