发布网友 发布时间:2022-04-23 02:06
共4个回答
热心网友 时间:2023-10-17 18:49
要先看懂这个程序的思路:
head指向排序好的链表头,p,q指向新的排序好的链表内的节点,
first指向旧的未排序的链表头,t指向当前要操作的节点。
for循环作用是定位要插入的位置,first=first->next;用于遍历旧的链表。
if else语句用于执行插入操作。
如果把first=first->next;放到后面的话,t已经被插入新链表,旧链表的节点就找不到了。
所以不可以。
另外补充:标准的链表插入排序不是这样子写的,网上搜一下有很多的,多参考下。追问不过即使t已经插入到新链表,它只是存储了first的值,first仍然指向原来的链表啊。for()语句后面的那个空语句符号您看到了吗?
另外说一下啊,这个我是在网上搜的,不知道这个标不标准就拿来了。能否给个标准的写法,学习一下,谢谢啦,如果答案可以,我可以追加分数。
追答当然看到最后的;了,如果t = first时for 循环结束,那么把t指向的节点插入新链表不就等价于把first指向的节点插入新链表吗?所以要在插入前更新first的值啊。感觉你还不是很理解整个程序的思路,在纸上画个图,一步步看一下。
至于标准的插入,或许我说夸张了吧,我也不是多么牛的人,就能说谁是标准。既然你要给个例子,那把我很久前写的一个插入排序拿出来吧,写的很ugly,献丑了。希望别贻笑大方。
//注意这个链表是带空头结点的。
List *insert_sort_list (List *head)
{
List *p = head->next;
List *q = head;
List *temp = NULL;
if (p->next == NULL)
return NULL;
else
{
while (p && p->next)
{
q = head;
/*查找插入位置*/
while (q->next->data next->data)
q = q->next;
/*如果要插入的位置不与原位置相同,则执行插入*/
if (q != p)
{
temp = p->next;
p->next = temp->next;
temp->next = q->next;
q->next = temp;
}
else
p = p->next;
}
}
return head;
}
热心网友 时间:2023-10-17 18:49
首先你要知道first是用来指向还没有排序的链表部分,还没有执行first=first->next的时候,t和first的值是相等的。当first=first->next放在if语句前面就可以在没有将t指向的结点与其后的还没有排序的结点断开之前用first来指向。如果first=first->next放在if后面,那么t之后的链表部分还没有用first来保存时已经断开了。这个时候再执行first=first->next的时候,first已经不是指向还没有排序的链表部分了。
热心网友 时间:2023-10-17 18:50
if(q==head)
{
t->next=head;
}
else
{
t->next=q;
}
注意看你代码里边对t->next进行了修改,而t=first,t和first共用一个地址,
所以再first=first->next; 此时的first=head或者first=q,所以跟你预期的不一样了。
热心网友 时间:2023-10-17 18:51
你所说的放在if语句后是指放在if和else之间还是else之后呢?对于你这个排序算法令人很难理解,给一个我的版本:
student *n1;
student *n2;
if(head->next == NULL)
return head;
if(head->next)
{
n1 = head;
while(n1)
{
n2 = n1->next;
while(n2)
{
if(n1->value > n2->value)
{
temp = n1->value;
n1->value = n2->value;
n2->value = temp;
}
n2 = n2->next;
}
n1 = n1->next;
}
}
return head;追问你不能理解吗?这个不是我自己写的,这是网上找的,可以通过编译,而且结果正常,我就是对于first=first->next为什么不能放在else 语句之后有疑问,放在if语句之前和放在else语句之后有什么区别吗?