#include<stdio.h> #include<stdlib.h> struct link { int data; struct link *next; }; struct link *invent(void); struct link *sort(struct link *head); void outp(struct link *head); int main() { struct link *head,*p; printf("创建一个链表。 "); head=invent(); p=head; outp(p); printf("排序后结果为: "); p=sort(head); outp(p); return 0; } struct link *invent(void) { struct link *head=NULL,*tail,*new; int n=0; while(1) { new=(struct link *)malloc(sizeof(struct link)); printf("请输入第%d个数据,输入-1结束:",n+1); scanf("%d",&new->data ); new->next =NULL; if(new->data==-1) { free(new); return head; } else { n++; if(n==1) { head=tail=new; } else { tail->next =new; tail=new; } } } } void outp(struct link *head) { while(head) { printf("%d ",head->data ); head=head->next ; } } struct link *sort(struct link *head) { struct link *tail,*p,*q; int temp=0; int flag=0; tail=head; while(tail->next !=NULL) /*给tail初始化,指向最后一个节点。*/ { tail=tail->next; } while(head!=tail) /*每循环一次,让tail指向它前面的结点,当tail=head时循环结束。*/ { p=head; /*记得每次都要初始化*/ while(p != tail) /*当p==tail时,再与p->next 便没有意义了。*/ { if(p->data > p->next->data ) /*满足条件,交换两个数据域数据*/ { temp=p->data ; p->data =p->next->data ; p->next->data =temp; flag=0; /*记录是否满足过条件*/ } q=p; /*q记录tail前面的结点位置*/ p=p->next ; } if(flag) /*优化(如果flag的值一直没有发生过改变,则表明已经排序好)*/ { break; } tail=q; /*tail指向前面一个节点*/ } return head; }
结构图:
直接交换结点的数据域数据就好,千万不要交换结点的位置,费力不讨好。