C语言的链表的快速排序问题,答得好我多给分!!

发布网友

我来回答

3个回答

热心网友

问题1:如何交换left—>data和right—>data的值?
答:首先,定义一个交换函数,函数要用传引用调用(参数为指针变量),不能使用传值调用。
void swept(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
然后,调用这个函数: swept(left , right);
这样就实现了left->data和right->data的交换了。

问题2:如果left—>data比right—>data小,那指针应该怎么动?
答:要实现链表的排序,不是要移动指针,而是,改变那个指针地址所放的数字的数值,比如说,你发现left—>data比right—>data小,那就调用上面定义的swept(left,right)函数,来交换他们的值,这样其实就是实现了链表左边的值比右边的值大了。

问题3:按值查找时,找到后要怎么输出?
答:首先按值查找肯定要有循环的,循环体中肯定会有查找条件,条件肯定是用if表示的,那就在那个if语句里写输出语句就可以了,下面我简单模拟一下。
while(...)
{
if(y->data==要查找的数)
{
printf("%d",y->data);
}
}

基本上就这样了,呵呵,
链表的确是比较麻烦的一个东西,
不过我感觉以后用的不多,而且很多时候,我们根本没有想过它是链表,就想着它是很多连在一起的指针而已,考虑问题的角度都从指针出发就好了!

呵呵,祝你早点解决问题!
有问题的话,就留言,咱们再探讨!

热心网友

你这个定义的queue我不知道是什么东西。
我给你一个思路,首先,只要链表节点定义好了,链表自然就可以建立了,其实表示一个链表只需要一个节点的指针。比如一个节点可以表示成节点存储值,节点后节点指针,节点前节点指针等。
其次,由于要进行swap操作,所以最好定义成双向链表,否则单向链表在查找上一个节点时会耗时很多,也就是每个节点要保持上下两个节点的指针。
最后,回答你的问题,交换left和right的data的值,其实设计思想并不好,对于链表最好是更改节点之间的指针,也就是说,每交换一次,其实每个节点的值都没有变化,变化的只是它们的相对位置。具体来说,如果存在这样:
left1 left2 left3.... right1 right2 right3的双向链表结构,要交换left2和right2的位置,那么首先保存left2和right2的指针为pleft2,pright2,然后更改指针位置:left1的后节点指向right2,right1后指针指向left2,left2前指针指向right1,right2指针指向left1;保存left3,right3的指针为pleft3, pright3,left2的后节点指向right3, right2的后节点指向left3,left3的前节点指向right2,right3的前节点指向left2.至此交换完成。这样不管节点中保存有多大的数据结构,都只有指针交换的开销,而不会有其它开销。

至于你问的第二个问题,你找到了包含有检索值的节点p,直接用printf("%i",p->data);就可以打印出你需要的值,这里%i表示p->data是个整型。

另外我不知道你为什么需要print array函数,你这儿也没有数组。

热心网友

两点:

第一:l和r没有进行交换,只是单次的覆盖;这里可能不太好理解;
举例:
17 87 11 43 13 54 65

l指向17 r指向65
轴值是17
这时设立一个中间工作变量temp
把temp=l

然后从右到左进行扫描,找到一个比轴值小的数(这里是13)把13赋值给l
得:
13 87 11 43 ()53 65
然后重复上述过程,不过这次是从左网友找一个比轴值大的数填入“()”中。
即可。

第二:快速排序的算法用顺序表比较好实现。

但是因为你一定要用链表,那在查找时怎么找到他的前驱就是一个繁琐的任务了。 如果一定要用,必须使用双向链。
建议放弃链表。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com