对单链表中元素按插入方法排序的C语言描述算法如下,其中L为链表头结点指针。请填充算法中标出的空白处。

typedef struct node
{int data; struct node *next;
}linknode,*link;
void Insertsort(link L)
{ link p,q,r,u;
p=L->next; (1)______;
while((2)________)
{ r=L; q=L->next;
while((3)________&& q->data<=p->data) {r=q; q=q->next;}
u=p->next; (4)______; (5)______; p=u;
}
}

答案是这样的,
(1) L->next=NULL
(2) p (或p!=NULL)
(3) q (或q!=NULL)
(4) p->next=r->next
(5) r->next=p
但是想不明白 L->next = NULL; 然后下面q = l -> next; 又没有更改L,那不是永远等于空了吗,然后进不了第二个循环呀,,能不能解读下,谢谢!!我是初学者,,
。。。还有木有人。。

这个算法有两个循环,我们姑且称其为外循环和内循环,诚如其他楼的一位网友所言,其内循环在第一次判断时进不去是正常的,但后面会进去。为什么呢?首先我们来理一下这个算法的大体思路:这是一个针对单链表的排序算法,就是说给定一个单链表,我们要把按照结点(这里不对头结点进行排序,即这里讨论的结点不包括头结点)的数据域中的data值的大小从小到大进行排序,得到新的排序后的有序链表。我们先把链表的头结点之后的部分链表拆下来,即p=L->next,L->next=NULL,这样我们就拆分原来的链表变成了现在的两个链表(我们称只有一个头结点的链表为L1,另一个全为数据项结点的链表为L2)。接下来我们一个一个从L2剥下单独的结点,放到L1中,其中如果L1中已经有数据项结点,则要先进行data项比较再找到合适的地方插入。直到最后L2中的结点全部拆下来并装到了L1上,于是排序完毕,此时的L1拥有与原来的单链表相同的头结点,但是排列有序的数据项结点。
理完了整个算法的思路后再回去看代码就很明显,外循环判断“p!=NULL”的意义在于判断L2链表中是否还有没有剥完的结点,而内循环中要先判断“q!=NULL”的第一层意义在于判断L1链表是不是一个只有头结点的空表(即无数据项结点),如果是,则直接插入,如果不是,则判断目前L1头结点的下一个结点q的data值是否小于等于刚从L2剥下来的结点p的data值,如果是,则说明这个p结点应该安放的位置还在q结点之后,我们还要继续往下找,直到找到q->data > p->data的结点q或者已经到了链表的末尾(这也是q!=NULL的第二层意义),则停止寻找,并将p结点就放在这个位置。
说了半天忘了回答楼主的疑问,为什么内循环永远不会进去吗?不是,只是第一次不会进去(当然,如果原单链表本身就是一个只有头结点的链表时那么后面也不会再进去了,因为空表根本不需要排序),而后面就会进去,具体原因见我上述分析即可知。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-04-15
既然是插入函数,除了有链表头应该还要有要插入的元素啊。
上面那个是书上的题目吗,搞不懂,用代码测试一下就可以了
typedef struct node
{
int data;
struct node *next;
}linknode,*link;
void Insertsort(link L,link node)
{
link befor,after;
//如果L是空链表,之间将node加在L后
if(L->next == NUll)
{
L->next = node;
node->next = NULL;
return;
}
//链表不为空
after=L->next;
while((2)after!=null)
{
//node插入中间的情况
if(node->data >= after->data)
{
befor = after;
after = befor->next;
}
else{
befor->next = node;
node->next = after;
return;
}

}
//node最大插入末尾情况
befor->next = node;
node->next = Null;
return;
}追问

。。。。不太懂。。

本回答被网友采纳
第2个回答  2018-12-19
你根据程序走一遍,第一次因为条件不满足,所以满足第一次的循环,跳过第二个循环,继续执行后面的步骤,后面的步骤不全部都在第二个while里面,画个图走一遍,第二次返回的时候就可以用了。
第3个回答  2016-10-23
你的问题解决了吗,,,我也不明白
第4个回答  2019-09-07
刚刚做到,看q=l→next前是不是有个r=l,后面是不是有个答案(5)r→next=p,就可以更改l啦