注册 登录
编程论坛 数据结构与算法

求:单链表排序

Alen0128 发布于 2010-05-24 12:41, 690 次点击
排序中,节点的插入处理不好,请高手发一个排序代码;最好注释详细一些,谢谢大家!!
2 回复
#2
2010-05-24 17:51
回复 楼主 Alen0128
楼主试试
#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;
}
#3
Alen01282010-05-25 13:11
回复 2楼 LegendofMine
好用!
1