有一个带头结点的单链表L,设计一个算法使其元素递增有序排列

书上的代码有点没看懂,希望高手解答,代码如下:
void sort(Linklist *&L)
{
LinkList *p=L->next, *q, *r;
if(p!=NULL)
{
r=p->next;
p->next=NULL;
p=r;
while(p!=NULL)
{ r=p->next;
q=L;
while(q->next!=NULL&&q->next->data<p->data)
q=q->next;
p->next=q->next;
q->next=p;
p=r;
}
}
}
这个代码段我觉得得不到递增排序的效果,比如说原来链表里存放的是1,3,4的话,我觉得运行完以后变成1,4,3

/* 插入排序法 */
void sort(Linklist *&L)
{
    LinkList *p=L->next, *q, *r;
    if(p!=NULL)
    {
        /* 把链表分成两条,一条已经排序好了(L),一条待排序(p)*/
        r=p->next;
        p->next=NULL;
        p=r;
        /* 对于所有待排序的元素 */
        while(p!=NULL)
        { 
            /*把p链表的第一个元素插入到L,并且将它从p中移除*/
            r=p->next;  //r指向p的第二个元素
            /* 找到合适的插入点 */
            q=L;
            while(q->next!=NULL && q->next->data < p->data)
                q=q->next;
            /* 在q后面插入p */
            p->next=q->next;
            q->next=p;
            /* 现在p的第一个元素已经被移到L中合适的位置了 */
            p=r;
        }
    }
}

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-11-26
没有问题,
while(q->next!=NULL&&q->next->data<p->data)
q=q->next;
是一个循环,一直跑到有序数组的最后,这个算法很抽象,我看了很久才懂。本回答被网友采纳
第2个回答  2018-08-02


第3个回答  2018-08-12
建议换本书,这书上的代码写的叫个啥玩意儿啊,什么p,q,r,L的,名字都不会起,一看就不是什么好书。
第4个回答  2019-03-14
void Insert(L, node){
var vNodeNext
for vCurNode in L{
if(vCurNode.Value >= node.Value){ //升序
//if(vCurNode.Value >= node.Value){ //降序
vNodeNext = vCurNode.Next
vCurNode.Next = Node
Node.Next = vNodeNext
exit
}
}
}
每次插入元素都通过这个insert插入
相似回答