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

我在做链表的排序,我想用快速排序的方法,但想了一个晚上,代码写了又改,改了又写,就是不行。哪位高手可以帮我一把。我已经定义好了:voidswap(LNode*i;LNod... 我在做链表的排序,我想用快速排序的方法,但想了一个晚上,代码写了又改,改了又写,就是不行。哪位高手可以帮我一把。我已经定义好了:
void swap(LNode *i;LNode *j)
{
LNode *temp;
temp = i;
i = j;
j = temp;
}
LNode *queue(LNode *h)
{
LNode *left;
LNode *right;
Lnode *p;

}
我疑问的地方在于如何交换left—>data和right—>data的值,还有,如果left—>data比right—>data小,那指针应该怎么动?是移动left还是right?
我还有个问题,就是在按值查找的时候,如果找到了,那么我要把这个值输出怎么输出,是用printf吗?要是用的话用在哪里?怎么用?是不是要定义一个print array(打印指针)的函数?
展开
 我来答
百度网友9f8e46d
2009-01-03 · TA获得超过147个赞
知道答主
回答量:25
采纳率:0%
帮助的人:31万
展开全部
问题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);
}
}

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

呵呵,祝你早点解决问题!
有问题的话,就留言,咱们再探讨!
百度网友3f1b5e1
2009-01-03 · TA获得超过537个赞
知道小有建树答主
回答量:505
采纳率:0%
帮助的人:627万
展开全部
你这个定义的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函数,你这儿也没有数组。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
青锋当舞
2009-01-03 · TA获得超过122个赞
知道答主
回答量:86
采纳率:0%
帮助的人:56.7万
展开全部
两点:

第一: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
然后重复上述过程,不过这次是从左网友找一个比轴值大的数填入“()”中。
即可。

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

但是因为你一定要用链表,那在查找时怎么找到他的前驱就是一个繁琐的任务了。 如果一定要用,必须使用双向链。
建议放弃链表。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式