有一个带头结点的单链表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插入

有一个带头结点的单链表L,设计一个算法使其元素递增有序排列
=NULL) { \/* 把链表分成两条,一条已经排序好了(L),一条待排序(p)*\/ r=p->next; p->next=NULL; p=r; \/* 对于所有待排序的元素 *\/ while(p!=NULL) { \/*把p链表的第一个元素插入到L,并且将它从p中移除*\/ r=p->next; \/\/r指向p的第二个元...

数据结构 设计一个算法判定一个带头结点的单链表的元素值是否递增的
基本思路:从首元(头结点指向的节点)开始,依次查看是此节点的数据否有下一个节点的数据大,如果存在一个节点的数据比下一个节点大,说明不是递增。反之如果考察到最后一个节点之前都比下一个节点小,那么就是递增 如果节点定义如下:typedef struct LNode{\/\/定义节点类型 ElemType data; \/\/数...

试写一算法在带头结点的单链表结构上实现线性表操作Length(L)。下面各...
intListLength_L(LinkList &L){int i=0;\/\/i存储链表长度,初始为0LinkList p=L;\/\/p为链表的指针,初始为头指针,指向头结点if(p) p=p-next;\/\/如果p指向的头结点不为空,p指向带数据的第一个结点while(p){\/\/如果p非空,i长度加1,且指向下一个结点p=p->next;i++;} return i;\/\/...

求设计一个算法,判断一个单链表中的各个结点是否有序,该如何做啊?
题2源程序如下:include<stdio.h> include<malloc.h> struct node{ int key;struct node *next;};void creat_link(struct node *);main(){ struct node *head=NULL;creat_link(head);} void creat_link(struct node *head_node){ struct node *p,*q,*Temp;int number;printf("Please input...

用C语言编写一个算法,实现有序链表的插入。链表有序且不允许有重复元素...
如代码所示,c++语言,设带头节点的单链表L是一个递增有序表,试写一个函数,将x插入L中,并使L仍是一个有序表。望采纳!

有一个线性表(a1,a2,...,an),采用带头结点的单链表L存储.设计一算法将...
\/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) *\/ \/* 操作结果:用e返回L中第i个数据元素的值 *\/ Status GetElem(LinkList L,int i,ElemType *e){ int j;LinkList p; \/* 声明一结点p *\/ p = L->next; \/* 让p指向链表L的第一个结点 *\/ j = 1; \/* j为计数...

设有一个表头为first的单链表,式设计一个算法,通过遍历一趟链表,将链 ...
算法思想 一次遍历链表,并将结点指针反转,在逆置的时候要注意单链表两端的处理(即表头结点和表尾结点)LinkList ReverseLinkList( LinkList L){ Lnode *p, *pre, *s;p = L -> next;s = p -> next;p -> next = NULL;\/\/处理第一个结点,指针指向NULL,因为逆置后它将是尾结点 wh...

试写一算法在带头结点的单链表结构上实现线性表操作LENGTH(L)
int length_l(linklist head){ linklist p=head;int i=0;while(p!=NULL){ i++;p=p->next;} return i;} 参考书上的正确答案,我也在学数据结构,加油啊!

数据结构:设计一个算法将一个带头结点的单链表A分解成两个带头结点的...
程序如下:include <stdio.h> include <stdlib.h> typedef struct node { char data;struct node *nextPtr;}*LinkList, Lnode;static void CreateList(LinkList *headPtr, LinkList *tailPtr, char ch);static void Decompose(LinkList *headPtrA, LinkList *headPtrB, LinkList *tailPtrB);sta...

编程完成一个带头结点的单链表建立,实现初始化、求表长、取元素、按值...
return 0;q=p->next;p->next=q->next;e=q->a;free(q);} void main(){ int e,i,n;List l1;struct node *p;printf("请输入要创建链表的大小:\\n");scanf("%d",&n);printf("请向链表中输入%d个整型数据:\\n",n);createList(l1,n);printf("当前链表为:\\n");...

相似回答