
楼主试试
#include <stdio.h>
#include <malloc.h>
typedef int ElemType;
typedef struct node
{
ElemType data;
struct node *next;
}LNode,*LinkList;
LinkList InitList()//链表初始化
{
LinkList L;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
return L;
}
void CreatList(LinkList L)//创造链表
{
ElemType x;
LinkList p,q;
p=L;
scanf("%d",&x);
while(x!=2012)
{
q=(LinkList)malloc(sizeof(LNode));
q->data=x;
p->next=q;
p=q;
scanf("%d",&x);
}
p->next=NULL;
}
void Sortlist(LinkList L)//排序
{
LinkList p,q,r,s;
p=L;
q=L->next;
r=q->next;
q->next=NULL;
//将原链表断成两截,用r指向插入元素。
while(r)
{
while(q&&q->data<r->data)
{
q=q->next;
p=p->next;
}
if(!q)// 若r->data比面链表元素都大,就接在最后。
{
s=r->next;//每次插入时,用s记录r的后继,完成插入后,将r指向s。
p->next=r;
q=r;
q->next=NULL;
r=s;
}
else//如果不比前面链表都大,就会插在p、q结点之间,p用来记入q的前驱,用于这中情况下的插入
{
s=r->next;
p->next=r;
r->next=q;
r=s;
}
p=L;
q=L->next;//每完成一次插入时,让p重新指向头结点,让q指向第一个结点。
}
}
void printlist(LinkList L)//打印各个结点
{
LinkList p;
p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}
int main()
{
LinkList L;
L=InitList();
CreatList(L);
printlist(L);
printf("\n");
Sortlist(L);
printlist(L);
return 0;
}