问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

关于直接插入法对链表排序的问题,具体看下面:

发布网友 发布时间: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语句之后有什么区别吗?

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 女生多大后可以不在长身高? 如何不用软件把手机投屏到电脑上手机屏幕怎样投放到电脑上 战时拒绝、故意延误军事订货罪既遂的处罚? 战时故意延误军事订货罪处罚标准 片皮鸭的来历谁知道? 直接插入排序法。。高手进~ 求用直接插入法对一个链表进行升序排列的程序 折半插入排序和直接插入排序的区别 北京脆皮烤鸭简介? 2019篮球世界杯值得关注的球星有哪些?来画球迷指南为你盘点 插入排序法是什么?? 北京片皮鸭怎么做怎么好吃,正宗的片皮鸭教学 *五台音乐谁能给我一些像attraction AnthemVangelis 这种足球或篮球的振奋人心的歌曲 插入排序法的基本思想 北京片皮鸭的介绍 CBA篮球比赛的主题歌曲什么名字? 用程序实现直接插入法排序,折半插入法排序、起泡法算法排序 北京片皮鸭和广东片皮鸭有什么区别 乐视网播放的2014男篮世界杯决赛回放背景音乐叫什么名? 判断题 9, 直接插入排序算法是一种不稳定的排序算法。() 北京烤鸭 又名:(片皮鸭二吃)怎么做? 世界杯足球球员入场时播放的歌曲是什么? vb直接插入法排序 烤鸭系列之片皮鸭怎么吃? 北京片皮鸭是味道怎么样 要50字以上不超过70字 C语言,直接插入法。 学做北京片皮烤鸭需要多长时间? 北京片皮鸭的如何吃 北京片皮鸭的做法,有谁知道吗? 片皮鸭是北京烤鸭吗 苹果手机有红外功能不。? 什么叫颈椎反曲??是怎么一回事??就是驼背吗?它会引起些什么? 颈椎生理曲度反曲是什么意思 颈椎反曲是什么意思,应该怎么治疗怎么锻炼 颈椎生理曲度反弓,是什么意思 颈椎反曲是怎么形成的呀? 请问什么是颈椎生理曲度反弓 什么是颈椎呈反曲度?怎么办? 颈椎生理性曲度反曲什么意思 中国邮政包裹单号追踪 颈椎变直与反曲的区别 颈椎拍片显示:颈椎生理曲度反弓是什么意思 颈椎反弓 什么意思 我没有快递单号怎么能查到我寄的东西去哪了?