还是那道程序填空,请大家看看做的对不对?

rsy123 2002-08-29 08:55:47
首先感谢大家的参与和帮助,上次经过大家的启发,经过昨夜的思考,终于想出了解答。(大概有90%的可能性是对的,题目我打在下面)
其实这一道题是三道编程题中的第一道,难度应该不大。所以不要想的太复杂。
第一,确定EFG三个空格的答案无非就是p,last,return()等的组合。(不可能全为p或全为last)这一点大家都应该承认。
第二,这个涵数肯定有返回值,而且返回的应是排好序的第一个指针,所以G处应填return(p),而不是return(last)。
第三,既然G是return(p),那么E肯定是p,因为quicksort(low_head)返回的是排好序的第一个指针,这一点大家应该认同吧。所以E为p。
第四,最难就难在F上,有两位朋友前面和我一样,但F处填p或mid->tail->next。很可惜F处应填last。为什么呢?因为F后面一句是if (last==NULL) last=mid_tail;这句话暗示了答案,后面我会举例分析。请注意last是全程的指针变量。
第五,当执行quick_sort(p)时,比如说p只有一个数1,那么返回只有1,且last指向 1。这大家应该认同。
第六,当p为1,2时,执行的是quicksort(high_head);而此时的high_head为2,由五可得返回是2,也就是大的数,让last指向2,总的返回p,这样虽然没有进行指针交换,但由于原来的链接关系,所以还是正确的。也就是说quicksort(high_head);返回的是后一个数。
第七,当p为2,1时,调用的是quicksort(low_head);此时返回的是1,但要进行指针转换,last->link=mid_head;变为1,2,但由于p指向1,返回p还是正确的。
第八,大家一定要看出来,真正比较的只有两个数。last=quicksort(high_head);
if (last==NULL) last=mid_tail;
这两句话的意思就是使last指向最后一个数。
A:p!=NULL
B:high_tail->link=p;
C:mid_tail=p;
D:p=p->link;
E:p
F:last
G: return(p)

我已经准备写主程序上机调试,有结果一定通知大家。再次感谢大家的参与。



下面的程序对给定的链表p进行快速排序,与对顺序存储的线性表进行快速排序相类似,采用分治法进行处理,以链表第一个结点值作为基准,把其它结点按小于或大于基准结点值分为两组,再递归地对两组结点进行快速排叙,最后链接所有的链表。程序中last为全程的指针变量,它指向已排序链表的最后一个结点。


typedef struct node {int data;
struct node *link;
}NODE;
NODE *last;
NODE *quick_sort(p)
NODE *p;
{NODE *low_head,*low_tail,*mid_head,*mid_tail,*high_head,*high_tail;
if (p==NULL) {last=NULL;return(p);}
low_head=low_tail=NULL;
mid_head=mid_tail=NULL;
high_head=high_tail=NULL;
if (mid_head==NULL) mid_head=p; /*这句很奇怪*/
else mid_tail->link=p;
mid_tail=p;p=p->link;
while(___A___)
{if (p->data<mid_head->data)
{if (low_head==NULL) low_head=p;
else low_tail->link=p;
low_tail=p;
}
else if (p->data==mid_head->data)
{if (mid_head==NULL) high_head=p;
else _____B_____;
_____C_____;
}
else {if (high_head==NULL) high_head=p;
else high_tail->link=p;
high_tail=p;
}
____D____;
}
if (low_head!=NULL)
{low_tail->link=NULL;
____E____=quicksort(low_head);
last->link=mid_head; /*关键*/
}
else p=mid_head; /*关键,看不懂*/
if (high_head!=NULL) high_tail->link=NULL;
___F___=quicksort(high_head);
if (last==NULL) last=mid_tail;
____G_____;
}





...全文
27 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dlqcsdn 2002-09-02
  • 打赏
  • 举报
回复
up 是什么意思?
djniulihao 2002-09-01
  • 打赏
  • 举报
回复
UP
jtg98g3 2002-09-01
  • 打赏
  • 举报
回复
upup
greenboyz 2002-08-30
  • 打赏
  • 举报
回复
A:p!=NULL 判断链表是否结束
B:mid_tail->link=p; 将当前节点加入mid链上
C:last=mid_tail=p; 将mid_tail指向尾节点。 递归中last指向最后处理节点,即最后一层的mid_tail(在递归循环中,当p.size=1 时总能执行此句)
D:p=p->link; 链表指针后移,处理下个节点
E:p 指向返回链表p的头
F:mid_tail->link 将mid和排好序的high相连
G:return(p) 返回链表p
rsy123 2002-08-30
  • 打赏
  • 举报
回复
本题摘自复旦大学1997年数据结构与操作系统的考研题,应该不会错,而且我核对了五遍,周一给大家上机调试结果。
dlqcsdn 2002-08-29
  • 打赏
  • 举报
回复
to :rsy123 ()
你这个是什么题?考研的吗?我不知这题是在哪本参考书上的还是你自创,我觉得有些地方不对,比如:A:p!=NULL 和E:p 这两个选项,都肯定是用循环测试条件,但他们的意思是一样的,在程序之中也有死代码
你好好看看吧!
eion 2002-08-29
  • 打赏
  • 举报
回复
看来你的“Money”不少。

不过你的思路还是跟上次的差不多,到底对不对,随机生成一个链表不就OK了?

你还可以打印出每次的过程,对你理解有帮助

不过你想考研,请先认为自己做的一定没问题才用计算机来试,否则,想用这样的题来训练自己,机会很少的

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧