还是那道程序填空,请大家看看做的对不对?
首先感谢大家的参与和帮助,上次经过大家的启发,经过昨夜的思考,终于想出了解答。(大概有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_____;
}